对一批二进制文件执行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的执行结果有不一致的地方,在项目中并没有使用这样的方法。

posted @ 2020-03-16 17:35  go2sleep  阅读(1445)  评论(3编辑  收藏  举报