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",
...
鉴于输出的冗长性,可以以编程方式过滤掉系统类,以使输出更具可读性并与用例相关。