iOS--逆向

OC 反汇编

2018-07-13  本文已影响3人  Superman168

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 打印结果

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.png

dyld (dynamic load linker) 动态库连接器 在程序运行起来时,会把 Mach-o 以及依赖的动态库都会装载进内存。

PAGEZERO 虚拟空间

真实的起始位置:

代码段

跟随代码段:

data 段

程序运行起来,image list ——> Mach-O 文件的地址即为 ASLR 偏移的地址,随机值。

内存中其实不存在 header 和 loadcommands

b -a ASLR 的值 + 需要调试的方法静态地址(Mach-O 文件地址) 即可 进行调试。

也可用于 符号表的回复。

p &变量 ——》 打印变量的地址 1

image list 查看 Mach-O 首地址 2 即 ASLR 地址

变量的内存地址则为:地址1 — 地址2

程序每次运行,会先找到方法的名称,然后通过方法的名称,找到方法的实现(IMP),OC 方法的调用就相当于查表:

Symbol table

通过 符号表,查找SEL 的 “sel” 和方法的实现 IMP “内存地址” 是一一对应的关系。

image.png
上一篇下一篇

猜你喜欢

热点阅读