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的執行結果有不一致的地方,在項目中並沒有使用這樣的方法。