IDAPro,无法将参数传递给 python 脚本

逆向工程 艾达 蟒蛇
2021-06-30 03:14:09

使用 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)。

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

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 文件中使用的,因为它有充分的文档记录来保存脚本运行时提供的命令行参数。

名称相似性也欺骗了我,但是由于 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"]