常用快捷键
Shift+F12:查看所有字符串
F5:查看伪代码
Alt+T:查找字符串
空格:切换图形视图&汇编视图
/:在反编译后伪代码的界面中写下注释
x:对着某个函数、变量按该快捷键,可以查看它的交叉引用
n:改变量名
y:改变量类型
IDAPython
在IDA中要使用脚本有三种方式:
第一种,直接按Shift+F2快捷键调出界面,也可以直接在菜单中选择命令脚本(File -> Script command);
第二种,写一个脚本文件直接进行引用(File -> Script file);
第三种,直接在IDA底部写命令。
IDAPython由三个独立模块组成:
idc: idc函数的兼容模块,包含IDA内置函数声明和内部定义
idautils: 实用函数模块
idaapi: 用于访问更多底层数据的模块
指令操作
1 | import idc |
段操作
1 | import idc |
函数操作
1 | import idc |
搜索
在IDAPython中如果想查询某些数据、代码、二进制,都可以用都搜索函数。搜索函数可以是向上搜索,也可以是向下搜索,搜索失败就会返回-1,也就是BADADDR,而搜索功能也常常用于去除花指令当中。
1 | ea = here() |
数据校验
1 | import idc |
交叉引用
1 | import idc |
创建结构体
View -> Open subviews -> Local types,右键->Insert,即可输入结构体定义,示例如下:
1 | struct hello |
如果要修改,选中相应行,右键->Edit 即可。
位操作
1 | def LOBYTE(x): return x & 0xff |
其他操作
导出array为数组
右键array变量名 → 转为dword → Export as → C unsigned char array (hex)
手动修复栈指针(Decompilation failure: positive sp value has been found)
现象:无法反编译
修复:
对标红位置按 Alt+K 修改栈偏移:
修改后 F5 即可。
手动修改汇编或二进制代码(Patch)
激活功能
Edit▶Patch Program菜单GUI版本的IDA的一项隐藏功能,用户需要编辑idagui.cfg配置文件才能激活该菜单。
改字节(Change word)
IDA——Edit——Patch Program——Change word
用于编辑IDA数据库中的字节值。
这个对话框显示了从光标所在位置开始的16个字节的值。你可以更改显示的部分或全部字节。
同时,Address表示了虚拟地址,File offset表示了文件偏移量。实际上,Hex View可以直接改字节,右键Edit即可。
改内容(Assemble)
IDA——Edit——Patch Program——Assemble
利用“汇编”选项可以输入使用一个内部汇编器汇编的汇编语言语句。然后,IDA会将得到的指令字节写入当前的屏幕位置。
应用修改(Apply patches to input file)
IDA——Edit——Patch Program——Apply patches to input file
把改动更新到二进制文件中。
手动定义为函数(恢复伪代码)
来到一处看似很像关键代码处的位置:
在这部分代码的头部按 P 键定义为函数,接着尝试查看伪代码,得到的伪代码没有变量识别,非常难看。
于是我们尝试修复堆栈信息,让 IDA 能够识别出来变量。
如图所示,我们可以尝试着在这部分之上使用 Keypatch 手动加入一个 push rbp; mov rbp, rsp
让 IDA 能够识别出堆栈上的变量,紧接着再 F5,就可以看到比较舒服的伪代码了。
Dump代码生成新脚本
使用IDA Pro调试程序时偶尔会遇到dump内存的需求,IDA Pro并没有直接提供内存dump的功能,但可以通过其提供的接口用脚本来实现相关功能。
IDC脚本
1
2
3
4auto i,fp;
fp = fopen("d:\\dump.dex","wb");
for (i = start_address; i <= end_address; i++)
fputc(Byte(i),fp);Python脚本
1
2
3
4
5import idaapi
data = idaapi.dbg_read_memory(start_address, data_length)
fp = open('d:\\dump', 'wb')
fp.write(data)
fp.close()
异常处理
选择本地Windows调试器后点击debugger选项卡中的debugger options,选择左下角的edit exceptions,如触发了除零异常,可以找到整数除零异常(EXCEPTION_INT_DIVIDE_BY_ZERO
),选择pass to application和silent,下断调试即可。