大约三年过去了,这个相对简单的问题仍然缺乏正确的答案。今天在使用 IDA 7.0 时遇到同样的问题,我不妨花时间提供一个正确的答案。
引用 IDA 的帮助文件
-S###
打开数据库时执行脚本文件。脚本文件扩展名用于确定哪个 extlang 将运行脚本。
可以在脚本名称后传递命令行参数。
例如: -S"myscript.idc argument1 \"argument 2\" argument3"
传递的参数存储在ARGV
全局IDC变量中。使用ARGV.count
来确定参数的个数。第一个参数ARGV[0]
包含脚本名称
上面引用的文档为 IDC 脚本语言提供了一个明确的示例,但让我们插入/猜测什么是 IDAPython 等价物。
自然地,人们可能会假设 idc 的ARGV
参数将被转换为 python 的众所周知的sys.argv
,这正是在大多数 python 文件中使用的,因为它有充分的文档记录来保存脚本运行时提供的命令行参数。
名称相似性也欺骗了我,但是由于 Python 脚本在 IDA 中的执行方式,上面的文档也应该在 Python 中按字面意思处理。这ARGV
是使用该标志执行的 IDA python 脚本唯一可以访问参数的地方-S
。
然而,在 IDA python 中,它不能作为全局参数使用,而应通过idc
模块访问。
这是一个简单的例子;
给出以下myscript.py
文件:
import sys, idc
print("Sys args: " + str(sys.argv))
print("Idc args: " + str(idc.ARGV))
执行以下命令(忽略通常的 IDA 横幅):
ida64 -A -S"myscript.py" arg1 "arg one and a half" arg2 -L/some/other/flags/logfile.txt -t
将导致以下输出:
Sys args: []
Idc args: ["arg1", "arg one and a half", "arg2"]