【Android 逆向】【ARM汇编】 函数的栈帧

1. 函数的调用约定

ARM32 参数1-4   放入r0-r3 剩下的入栈,函数返回值放入r0
ARM64 参数1-8   放入X0-X7 剩下的入栈,函数返回值放入X0
(浮点数是放入 Dn 或 Sn)

2. ARM 指令的 堆栈平衡

      var_4 = -4 ; IDA 生成的变量信息,方便阅读用
STMFD SP!, {R11, LR} 保存上一个函数的寄存器现场
MOV   R11, SP        ARM指令使用R11作为栈底
SUB   SP, SP, #0x38  满减提升堆栈,用于保存当前函数的局部变量和临时变量

MOV R0, #0
STR R0, [R11, #var_4]  ; 相当于 int x = 0  R11 是栈底,作为标准,在上面减一个值作为变量

MOV   SP, R11        SP重新回到栈底,释放当前函数堆栈
LDMFD SP!, {R11, LR} 恢复寄存器

3. Thumb指令的 堆栈平衡

   var_C = -0xC
PUSH  {R4, R6, R7, LR}
ADD R7 , SP, #8      ; Thumb 只用R7 作为栈底,这里是生成当前函数的栈底
SUB SP, SP, #0x70    ; 满减提升堆栈,用于保存当前函数的局部变量和临时变量

LDR R4, [R4]
STR R4, [SP, #0x78+var_C]  ; (当作基值即可)0x78 = #8 + #0x70 ,而-0xC 刚好往上数三格作为第一个元素,前两格为R6,R4的值


ADD SP, SP, #0x70
POP {R4, R6, R7, PC} ; 栈帧平衡,恢复现场,这里把原LR的值给了PC,相当于回到调用函数继续执行
posted @ 2023-03-13 17:07  明月照江江  阅读(143)  评论(0编辑  收藏  举报