注:自行网上下载IDA pro
我安装好的IDA 包含64和32两个版本,经测试 32位支持伪代码,可以F5对照C语言等进行更方便的分析。
用IDA pro打开一个so文件
展示如下(F5查看伪代码)
- IDA View-A是反汇编窗口
- HexView-A是十六进制格式显示的窗口
- Imports是导入表(程序中调用到的外面的函数)
- Functions是函数表(这个程序中的函数)
- Structures是结构
- Enums是枚举
IDA View-A
这里会有流程图(按回车进行切换),判断是执行绿色,判断否执行红色,蓝色为一个执行块。
分析
先展示些ARM汇编的基础寄存器
- R0-R3:用于函数参数及返回值的传递
- R4-R6, R8,R10-R11:没有特殊规定,就是普通的通用寄存器
- R7:栈帧指针(Frame Pointer).指向前一个保存的栈帧(stack frame)和链接寄存器(link register, lr)在栈上的地址。
- R9:操作系统保留
- R12:又叫IP(intra-procedure scratch)
- R13:又叫SP(stack pointer),是栈顶指针
- R14:又叫LR(link register),存放函数的返回地址。
- R15:又叫PC(program counter),指向当前指令地址。
- CPSR:当前程序状态寄存器(Current Program State Register),在用户状态下存放像condition标志中断禁用等标志的。
- VFP:(向量浮点运算)相关的寄存器
基本的指令
- add 加指令
- sub 减指令
- str 把寄存器内容存到栈上去
- ldr 把栈上内容载入一寄存器中
- .w是一个可选的指令宽度说明符。它不会影响为此指令的行为,它只是确保生成 32 位指令。
- bl 执行函数调用,并把使lr指向调用者(caller)的下一条指令,即函数的返回地址
- blx 同上,但是在ARM和thumb指令集间切换。
- bx bx lr返回调用函数(caller)。
- bne 数据跳转指令,标志寄存器中Z标志位不等于零时, 跳转到BNE后标签处。
- CMP 比较命令
- B 无条件跳转