给 IDA 增加导出单个汇编函数的功能

IDA 中只能导出全部函数的汇编代码,导出速度很慢,导出的asm文件很大,不方便阅读。
我们在逆向过程中,有时只需要导出单个函数的代码,方便分析。

我用IDC脚本来实现,代码逻辑很简单:

  1. 首先是把光标放在函数体中的任意位置
  2. 找到函数体开始以及结束的位置
  3. 导入这个函数的代码


 1 #include <idc.idc>
 2 
 3 static get_idb_dir() {
 4   auto file_full_path = get_idb_path();  
 5   auto idbdir = qdirname(file_full_path);
 6   return idbdir;
 7 }
 8 
 9 static main() {
10   auto cea = ScreenEA();
11   msg("ea = 0x08%x\n", cea);
12 
13   auto addr_func_start = get_func_attr(cea, FUNCATTR_START);
14   auto addr_func_end = get_func_attr(cea, FUNCATTR_END);
15   if (addr_func_start != -1 && addr_func_end != -1) {
16     if (addr_func_start >= addr_func_end) {
17       msg("ERR: start addr <= end addr");
18       return;    
19     }
20 
21     msg("func start: %08x\n", addr_func_start);
22     msg("func end  : %08x\n", addr_func_end);
23 
24     auto filepath = sprintf("%s\\func_%08x.asm", get_idb_dir(), addr_func_start);
25     msg("path: %s\n", filepath);
26     auto hf = fopen(filepath, "w");
27     if (hf != 0) {
28       auto f = gen_file(OFILE_LST, hf, addr_func_start, addr_func_end, 0);
29       if (f != -1) {
30         msg("make asm file ok.\n");
31       } else {        
32         msg("ERR: gen_file error.\n");
33       }
34     } else {
35       msg("ERR: fopen %s error.\n", filepath);
36     }
37   } else {
38     msg("ERR: find func error.\n");
39   }
40 }

 

使用方法:

  1. 将上面的文件保存为 func.idc
  2. 在IDA上面将光标放在要导出的函数体内
  3. 按下快捷键 Alt+F7, 然后选择上面的IDC文件
  4. 导出的文件放在IDB文件目录下,func_XXXX.idc


上面的代码,我在IDA Pro 7.3 上测试通过。

image

posted @ 2020-11-14 21:49  Russinovich`s Blog  阅读(229)  评论(0编辑  收藏