使用IDA 6.6,我无法将命令行参数传递给IDAPython脚本。

我使用的命令是:

idaq64 -c -A -S"myscrip.py arg1" thebinpath. 


这里是演示脚本myscript.py

import sys
if len(sys.argv) >= 2:
    print("Successfully received parameters: " + str(sys.argv))
else:
    print("Failed receiving parameters!!")


我显然希望python脚本以“ arg1”作为唯一参数打印“成功接收参数”语句,但是“接收参数失败! !”而是打印出来。

出于某种未知的原因,sys.argv只有一个字符串(myscript.py)。

我想可能还有另一种获取这些参数的方法,对吗?

评论

我在IDAPython脚本中的参数方面也遇到了问题。我的建议(这是我的工作原理)是使用环境变量,例如:SOME_VAR = value idaq64 -A -S“ script.py” binary

谢谢您的回复。后来我找到了另一种解决方案。 python参数似乎存储在idc.ARGV中。所以我只使用idc.ARGV来测试参数。

#1 楼

大约三年过去了,这个相对简单的问题仍然缺乏正确的答案。今天使用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文件中,因为有充分的文献记载可保存运行脚本时提供的命令行参数。

名称的相似性也使我迷惑,但是由于在IDA中如何执行python脚本,因此上述文档也应在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"]