如何获取fridajavascriptrpc.exports到python的所有函数?

How to get all functions from frida javascript rpc.exports to python?

我有一个包含一些 rpc.exports

的 js 文件
rpc.exports = {
    callfunctionsecret: callSecretFun,
    callfunctionsomethingelse: callSomethingElse,
}

我想在 python 中列出所有这些功能,但找不到实现的方法

device = frida.get_usb_device()
pid = device.spawn([package_name])
device.resume(pid)
time.sleep(1)
session = device.attach(pid)
with open(sys.argv[1]) as jsfile:
        script = session.create_script(jsfile.read())
print(dir(script.exports))
# output
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_script']
# output doesn't contain "callfunctionsecret" and "callfunctionsomethingelse"

有没有办法在某种列表中获取函数名称?

# e.g.
['callfunctionsecret','callfunctionsomethingelse']

到目前为止,我只到了可以使用

访问函数对象的地步
print(script.exports.__getattrs__(callfunctionsecret))

但这要求我们首先知道函数名,这违背了列出所有函数名的目的

据我所知,这没有记录,也没有明确的方法。 ScriptExports as class 不包含用于此目的的任何有用信息或方法。但是,如果您搜索 frida-gum's code,就会有这样的操作用于此目的,list。可以触发此操作并像这样获取所有 rpc 导出:

agent.js

function callSecretFun(n) {
        return n*100
}

rpc.exports = {
        callfunctionsecret: callSecretFun,
        fun1: function() {send("fun1"); return 1000},
        fun2: function() {send("fun2")}
}

agent.py

import sys
import frida

session = frida.attach("hello")
with open("agent.js", "r") as f:
    script = session.create_script(f.read())
script.load()
rpc_exports = script._rpc_request('list') # send an rpc request to list rpc exports
print(rpc_exports)
sys.stdin.read()

输出:

$ python3 agent.py
['callfunctionsecret', 'fun1', 'fun2']