Frida-将函数挂接到函数中

问题描述

我正在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) {
        ...
        }
    } 
  }
}

(“ ...”在这里是不相关的代码。)

我想到达btnClockIn内部的“ onPostExecute”方法

我现在的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文件。它将在注释中显示匿名内部类的确切名称(您需要最新的unstable,因为此功能是在最新版本1.1.0之后添加的。)

假设您要挂接的AsyncTask是第一个匿名内部类,则必须使用以下代码:

    var change = Java.use('MyApplicationName.ClockInActivity$1');
    
    change.onPostExecute.implementation = function()
    {   
        console.log("check");
     }
   });