交互式反汇编器,是典型的递归下降反汇编器。
导航条
蓝色 :表示常规的指令函数
黑色 :节与节之间的间隙
银白色 :数据内容
粉色 :表示外部导入符号
暗黄色: 表示ida未识别的内容
IDA主界面
IDA View三种反汇编视图:文本视图、图表视图、路径视图
Hex View 十六进制窗口
Struceures 结构体窗口
Enums 枚举窗口
Imports 导入函数窗口
Exports 导出函数窗口
Strings 字符串窗口
IDA常用功能及快捷键:
空格键:切换文本视图与图表视图
ESC:返回上一个操作地址
G:搜索地址和符号
N:对符号进行重命名
冒号键:常规注释
分号键:可重复注释
Alt+M:添加标签
Ctrl+M:查看标签
Ctrl+S:查看段的信息
代码数据切换
C=>代码 D=>数据 A=>ascii字符串 U=>解析成未定义的内容
X:查看交叉应用
F5:查看伪代码
Alt+T:搜索文本
Alt+B:搜索十六进制
IDA静态分析:
导入jni.h分析jni库函数
拷贝伪C代码到反汇编窗口
右键=>copy to -assembly-把伪c代码复制到反汇编窗口的汇 编代码。
IDA可以修改so的hex来修改so,edit=>edit-patchrogram
在这里建议使用winhex来实现。
IDA动态调试:
IDA调式界面
1.反汇编窗口
C 将当前地址处的数据解析成代码
P
2.十六进制窗口
编辑内存数据和代码
3.寄存器窗口
修改寄存器的值
4.模块窗口
模块路径和地址
5.线程窗口
6.栈窗口
7.输出信息窗口
IDA调式常用功能
1.断点和运行
设置断点 F2
设置断点不可用 Disable breakpoint
编辑断点 Edit breakpoint
删除断点 Delete breakpoint
继续运行 F9
查看当前所有断点 Ctrl+Alt+B
2.单步调式
单步步入 F7
单步步过 F8
运行到函数的返回地址 Ctrl+F7
运行到光标处 F4
3.IDC脚本
static main(void)
{
auto fp, dexAddress, end, size;
dexAddress = 0x77607640;
size = 0x19E118;
end = dexAddress + size;
fp = fopen("D:\\classes.dex", "wb");
for ( ; dexAddress < end; dexAddress++ )
fputc(Byte(dexAddress), fp);
}
4.修改内存数据
5.修改寄存器
修改PC寄存器时,最好在跳转指令改,当然如果你对程序流程 把握很好,可以随便PC,只要程序不出错
7.NOP函数或代码
NOP函数MOV R0,R0(00 00 A0 E1/00 1C)
清空指令(00 00 00 00/00 00)
函数头直接返回mov pc,lr(0E F0 A0 E1/F7 46)
8.改变执行流程
修改寄存器的值
修改跳转指令
注意:修改内存和修改代码的时机选择不同,因为修改内存和寄存 器,必须调式到某一处,才能让寄存器和内存是想要的值,此 时修改,而且数据的值一般对程序影响不大,而修改代码就不同了 如果已经走到了那一句代码,才去修改代码,是要报错的,提前在 它 运行到前面1-2条指令时修改代码。原因是PC指令预读三级流 水线:
1.读取指令
2.解析指令
3.执行指令
ADD R6,PC,R6 =>R6=PC+R6=847C+1840=9CBC+8? 9CC4
JNI_OnLoad下断方法技巧
so内寻找
基址+偏移
dvmloadnativecode函数
dlsym(handle,"jni_onload")
.init和.init_array下断技巧
linker大法,先勾选三项F9运行,再执行jdb,当目标so被加载 时通过基址+偏移下段