IDA笔记

常用快捷键

Shift+F12:查看所有字符串

F5:查看伪代码

Alt+T:查找字符串

空格:切换图形视图&汇编视图

/:在反编译后伪代码的界面中写下注释

x:对着某个函数、变量按该快捷键,可以查看它的交叉引用

位操作

1
2
3
4
5
6
def LOBYTE(x): return x & 0xff
def HIBYTE(x): return (x >> 8) & 0xff
def LOWORD(x): return x & 0xffff
def HIWORD(x): return (x >> 16) & 0xffff
def LODWORD(x): return x & 0xffffffff
def HIDWORD(x): return (x >> 32) & 0xffffffff

其他操作

导出array为数组

右键array变量名 → 转为dword → Export as → C unsigned char array (hex)

170006lwwoowsvm945je22

手动修复栈指针(Decompilation failure: positive sp value has been found)

现象:无法反编译

170016mnj324snrxkrg1ug

修复:

170018czryr5u500vy20yn

170020nngx262sktesf18k

对标红位置按 Alt+K 修改栈偏移:

170022vp515f5fdgd0pdkd

修改后 F5 即可。

手动修改汇编或二进制代码(Patch)

  • 激活功能

    Edit▶Patch Program菜单GUI版本的IDA的一项隐藏功能,用户需要编辑idagui.cfg配置文件才能激活该菜单。

    20160210203642536

  • 改字节(Change word)

    IDA——Edit——Patch Program——Change word

    用于编辑IDA数据库中的字节值。
    这里写图片描述
    这个对话框显示了从光标所在位置开始的16个字节的值。你可以更改显示的部分或全部字节。
    同时,Address表示了虚拟地址,File offset表示了文件偏移量。

    实际上,Hex View可以直接改字节,右键Edit即可。

  • 改内容(Assemble)

    IDA——Edit——Patch Program——Assemble

    利用“汇编”选项可以输入使用一个内部汇编器汇编的汇编语言语句。然后,IDA会将得到的指令字节写入当前的屏幕位置。
    QQ截图20200520215855

  • 应用修改(Apply patches to input file)

    IDA——Edit——Patch Program——Apply patches to input file

    把改动更新到二进制文件中。

手动定义为函数(恢复伪代码)

来到一处看似很像关键代码处的位置:

ezgif-7-c652b68cc595

在这部分代码的头部按 P 键定义为函数,接着尝试查看伪代码,得到的伪代码没有变量识别,非常难看。

ezgif-7-c5059efb62fd

于是我们尝试修复堆栈信息,让 IDA 能够识别出来变量。

ezgif-7-46fb759d5fab

如图所示,我们可以尝试着在这部分之上使用 Keypatch 手动加入一个 push rbp; mov rbp, rsp

让 IDA 能够识别出堆栈上的变量,紧接着再 F5,就可以看到比较舒服的伪代码了。

ezgif-7-d9941cfe65f7

Dump代码生成新脚本

使用IDA Pro调试程序时偶尔会遇到dump内存的需求,IDA Pro并没有直接提供内存dump的功能,但可以通过其提供的接口用脚本来实现相关功能。

  • IDC脚本
    1
    2
    3
    4
    auto 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
    5
    import idaapi
    data = idaapi.dbg_read_memory(start_address, data_length)
    fp = open('d:\\dump', 'wb')
    fp.write(data)
    fp.close()