IDA Pro - 如何以批处理模式导出列表文件

逆向工程 艾达 拆卸 蟒蛇
2021-06-15 10:42:12

我正在使用 IDA Pro 6 并且我正在寻找一种方法来自动将分析的文件导出到列表 (.lst) 文件中

IDA 的界面允许使用菜单File > Produce File > Create LST file...执行此操作,但我找不到以批处理模式执行此操作的方法(通过在终端中使用 -B 运行 IDA) . Hex-Rays 的帮助页面似乎没有帮助,因为我找不到符合我需求的开关。

有什么办法可以自动从 IDA 中获取列表?也许使用 IDC/Python 脚本?

我需要的典型列表由地址位置、字节和每条指令的汇编组成,如下所示(如果没有其他可能性,可以省略仅包含注释或变量声明的行):

text:004016B0             ; =============== S U B R O U T I N E =======================================
.text:004016B0
.text:004016B0            ; Attributes: noreturn bp-based frame
.text:004016B0
.text:004016B0            ___report_gsfailure proc near       ; CODE XREF: __security_check_cookie(x):$failure$3j
.text:004016B0
.text:004016B0            var_324         = dword ptr -324h
.text:004016B0            var_8       = dword ptr -8
.text:004016B0            var_4       = dword ptr -4
.text:004016B0
.text:004016B0 8B FF                  mov     edi, edi
.text:004016B2 55                 push    ebp
.text:004016B3 8B EC                  mov     ebp, esp
.text:004016B5 81 EC 24 03 00+            sub     esp, 324h
.text:004016BB A3 40 21 40 00             mov     dword_402140, eax
.text:004016C0 89 0D 3C 21 40+            mov     dword_40213C, ecx
.text:004016C6 89 15 38 21 40+            mov     dword_402138, edx
.text:004016CC 89 1D 34 21 40+            mov     dword_402134, ebx
.text:004016D2 89 35 30 21 40+            mov     dword_402130, esi
.text:004016D8 89 3D 2C 21 40+            mov     dword_40212C, edi
2个回答

您需要的 IDAPython API 是idc.gen_file文件类型为OFILE_LST.

您应该按如下方式运行 ida:

{your ida executable}  -A -S{full name of the file with script below} {your exe}

脚本是

import idc
idc.gen_file(idc.OFILE_LST , your_listing_file_name, 0, idc.BADADDR, 0)
import ida_pro 
ida_pro.qexit()

此脚本适用于 IDA 7.1,您可能需要找到替代品,ida_pro.qexit它会导致 IDA 在完成脚本后退出(在 IDA 6.95 以及您可能可以使用的早期版本中sys.exit)。

测试前目录的内容

:\>ls -l | awk "{print $5 , $8}"

190 bldwmsgbox.bat
175 dumplst.idc
108 wmsgbox.cpp

编译和链接src

:\>bldwmsgbox.bat
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.6.4
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
wmsgbox.cpp

idc文件的内容

:\>cat dumplst.idc
#include <idc.idc>
static main(void) {
auto fp;
Batch(1);
Wait();
fp = fopen("idclst.lst","w");
GenerateFile(OFILE_LST,fp,MinEA(),MaxEA(),0x0);
fclose(fp);
Exit(0);
}

lst文件的自动分析和创建

:\>e:\IDA_FREE_5\idag.exe -B -Sdumplst.idc wmsgbox.exe

删除 idb 并在 gui 中重新打开二进制文件以从 file->produce file->create lst file 生成一个 lst 文件

:\>del *.idb

:\>echo "using gui file->producefile to make another lst for comparison"
"using gui file->producefile to make another lst for comparison"

:\>e:\IDA_FREE_5\idag.exe wmsgbox.exe

:\>ls -l *.lst | awk "{print $5 , $8}"
16877 guiidclst.lst
18617 idclst.lst

:\>wc -l *.lst
  574 guiidclst.lst
  580 idclst.lst
 1154 total

:\>echo "appears to be whitespace diff 
just 6 ines bigger but too much byte variation 
appears to be whitespace difference "

忽略空格和大小写的差异输出

:\>diff -iw idclst.lst guiidclst.lst
24d23
< .text:00401000 ; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
33d31
< .text:00401000 ; UUUUUUUUUUUUUUU S U B R O U T I N E UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
66d63
< .idata:00402000       ; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
71,72c68
< .idata:00402000                       extrn __imp__ExitProcess@4:dword ; DATA XREF: main+19↑r
< .idata:00402000                                               ; ExitProcess(x)↑r
---
> .idata:00402000       extrn __imp__ExitProcess@4:dword
78,79c74
< .idata:00402008                       extrn __imp__MessageBoxA@16:dword ; DATA XREF: main+11↑r
< .idata:00402008                                               ; MessageBoxA(x,x,x,x)↑r
---
> .idata:00402008       extrn __imp__MessageBoxA@16:dword
82d76
< .rdata:00402010       ; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
90c84
< .rdata:00402010       Caption         db 'test',0             ; DATA XREF: main+5↑o
---
> .rdata:00402010       Caption db 'test',0
93c87
< .rdata:00402018       Text            db 'test',0             ; DATA XREF: main+A↑o
---
> .rdata:00402018       Text db 'test',0

:\>