IDA的界面允许使用菜单文件File来执行此操作。 >产生文件>创建LST文件...,但是我找不到以批处理方式执行此操作的方法(通过在带有-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):$failurej
.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
#1 楼
您需要的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
代替) 。#2 楼
测试前目录的内容:\>ls -l | awk "{print , }"
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中的二进制文件以产生从文件->产生文件->创建第一个文件的第一个文件
:\>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 , }"
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输出,忽略空格和大小写
:\>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
:\>
评论
非常感谢@blabb,您提供了非常详细的答案!尽管这回答了我的问题,但我主观上更喜欢python方法。如果我能够将多个答案标记为有效,那么您肯定是一个答案!
–杰姆斯
18年5月14日晚上10:55
评论
您是否尝试了-B选项? (-B批处理模式。IDA将自动生成.IDB和.ASM文件”)