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

android,逆向,arm,汇编,函数 · 浏览次数 : 46

小编点评

| Register | Value | |:------------:|------------:| | r0 | 0x00000000 | | r1 | 0x00000001 | | r2 | 0x00000002 | | r3 | 0x00000003 | | r4 | 0x00000004 | | r5 | 0x00000005 | | r6 | 0x00000006 | | r7 | 0x00000007 | | r8 | 0x00000008 | | r9 | 0x00000009 | | r10 | 0x0000000A | | r11 | 0x0000000B | | r12 | 0x0000000C | | r13 | 0x0000000D | | r14 | 0x0000000E | | r15 | 0x0000000F | | r16 | 0x00000010 | | r17 | 0x00000011 | | r18 | 0x00000012 | | r19 | 0x00000013 | | r20 | 0x00000014 | | r21 | 0x00000015 | | r22 | 0x00000016 | | r23 | 0x00000017 | | r24 | 0x00000018 | | r25 | 0x00000019 | | r26 | 0x0000001A | | r27 | 0x0000001B | | r28 | 0x0000001C | | r29 | 0x0000001D | | r30 | 0x0000001E | | r31 | 0x0000001F | | r32 | 0x00000020 | | r33 | 0x00000021 | | r34 | 0x00000022 | | r35 | 0x00000023 | | r36 | 0x00000024 | | r37 | 0x00000025 | | r38 | 0x00000026 | | r39 | 0x00000027 | | r40 | 0x00000028 | | r41 | 0x00000029 | | r42 | 0x0000002A | | r43 | 0x0000002B | | r44 | 0x0000002C | | r45 | 0x0000002D | | r46 | 0x0000002E | | r47 | 0x0000002F | | r48 | 0x00000030 | | r49 | 0x00000031 | | r50 | 0x00000032 | | r51 | 0x00000033 | | r52 | 0x00000034 | | r53 | 0x00000035 | | r54 | 0x00000036 | | r55 | 0x00000037 | | r56 | 0x00000038 | | r57 | 0x00000039 | | r58 | 0x0000003A | | r59 | 0x0000003B | | r60 | 0x0000003C | | r61 | 0x0000003D | | r62 | 0x0000003E | | r63 | 0x0000003F |

正文

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,相当于回到调用函数继续执行

与【Android 逆向】【ARM汇编】 函数的栈帧相似的内容:

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

1. 函数的调用约定 ARM32 参数1-4 放入r0-r3 剩下的入栈,函数返回值放入r0 ARM64 参数1-8 放入X0-X7 剩下的入栈,函数返回值放入X0 (浮点数是放入 Dn 或 Sn) 2. ARM 指令的 堆栈平衡 var_4 = -4 ; IDA 生成的变量信息,方便阅读用 STM

【Android 逆向】【ARM汇编】 arm64部分知识

arm64寄存器更多 X0-X30 SP CPSR PC 64位 W0-W30 32位 PC寄存器的值禁止修改 参数放在 X0-X7/W0-W7 结果放在 X0 函数返回 RET 相当于 bl lr Arm64 没有LR寄存器, lr用X30 栈底用X29 ARM64 取消了ldm/stm push

【Android 逆向】【ARM汇编】 事前更新和事后更新

1. 事前更新,事后更新,不更新 不更新 ldr R4, [R1, R2, lsl #1] 相当于 R4 = *(R1 + R2 << 2^1) 之后 R1、R2的值时没有变化的 事前更新(! 的含义)(++i 的感觉) ldr R0, [R1, #4]! 加了感叹号 执行完这一句后 R1的值也是随

【Android 逆向】【ARM汇编】 堆栈

arm 四种栈 1 空栈 栈指针指向空位,每次存入时可以直接存入然后栈指针移动一格;而取出时需要先移动一格才能取出 2 满栈 栈指针指向栈中最后一格数据。每次存入时需要先移动栈指针一格再存入。取出时可以直接取出,然后再移动栈指针 3 增栈 栈指针移动时向地址增加的方向移动的栈 4 减栈 栈指针移动时

【Android 逆向】【ARM汇编】 全局资源重定位

资源重定位解释: 字符串反汇编代码解释: .rodata:00001E20 __exidx_end DCB "a + b = %d" ; DATA_XREF: main+28^o .rodata 所在段名 00001E20 偏移地址 __exidx_end IDA 给的一个字符串名称 DCB IDA

【Android逆向】frida 破解 jwxdxnx02.apk

apk 路径: https://pan.baidu.com/s/1cUInoi 密码:07p9 这题比较简单,主要是用于练习frida 1. 安装apk到手机 需要输入账号密码 2. 使用jdax 查看apk package hfdcxy.com.myapplication; import andr

[Android逆向]Exposed 破解 jwxdxnx02.apk

使用exposed 遇到了一些坑,这里记录一下 源码: package com.example.exposedlesson01; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.X

[Android 逆向]frida 破解 切水果大战原版.apk

1. 手机安装该apk,运行,点击右上角礼物 提示 支付失败,请稍后重试 2. apk拖入到jadx中,待加载完毕后,搜素失败,找到疑似目标类MymmPay的关键方法payResultFalse 4. adb logcat 或者androidstudio 查看该进程的日志,发现以下日志 com.mf

[Android 逆向]Xposed 破解 切水果大战原版.apk

代码 public class Main implements IXposedHookLoadPackage { boolean flag = false; @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam

【Android逆向】frida 破解 滚动的天空

1. apk 安装到手机中 2. 玩十次之后,会提示 充值 3. adb shell dumpsys window | grep mCurrentFocus 查看一些当前activity是哪一个 是 AppActivity 4. 阅读代码,感觉是unity3d做的游戏 5. apk拖入到jadx中,