当前位置:   article > 正文

【iOS安全】iOS ARM汇编

【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
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号