android - 如何使用 Frida 获取 Java 方法的返回值

标签 android python frida

TLDR 我希望使用 Frida 来调用 Android 应用程序中未使用的方法并取回其值。目前,我的脚本输出没有得到任何返回。

Android 应用程序代码:

package securisec.com.methods;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public static String strings(){
        return "This is a string method";
    }

}

正如您所看到的,strings 方法从未被使用过。我希望能够使用 Frida 调用此方法并获取返回值。

这是我的 python 脚本,它不起作用。

import frida
from time import sleep

call_back_message = ''

def on_message(message, payload):
    global call_back_message
    if message['type'] == 'send':
        call_back_message = message['payload']
        return call_back_message

def object_hooking(comName, className, method):
    process = frida.get_usb_device()
    pid = process.spawn([comName])
    process.resume(pid)
    sleep(1)
    js = """
            Java.perform(function()
            {
                var getVal = Java.use('%s.%s');
                console.log(getVal)
                var cons = getVal.$new();
                console.log(cons)
                var solution = cons.%s;
                var send_it = solution.toString();
                send(send_it);
            });""" % (comName, className, method)
    session = process.attach(pid)
    script = session.create_script(js)
    script.on('message', on_message)
    script.load()
    return call_back_message

print(object_hooking(
    comName='securisec.com.methods', 
    className='MainActivity',
    method='strings()'
))

最佳答案

您不需要创建新实例,您有几个拼写错误,但总的来说,您似乎明白了要点。

如果该方法存在于

Object.getOwnPropertyNames(Java.use('securisec.com.methods.MainActivity').__proto__).join('\n\t')

并且编译器没有排除它,下面的代码应该完成这项工作

def main():
    device = frida.get_usb_device()
    script = device.attach(device.spawn([APP])).create_script("""
        Java.perform(function(){
            console.log( 
                Java.use('securisec.com.methods.MainActivity')['strings']() 
            );
        });
    """)
    script.load()
    device.resume(APP)
    sys.stdin.read()

if __name__ == "__main__":
    main()

我更喜欢保持干净的风格:)

function Main() {
    var retVal = Java.use("securisec.com.methods.MainActivity")["strings"]();
    console.log("retVal", retVal);
}
Java.perform(Main);

您还可以使用 REPL 进行测试

$ frida -U com.app -e 'console.log(Java.use("securisec.com.methods.MainActivity")["strings"]())' --no-pause

关于android - 如何使用 Frida 获取 Java 方法的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51797080/

相关文章:

java - 如何将警报值传递给警报接收器

python - 只接受一种类型的输入

python - 模块未找到错误: No module named 'bcolz'

android - 我的Android应用程序如何扫描自己的内存映射以查找已知的不良关键字,例如“Xposed”或“Frida”?

android - FragmentManager - IllegalStateException - 无主机

java - Firebase 值事件监听器即使在 Activity 完成后也会触发?

android - Azure存储Android API,安全吗?

python - Python 中用于 Python 的 ISO 人类可读解析器

javascript - 使用 Frida 构造字符串数组

ios - 在 frida-trace onEnter 中停止函数调用