使用Frida挂钩Android方法,但.implementation()未执行

osh3o9ms  于 2023-05-27  发布在  Android
关注(0)|答案(1)|浏览(502)

我正在学习Frida,并试图挂钩一个方法checkFlag,并试图将布尔标志从true修改为false。
下面是demo app code

在正常情况下,会显示带有Flag is True的吐司。我想挂接checkFlag方法并将flag值修改为false,以便显示Warning! Flag is compromised。我首先尝试通过简单地添加一个日志条目来确保该方法被挂起,但我认为.implementation根本没有被执行。
下面是我的Frida片段:

import frida

device = frida.get_usb_device()
pid = device.spawn(["com.example.hookme"])
device.resume(pid)
import time
time.sleep(1)
session = device.attach(pid)
script = session.create_script('''
Java.perform(function() {
    console.log("Running Script -- ");
    var MainActivity = Java.use('com.example.hookme.MainActivity');

    console.log(MainActivity);

    MainActivity.checkFlag.implementation = function(x) { // x is the "flag" param

        // change the value of x to False, so that else condition is fired. 

        console.log("Inside checkFlag Implementation.");
    }
    console.log("Post Implementation");

});
''')
script.load()

运行脚本后,应用程序完美地生成,但方法没有挂钩。这意味着我看不到MainActivity.checkFlag.implementation...内部实现的日志

有人能指出我在这里错过了什么吗?

txu3uszq

txu3uszq1#

你的主要问题是当你的钩子代码被安装时,MainActivity.onCreate()方法已经被调用了,因此你的钩子永远不会被调用。
这是因为您的python代码首先调用device.resume(pid),然后调用device.attach(pid)和加载Frida JavaScript的代码。
当您想要执行早期检测时,例如要在应用程序启动时执行的代码中挂钩某些内容,您必须首先附加到应用程序并加载Frida JavaScript代码,然后恢复应用程序进程。
这样,Frida就有机会在checkFlag方法被调用之前将其挂起。

device = frida.get_usb_device()
pid = device.spawn(["com.example.hookme"])
session = device.attach(pid)
script = session.create_script('''
Java.perform(function() {
    ....
}
''')
script.load()
device.resume(pid)

相关问题