1、代码的编译过程
1.1、编译
1.2、反编译
机器语言可以反编译成汇编语言,因为在同一种架构平台下,每一条汇编指令都有与之对应的唯一的机器指令。但是汇编无法反编译成OC语言,因为不同的OC代码编译出来的汇编代码可能是一致的,比如下面两段OC代码,编译后的汇编代码一致:
unsigned int x = 10;
unsigned int y = 10;
unsigned int z = x + y;
NSLog(@"z = %d", z);
int a = 10;
int b = 10;
int c = a + b;
NSLog(@"c = %d", c);
0x100003f2b <+27>: movq %rax, -0x28(%rbp)
0x100003f2f <+31>: movl $0xa, -0x14(%rbp)
0x100003f36 <+38>: movl $0xa, -0x18(%rbp)
0x100003f3d <+45>: movl -0x14(%rbp), %eax
0x100003f40 <+48>: addl -0x18(%rbp), %eax
0x100003f43 <+51>: movl %eax, -0x1c(%rbp)
0x100003f46 <+54>: movl -0x1c(%rbp), %esi
0x100003f49 <+57>: leaq 0xb8(%rip), %rdi
0x100003f50 <+64>: movb $0x0, %al
0x100003f52 <+66>: callq 0x100003f68
2、Hopper Disassembler
Hopper Disassembler 能够将Mach-O文件的机器语言代码发编译成汇编代码,OC伪代码或者Swift伪代码。比如查看可执行文件iOSDemo:
在汇编代码处右键选择 References to selector XXX 可以查看有哪些地方引用了此方法:
快捷键:Shift + Option + X
除了可执行文件外,Hopper还可以查看其它类型的Mach-O文件,例如系统的动态库UIKitCore: