iOS逆向篇-Clang交叉编译

tech2023-12-03  30

本篇我们的目标是在iPhone上运行arm64,C语言,C++和OC程序!

Clang 对于iOS开发者来说,Clang编译器一点也不陌生,Clang是一个C语言、C++、Objective-C、C++语言的轻量级编译器。源代码发布于BSD协议下,是基于LLVM的,也是Xcode 第一的编译器。交叉编译 指在一个平台上生成另一个平台上的可执行代码。现在我们就在Mac上写代码,在iPhone上运行,想想都刺激!设备环境 使用的是Mac和越狱iOS13.2.2的iPhoneX

Arm64

新建一个hello.txt文本把下面代码复制进去,保存退出 .extern _printf .align 4 .text .global _main _main: stp x29, x30, [sp,#-0x10]! ;保存 x29 和 x30 寄存器到栈,!用来控制基址变址寻址的最终新地址是否进行回写操作 mov x29, sp ;将 sp 寄存器放入 x29 寄存器 sub sp,sp,#0x20 ;分配栈空间 adr x0,msg ;第一个参数 bl _printf add sp,sp,#0x20 ;释放栈空间 mov sp,x29 ;将 x29 给 sp ldp x29,x30,[sp],0x10 ;出栈给 x29 和 x30 ret ;返回 msg: .asciz "Hello,world!\n" ; data段有一个标号msg,代表字符串"Hello,world!\n"的首地址,类型为.asciz的字符串 改文本后缀,改为hello.asm文件打开终端,使开始编译 1、查看sdk安装路径 $xcrun --sdk iphoneos --show-sdk-path 2、clang编译 clang -arch arm64 -isysroot "sdk" -o hello hello.asm // "-arch arm64" 指定框架 // " -isysroot" 指定sdk // "-o" 输出目标文件 签名,在iOS系统中运行程序需要代码签名,所以要增加一个签名步骤。 a.新建ent.plist b.把下面代码复制进去,保存在hello.asm同一目录下 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>platform-application</key> <true/> <key>com.apple.springboard.debugapplications</key> <true/> <key>run-unsigned-code</key> <true/> <key>get-task-allow</key> <true/> <key>task_for_pid-allow</key> <true/> </dict> </plist> 对hello文件进行签名 codesign -s - --entitlements ent.plist -f hello

把签名后的hello文件拷进iPhone的/usr/bin/目录下,好像很多目录下都可以的 scp hello root@192.168.0.170:/usr/bin

运行hello文件,完美!

----------------------华丽的分割线------------------------

c语言

新建1.txt复制代码保存,文件改为1.c #include <stdio.h> int main() { printf("C:Hello, World! \n"); return 0; } 编译签名

拷贝到iPhone上,运行, 完美!

----------------------华丽的分割线------------------------

Object-C

新建2.txt复制代码保存,文件改为2.m #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"OC:Hello World!"); } return 0; } 编译签名 oc的编译有点不一样,因为导入了foundation框架,在Clang编译的时候需要指定一下 clang -arch arm64 -framework Foundation -isysroot "sdk" 2.m -o 2

拷贝到iPhone上,运行, 完美!

----------------------华丽的分割线------------------------

C++

新建3.txt复制代码保存,文件改为3.cpp #include <iostream> using namespace std; int main() { cout << "C++:Hello, world!" << endl; return 0; }

编译签名 因为clang完美兼容g++,gcc,所以一些命令可以完美继承!

拷贝到iPhone上,运行, 完美!

----------------------华丽的分割线------------------------

好了,今天的代码就敲到这里了,更多Clang的用法可以去看看文档。 文档:http://clang.llvm.org/docs/UsersManual.html

最新回复(0)