版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Rozol/article/details/79816847
工具 IDA Pro
本文由 Luzhuo 编写,转发请保留该信息.
原文: https://blog.csdn.net/Rozol/article/details/79816847
- 交互式反汇编器专业版, 一款静态反编译软件
- 对源码的改动将无法撤销, 直接修改源码
- 下载地址(吾爱破解): https://down.52pojie.cn/Tools/Disassemblers
- IDA Pro 7.0
界面
指令
ARM寻址指令
- ADD R0, R1, R2
- R0 <- R1 + R2
- 寄存器直接寻址
- MOV R1,#1
- R1 <- 1
- 立即数寻址, 操作数包含在指令中
- MOV R0, R0,LSR#16
- R0 <- R0<<16
- 寄存器偏移寻址, R0的值左移16位, 赋给R0
- LDR R0, [R1]
- R0 <- [R1]
- 寄存器间接寻址, 把寄存器里的值作为地址, 去找操作数
- LDR R0, [R1,#4]
- R0 <- [R1 + 4]
- 寄存器变址寻址
- LDMIA R0, {R1, R2, R3, R4}
- R1 <- [R0], R2 <- [R0 + 4], R3 <- [R0 + 8], R4 <- [R0 + 12]
- 多寄存器寻址, 一次完成多个寄存器值的传递
- STMFD SP!, {R1 - R7,LR}
- 将 R1 - R7,LR 入栈
- 堆栈寻址
- LDMED SP!, {R1 - R7,LR}
- 将栈中数据取回 R1 - R7,LR 寄存器, 出栈
- 堆栈寻址
ARM寄存器
- R0 - R3: 函数参数, 返回值
- R4 - R6, R8, R10 - R11: 普通寄存器
- R7: 栈帧指针
- R9: 系统保留
- R12: IP, 子程序间的scratch寄存器
- R13: SP, 数据栈指针, 用于保存栈顶指针
- R14: LR, 连接寄存器, 用于保存函数返回地址
- R15: PC, 程序计数器, 可知当前指令地址
其他指令
- push ebp: 入栈
- move ebp, esp: ebp <- esp
- sub esp, 8: 减指令
- add esp, 0FFFFFFF0h: 加指令
- call _alloca: 调用栈帧
- str: 把寄存器内容存到栈
- ldr: 把栈内容存入寄存器
- add esp,0Fh 移动栈指针(出栈)
- cmp R0, R1: 比较两操作数的大小
- cbz: 比较指令
- bl: 调用函数
- blx: 调用函数
IDA标记
- sub_xxx: 子程序
- loc_xxx: 地址簇
- byte_xxx: 8位数据
- word_xxx: 16位数据
- dword_xxx: 32位数据
- unk_xxx: 未知
IDA数据标记
- db: 1字节
- dw: 2字节
- dd: 4字节
- 修改数据类型: Alt+D
快捷键
- G: 跳到指定地址
- 内存地址 = 基址 + 偏移地址
- 内存地址 = 基址 + 偏移地址
- F5 / Tab: 查看C伪代码, 推荐使用 Tab 键
- 查看C伪代码
- 查看C伪代码
- F9: 运行
- ; / :: 注释, 区别是;会出现在所有交叉参考处
- Alt + T: 搜索字符串
- Y: 设置类型
- 还原JNI函数名 (修改类型为:
JNIEnv*
)
- 还原JNI函数名 (修改类型为:
- Ctrl + S: 查看段(Segement)信息
- 内存地址
- 内存地址
- P: 创建函数
- 将 DCB数据 转为 函数编码
- 将 DCB数据 转为 函数编码
- F8: 单步调试
- F7: 单步进入调试
- F2: 打断点, 或者点击左边小蓝点