• 【iOS安全】iOS ARM汇编


    mov指令

    MOV X22, X0
    将X0的值移到X22中

    参数传递

    参数1:寄存器X0传递
    参数2:寄存器X1传递
    参数3:寄存器X2传递
    参数4:寄存器X3传递
    (这里的X0传递的就是第一个实际参数,而不是self、selector之类的)

    如果需要传递更多参数,会使用栈来传递

    返回值

    ARM架构下,通常使用X0来存储返回值

    ADRP指令

    ADRP(Address of PC-relative Data)指令是ARM指令集中的一条指令,用于将指定的绝对地址的高16位(即地址的页索引)左移12位(乘4096,页大小)后存储到目标寄存器中

    ADRP指令和LDR指令

    ADRP指令通常与LDR指令结合使用

    例如

    ADRP X8, #classRef_CDVInvokedUrlCommand@PAGE
    LDR X0, [X8,#classRef_CDVInvokedUrlCommand@PAGEOFF]
    
    • 1
    • 2

    这两行代码的作用是 CDVInvokedUrlCommand 类的引用地址classRef_CDVInvokedUrlCommand加载到 X0 寄存器

    通常,后续会将X0 作为一个参数,最终传递给_objc_msgSend函数,让_objc_msgSend的第一个参数就是X0的值,这样后面就可以调用CDVInvokedUrlCommand这个类的某个函数

    (1) ADRP X8, #classRef_CDVInvokedUrlCommand@PAGE
    将 classRef_CDVInvokedUrlCommand 类的引用地址的高16位存储到 X8 中

    • ADRP 用于将指定的绝对地址的高16位(即地址的页索引)左移12位(乘以4096,页大小)后存储到目标寄存器中
    • # 表示后面的操作数是一个立即数
    • classRef_CDVInvokedUrlCommand@PAGE 是一个标签,表示类的引用地址的高16位
      • PAGE 表示取地址的高16位

    (2) LDR X0, [X8,#classRef_CDVInvokedUrlCommand@PAGEOFF]
    从基址为X8,偏移量为 classRef_CDVInvokedUrlCommand 的低16位的地址处,加载一个值到 X0

    • LDR 从地址取值
    • classRef_CDVInvokedUrlCommand@PAGEOFF 是一个标,表示类的引用地址的低16位
      • PAGEOFF 表示取地址的低16位

    完整的使用例如:

    ;00000001002FE1D8
    ADRP            X8, #classRef_CDVInvokedUrlCommand@PAGE
    LDR             X0, [X8,#classRef_CDVInvokedUrlCommand@PAGEOFF] 
    MOV             X2, X21
    BL              sub_101FFCD40
    MOV             X20, X0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其中,此时X1是当前函数的Selector(记作selector2), X2来自X21 是一个局部变量(记作ScriptMessage_body2),X20记作v16
    那么这里就相当于

    v16 = sub_101FFCD40(&OBJC_CLASS___CDVInvokedUrlCommand, selector2, ScriptMessage_body2);
    
    • 1

    我们G到101FFCD40处看看sub_101FFCD40是什么

    ;0000000101FFCD40
    ADRP            X1, #selRef_commandFromJson_@PAGE
    LDR             X1, [X1,#selRef_commandFromJson_@PAGEOFF]
    ADRP            X16, #_objc_msgSend_ptr@PAGE
    LDR             X16, [X16,#_objc_msgSend_ptr@PAGEOFF]
    BR              X16
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    同上,不再赘述,这里相当于

    return _objc_msgSend(&OBJC_CLASS___CDVInvokedUrlCommand, "commandFromJson:", ScriptMessage_body2);
    
    • 1

    (貌似传给sub_101FFCD40的参数2 selector2直接被弃用了,没用上,我猜是编译器优化时发现没必要动X1,所以就直接传下来了)

    类似于

    return [CDVInvokedUrlCommand commandFromJson:ScriptMessage_body2];
    
    • 1

    也就是

    return CDVInvokedUrlCommand.commandFromJson(ScriptMessage_body2);
    
    • 1
  • 相关阅读:
    MySQL数据类型
    centos7升级openssl_3
    20241028软考架构-------软考案例7答案
    Python堆栈详细介绍
    java基于springboot中小企业合同管理系统
    LeetCode:1929.数组串联
    Python宿舍管理系统毕业设计源码231642
    侧边栏的文章分类、热门文章和热门文章的展示(Go 搭建 qiucode.cn 之九)
    【iOS开发】-UIPickerView
    深度学习入门(6) - 3DV 三维视觉
  • 原文地址:https://blog.csdn.net/qq_39441603/article/details/138015932