Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(五)

在这里插入图片描述

概览

我们在上一篇

博文中“一头扎入”系统底层,从汇编语言的角度详细介绍了 iOS 运行时(Runtime)方法调用栈的跟踪、以及如何恣意更改方法调用链走向等理论知识。
在这里插入图片描述

“纸上来得终觉浅,绝知此事要躬行”,而在本篇我们就来实际拥抱汇编代码,“撸起袖子秀上一波”吧。

这是本系列最后一篇文章,我们的大冒险已接近尾声,收官之战就在眼前!

那小伙伴们怎能止步不前呢?让我们马上圆满本次探险之旅吧!

Let’s put an end to it!!!😉


8. 走进 ARM64 汇编的世界

承接上一篇博文,我们首先新建一个汇编源代码文件,文件后缀应该为 .s。


Xcode 对汇编语法的支持实在“强差人意”,如果可能的话大家可以找一个优秀的汇编代码编辑器。

比如 Sublime Text 或 VS Code 等都是优选。


将下面的代码“塞入”新建的汇编源代码文件里:

.text
    .globl  _asm_test
    .p2align 2
_asm_test:
    // 申请堆栈空间并保存 fp、lr 寄存器
    sub    sp, sp, #0xF0
    stp    x29, x30, [sp, #0xE0]
    add    x29, sp, #0xE0
    // 保存任何可能被覆写的寄存器
    str    x0,[x29, #-0x8]
    str    x1,[x29, #-0x10]
    str    x2,[x29, #-0x18]
    str    x3,[x29, #-0x20]
    str    x4,[x29, #-0x28]
    str    x5,[x29, #-0x30]
    str    x6,[x29, #-0x38]
    str    x7,[x29, #-0x40]
    str    x8,[x29, #-0x48]
    str    x9,[x29, #-0x50]
    str    x10,[x29, #-0x58]
    str    x11,[x29, #-0x60]
    str    x16,[x29, #-0x68]
    str    x20,[x29, #-0x70]
    // 施展我们的“精细外科手术”:将 thunk() 中返回地址改为原地址后两条指令的地址
    ldr    x1,[x29]
    add    x1,x1,#0x8
    ldr    x0,[x1]
    add    x0,x0,#0x8
    str    x0,[x1]
    
    /* 
        拓展功能,待实现
    */

    // 平衡 thunk() 中原来 swift_retain() 方法的调用
    ldr    x16,[x29, #-0x68]
    ldr    x0,[x29, #-0x70

最近更新

  1. TCP协议是安全的吗?

    2024-04-03 01:44:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-03 01:44:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-03 01:44:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-03 01:44:03       18 阅读

热门阅读

  1. Linux常用命令2

    2024-04-03 01:44:03       10 阅读
  2. mysql故障及解决分析

    2024-04-03 01:44:03       11 阅读
  3. 多线程常识相关

    2024-04-03 01:44:03       13 阅读
  4. js根据开始和结束时间进行搜索

    2024-04-03 01:44:03       13 阅读
  5. 题目:学习使用auto定义变量的用法

    2024-04-03 01:44:03       15 阅读
  6. os模块篇(六)

    2024-04-03 01:44:03       11 阅读
  7. Python实现逻辑回归(Logistic Regression)

    2024-04-03 01:44:03       14 阅读