
UID2
贡献9 点
钻石7 个
C币993 个
|
逆向到 native 层,看不懂 ARM 汇编就等于看天书。这篇把最核心的指令和概念讲清楚。
一、为什么是 ARM
手机和平板几乎全是 ARM 架构。你在 IDA 里打开一个 so 库,看到的就是 ARM 汇编。ARM 有两种模式:ARM(32 位,4 字节定长指令)和 Thumb(16/32 位混合,省空间)。ARM64(AArch64)是现在主流,全是 4 字节定长指令。
二、寄存器
ARM64 有 31 个通用寄存器(X0-X30),每个 64 位:
- X0-X7:函数参数和返回值。X0 是第一个参数,也是返回值
- X8-X18:临时寄存器,函数内随便用
- X19-X28:被调用者保存寄存器,函数用之前必须压栈保存
- X29:帧指针(FP),指向当前栈帧
- X30:链接寄存器(LR),存函数返回地址
- SP(X31):栈指针,指向栈顶
三、核心指令
- MOV:数据搬运
- MOV X0, #42 ; X0 = 42
- MOV X1, X0 ; X1 = X0
复制代码
- LDR / STR:内存读写
- LDR X0, [X1] ; 从X1指向的地址读8字节到X0
- LDR X0, [X1, #8] ; 从X1+8的地址读
- STR X0, [X1] ; 把X0写到X1指向的地址
复制代码
- BL / RET:函数调用和返回
- BL func_name ; 跳转到func_name,返回地址存LR
- RET ; 跳回LR指向的地址(函数返回)
复制代码
- CMP + B.cond:比较和条件跳转
- CMP X0, #0 ; 比较X0和0
- BEQ label ; 如果相等(X0==0)跳转到label
- BNE label ; 如果不等跳转
- BLT label ; 小于跳转
- BGT label ; 大于跳转
复制代码
- ADD / SUB:加减
- ADD X0, X1, X2 ; X0 = X1 + X2
- ADD X0, X1, #10 ; X0 = X1 + 10
- SUB X0, X1, X2 ; X0 = X1 - X2
复制代码
- EOR:异或(加密常见)
- EOR X0, X1, X2 ; X0 = X1 ^ X2
复制代码
四、函数调用约定
ARM64 调用约定:
- 参数 1-8 放 X0-X7,超过 8 个压栈
- 返回值放 X0
- X19-X28 被调用者负责保存恢复
- SP 必须 16 字节对齐
五、实战:看懂一个加密函数
IDA 反编译可能不完整,直接看汇编:- ; JNI函数入口,env=X0, thiz=X1, input=X2
- SUB SP, SP, #32 ; 开辟栈空间
- STP X29, X30, [SP] ; 保存FP和LR
- MOV X29, SP ; 设置帧指针
- ; 获取字符串
- LDR X3, [X0] ; X3 = *env (JNIEnv函数表)
- LDR X4, [X3, #0x568] ; X4 = GetStringUTFChars函数指针
- BLR X4 ; 调用,input的C字符串返回到X0
- MOV X5, X0 ; X5 = 字符串指针
- ; 加密:逐字符异或0x37
- MOV X6, #0 ; i = 0
- loop:
- LDRB W7, [X5, X6] ; W7 = str[i]
- CMP W7, #0 ; 字符串结尾?
- BEQ done
- EOR W7, W7, #0x37 ; W7 ^= 0x37
- STRB W7, [X5, X6] ; str[i] = W7
- ADD X6, X6, #1 ; i++
- B loop
- done:
- MOV X0, X5 ; 返回加密后的字符串
- LDP X29, X30, [SP] ; 恢复FP和LR
- ADD SP, SP, #32 ; 释放栈空间
- RET
复制代码
看懂了这个你就知道:加密逻辑就是逐字符异或 0x37。用 Python 复现:- decrypted = ''.join(chr(ord(c) ^ 0x37) for c in encrypted)
复制代码

ARM 汇编的核心就这些。不需要全背下来,记住 LDR/STR(读写内存)、BL/RET(调用返回)、CMP/B.cond(条件跳转)、MOV(赋值)这四组就够看懂大部分逻辑了。遇到看不懂的指令查 ARM 官方手册就行。 |
温馨提示:
1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
6、网络世界也请遵守我国的法律法规!一旦发现违法行为,将立即封存相关信息并报警处理!
|