首页 > 解决方案 > 如何在使用 frida 的方法中挂钩 onClick 方法

问题描述

我想通过与 frida 挂钩来改变 onClick 方法的行为。我使用的代码是

Java.perform(function() {
    console.log("[*] START...")
    var mClass = Java.use("sg.vantagepoint.uncrackable1.MainActivity")
    mClass.a.onClick.implementation=function() {
        console.log("[*] Clicked ")
    }
})

我收到错误

TypeError: cannot write property 'implementation' of undefined
    at [anon] (../../../frida-gum/bindings/gumjs/duktape.c:57636)
    at /uncrackable1.js:6
    at frida/node_modules/frida-java-bridge/lib/vm.js:11
    at E (frida/node_modules/frida-java-bridge/index.js:346)
    at frida/node_modules/frida-java-bridge/index.js:298
    at frida/node_modules/frida-java-bridge/lib/vm.js:11
    at frida/node_modules/frida-java-bridge/index.js:278
    at /uncrackable1.js:11

源代码是

    private void a(String str) {
        AlertDialog create = new AlertDialog.Builder(this).create();
        create.setTitle(str);
        create.setMessage("This is unacceptable. The app is now going to exit.");
        create.setButton(-3, "OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialogInterface, int i) {
                System.exit(0);
            }
        });

标签: androidfrida

解决方案


您正在尝试挂钩错误的类 - 很可能是因为您使用 Jadx 来反编译错误的设置并且不了解 Java 类。

如果您使用Jadx反编译 APK 文件,请确保禁用设置内联匿名类以查看方法所属的真实类名。

该方法onClick()属于由new DialogInterface.OnClickListener()而不是创建的匿名内部类sg.vantagepoint.uncrackable1.MainActivity- 因此您试图挂钩错误的类。它使用的方法a(String)与挂钩完全无关。匿名内部类有自己的类名,基于外部类附加$一个数字。因此,正确的类名可能是sg.vantagepoint.uncrackable1.MainActivity$1sg.vantagepoint.uncrackable1.MainActivity$2,这取决于存在多少其他匿名内部类。

另外类似的事情mClass.a.onClick是不可能的,因为方法中没有方法(a是方法并且onClick是方法)。

最后你可能会得到以下 frida 代码:

Java.perform(function() {
    console.log("[*] START...")
    var mClass = Java.use("sg.vantagepoint.uncrackable1.MainActivity$1")
    mClass.onClick.implementation=function() {
        console.log("[*] Clicked ")
    }
})

推荐阅读