MASTG-TECH-0042: 动态获取已加载的类和方法

您可以使用 Frida CLI 中的 Java 命令来访问 Java 运行时,并从运行中的应用程序检索信息。请记住,与 iOS 的 Frida 不同,在 Android 中,您需要将代码封装在 Java.perform 函数中。因此,使用 Frida 脚本更方便,例如,获取已加载的 Java 类及其相应的方法和字段的列表,或者进行更复杂的信息收集或插桩。下面列出了一个这样的脚本。下面使用的列出类方法的脚本可在 Github 上找到。

// Get list of loaded Java classes and methods

// Filename: java_class_listing.js

Java.perform(function() {
    Java.enumerateLoadedClasses({
        onMatch: function(className) {
            console.log(className);
            describeJavaClass(className);
        },
        onComplete: function() {}
    });
});

// Get the methods and fields
function describeJavaClass(className) {
  var jClass = Java.use(className);
  console.log(JSON.stringify({
    _name: className,
    _methods: Object.getOwnPropertyNames(jClass.__proto__).filter(function(m) {
      return !m.startsWith('$') // filter out Frida related special properties
        || m == 'class' || m == 'constructor' // optional
    }),
    _fields: jClass.class.getFields().map(function(f) {
      return( f.toString());
    })
  }, null, 2));
}

将脚本保存到名为 java_class_listing.js 的文件后,您可以使用 -l 标志告诉 Frida CLI 加载它,并使用 -p 指定的进程 ID 将其注入到进程中。

frida -U -l java_class_listing.js -p <pid>

// Output
[Huawei Nexus 6P::sg.vantagepoint.helloworldjni]->
...

com.scottyab.rootbeer.sample.MainActivity
{
  "_name": "com.scottyab.rootbeer.sample.MainActivity",
  "_methods": [
  ...
    "beerView",
    "checkRootImageViewList",
    "floatingActionButton",
    "infoDialog",
    "isRootedText",
    "isRootedTextDisclaimer",
    "mActivity",
    "GITHUB_LINK"
  ],
  "_fields": [
    "public static final int android.app.Activity.DEFAULT_KEYS_DIALER",
...

鉴于输出的冗长性,可以以编程方式过滤掉系统类,以使输出更具可读性并与用例相关。