我正在Android设备上通过python脚本运行Frida,以更改应用程序的功能。我试图挂接另一个函数中的一个函数,但我找不到实现这一点的方法。我在这里给出了我试图钩住的相关代码的一部分:
public class ClockInActivity extends Activity {
...
public void onCreate(Bundle savedInstanceState) {
...
}
public void btnClockIn(View view) {
...
new AsyncTask<Void, Void, Integer>() {
public java.lang.Integer doInBackground(java.lang.Void... r14) {
...
}
public void onPostExecute(Integer result) {
...
}
}
}
}
(哪里是"…",这是一个不相关的代码(。
我想达到";onPostExecute;方法,它在btnClockIn中。
我现在的python代码是这样的:
import frida, sys
jscript = """
Java.perform(function() {
console.log("Injection");
var change = Java.use('MyApplicationName.ClockInActivity');
change.btnClockIn.implementation = function()
{
console.log("check");
}
});
"""
process = frida.get_usb_device(1).attach("MyApplicationName")
script1 = process.create_script(jscript)
script1.load()
sys.stdin.read()
检查工作正常。谢谢你的帮助!
方法onPostExecute
不属于类MyApplicationName.ClockInActivity
,而是属于一个匿名内部类。匿名内部类没有自己的名称,相反,它们只是在驻留的类后面附加了一个数字:
因此,ClockInActivity
中的第一个匿名内部类的名称为MyApplicationName.ClockInActivity$1
,第二个匿名内部类名为MyApplicationName.ClockInActivity$2
,依此类推
如果你想获得匿名内部类的确切名称,请使用最新的不稳定版本的Jadx反编译APK文件。它将在注释中显示匿名内部类的确切名称(您需要最新的不稳定版本,因为此功能是在最新版本1.1.0之后添加的(
假设要挂接的AsyncTask是第一个匿名内部类,则必须使用以下代码:
var change = Java.use('MyApplicationName.ClockInActivity$1');
change.onPostExecute.implementation = function()
{
console.log("check");
}
});