OC 反汇编

作者: Superman168 | 来源:发表于2018-07-13 19:10 被阅读3次

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

    dyld (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

    相关文章

      网友评论

        本文标题:OC 反汇编

        本文链接:https://www.haomeiwen.com/subject/cwxspftx.html