hex-rays官方发布了一套《Igor的IDA每周技巧》系列文章,内容不错,故进行跟踪翻译,期望对大家有所帮助。
第8篇原文:Igor’s tip of the week #08: Batch mode under the hood
在前面文章中,我们简单讨论了批处理模式,但有时这些基本用法不足以应付工作需要。这里我们讨论一下如何定制化批处理模式。
基本使用
批处理模式的基本命令行为:
ida -B -Lida.log <other switches> <filename>
IDA将加载文件,等待分析完成,并将全部反汇编结果写到<filename>.asm文件中。
解析命令行
事实上,-B 是-A -Sanalysis.idc的简写模式:
- -A:使用自动模式,所有问题都采用默认答案
- -Sanalysis.idc:加载文件后运行analysis.idc脚本
Analysis.idc脚本可以在IDA安装目录的idc子目录下找到。在IDA 7.5下,这个脚本的内容为:
static main()
{
// turn on coagulation of data in the final pass of analysis
set_inf_attr(INF_AF, get_inf_attr(INF_AF) | AF_DODATA | AF_FINAL);
// .. and plan the entire address space for the final pass
auto_mark_range(0, BADADDR, AU_FINAL);
msg("Waiting for the end of the auto analysis...\n");
auto_wait();
msg("\n\n------ Creating the output file.... --------\n");
auto file = get_idb_path()[0:-4] + ".asm";
auto fhandle = fopen(file, "w");
gen_file(OFILE_ASM, fhandle, 0, BADADDR, 0); // create the assembler
file
msg("All done, exiting...\n");
qexit(0); // exit to OS, error code 0 - success
}
所以,要修改批处理模式的行为,你可以:
- 修改原analysis.idc的内容
- 通过-S<myscript.idc>指定一个新的脚本文件
例如:想让批处理模式输出LST文件(包含地址前缀),修改gen_file调用为:
gen_file(OFILE_LST, fhandle, 0, BADADDR, 0);
以批处理模式进行反编译
如果你的IDA有反编译模式的插件,你也可以通过批处理模式进行反编译。
例如,要反编译整个文件:
ida -Ohexrays:outfile.c:ALL -A <filename>
只反编译main函数:
ida -Ohexrays:outfile.c:main -A <filename>
这个命令将调用反编译插件的内建功能,其行为与analysis.idc脚本类似(等待IDA完成自动分析,反编译特定函数并输出到outfile.c)。
自定义批处理模式进行反编译的行为
如果默认行为不够用,你可以通过写插件来触发自定义的反编译行为。
但是,使用Python脚本会更方便一些。与IDC类似,可以使用-S在文件加载完成后自动执行一个Python脚本。
在这篇文章后面我们附上了一个简单脚本。可以用如下命令使用它:
ida -A -Sdecompile_entry_points.py -Llogfile.txt <filename>
加速批处理模式运行速度
在之前的样本中,我们都是使用ida.exe,这是IDA的GUI版本程序。尽管在批处理模式下,界面不会真正显示,但仍然会加载所有图形库,这将花费很多时间。所以使用命令行形式的可执行程序idat.exe会更好。然而,就算使用命令行程序,还是会启动一个命令行终端,这还是会浪费一些时间。如果你连命令行终端的浪费都不想有,可以使用下面的方法让ida在后台或守护进程中运行:
- 设置环境变量TVHEADLESS=1
- 重定向输出
例如:
TVHEADLESS=1 idat -A -Smyscript.idc file.bin >/dev/null &
欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。