【问题标题】:Frida - hooking a function inside a functionFrida - 在函数中挂钩函数
【发布时间】:2020-12-11 20:12:11
【问题描述】:

我正在 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()

检查运行良好。感谢您的帮助!

【问题讨论】:

  • 尝试像 Java.use("android.os.AsyncTask").doInBackground.implementation 那样挂钩 AsyncClass

标签: javascript android mobile reverse-engineering frida


【解决方案1】:

方法onPostExecute 不属于MyApplicationName.ClockInActivity 类,而是属于匿名内部类。匿名内部类没有自己的名称,它们只是在所在的类后面附加了一个数字:

ClockInActivity 中的第一个匿名内部类因此名称为 MyApplicationName.ClockInActivity$1,第二个匿名内部类的名称为 MyApplicationName.ClockInActivity$2,依此类推。

如果您想获得匿名内部类的确切名称,请使用最新的不稳定版本 Jadx 反编译 APK 文件。它将在 cmets 中向您显示匿名内部类的确切名称(您需要最新的不稳定,因为此功能是在最新版本 1.1.0 之后添加的)。

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

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

【讨论】:

    猜你喜欢
    • 2021-01-20
    • 2021-12-08
    • 2019-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 2021-06-19
    相关资源
    最近更新 更多