对一批二进制文件执行IDA Python脚本
IDA的批处理
参考IDA官方提供的帮助文档,下面的命令将会对指定文件执行指定脚本且不显示IDA的窗口,因此,遍历文件夹内所有文件,依次执行下面的命令即可。
ida -c -A -S"script_path" filepath
参数说明:
-c 删除旧的数据库
-A autonomous模式,IDA将不会显示
-S 后面紧跟着IDA Python脚本的路径
IDA Python脚本的限制
在使用批处理时,IDA Python的脚本中需要按照如下的模式进行编程,其中idc.Wait()
是等待IDA对二进制文件的自动分析结束,idc.Exit()
是用来结束IDA进程的。
def main():
pass
if __name__ == "__main__":
idc.Wait()
main()
idc.Exit(0)
特别需要注意的是idc.Exit(0)
,如果写成idc.Exit(1)
或者idc.Exit()
,那么ida退出之后将不会打包成数据库文件。
IDA Python中的参数传递
在使用批处理时,一个常见的场景是需要传递参数,script_path中是可以包含参数的,例如
ida -c -A -S"script_path argv[1] argv[2] argv[3]" filepath
在脚本中获取参数的方式和正常Python有所不同,如下所示:
import idc
def main(A, B, C):
pass
if __name__ == "__main__":
idc.Wait()
main(idc.ARGV[1], idc.ARGV[2], idc.ARGV[3])
idc.Exit(0)
ps:
除了参数传递,有时候还会想让脚本的输出打印在控制台中,而不是文件中。
在IDA/python目录下,可以找到init.py
sys.stdout = sys.stderr = IDAPythonStdOut()
这里面将标准输出和标准错误都重定向至IDAPythonStdOut类中,将这句代码注释掉,然后再使用ida的命令行版本idat执行批处理可以解决这个问题。由于ida和idat的执行结果有不一致的地方,在项目中并没有使用这样的方法。