OC 反汇编
OC block 汇编
在 main 方法中,写一个最简单的 Block:
void (^block)(void) = ^(){
NSLog(@"block");
};
block();
汇编
image.png打印 isa 指针:
image.png可以看到为一个 全局的 Block,定义并赋值。
堆 Block 引用外部变量
栈 Block 定义未赋值。StackBlock
OC 方法 反汇编
Person *p = [[Person alloc] init];
objc_msgSend(Person.class, @selector(alloc))
image.png
打印结果
- objc_storeStrong
oc中用strong修饰一个对象,实际上是调用了
void objc_storeStrong(id *location, id obj)
函数,location是引用对象的指针的地址,obj是对象本身。下面是该函数的完整实现:
void objc_storeStrong(id *location, id obj)
{
id prev = *location;
if (obj == prev) {
return;
}
objc_retain(obj);
*location = obj;// C语言中让一个指针指向一个对象 加 * 取值
objc_release(prev);
}
实现很简单,首先和之前的引用相比判断是不是同一个引用,是的话就return;否则的话就对obj对象进行retain,并且释放location之前的引用(也就是说location指针不再指向之前的对象,要把之前对象引用计数减1)。
ASLR
ASLR (Address Space Layout Randomization),即地址空间随机布局。
大部分主流的操作系统都已实现了 ASLR,以防范对已知地址进行恶意攻击。iOS 从 4.3 开始支持 ASLR,Android 从 4.0 也支持了 ASLR 机制。
即每次运行都不一样,都会生成一个新的数据,动态调试,方可得到。
可以看下代码段 的虚拟空间地址,地址 4294967296 即为 1 0000 0000 64 位 4 个GB.
image.pngdyld (dynamic load linker) 动态库连接器 在程序运行起来时,会把 Mach-o 以及依赖的动态库都会装载进内存。
PAGEZERO 虚拟空间真实的起始位置:
代码段跟随代码段:
data 段程序运行起来,image list ——> Mach-O 文件的地址即为 ASLR 偏移的地址,随机值。
内存中其实不存在 header 和 loadcommands
- 调试计算方法
b -a ASLR 的值 + 需要调试的方法静态地址(Mach-O 文件地址) 即可 进行调试。
也可用于 符号表的回复。
- Mach-O 中 查找变量的值:
p &变量 ——》 打印变量的地址 1
image list 查看 Mach-O 首地址 2 即 ASLR 地址
变量的内存地址则为:地址1 — 地址2
- 程序运行
程序每次运行,会先找到方法的名称,然后通过方法的名称,找到方法的实现(IMP),OC 方法的调用就相当于查表:
Symbol table通过 符号表,查找SEL 的 “sel” 和方法的实现 IMP “内存地址” 是一一对应的关系。
image.png