声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我会立即删除并致歉。谢谢!
文章有疑问的,可以公众号发消息问我,或者留言。我每天都会看的。
前言
Objection作为基于Frida的工具,在Java层定位代码、打印堆栈很好用。但有时,Objection会报错Error: java.lang.ClassNotFoundException: Didn't find class
。
Objection提示找不到类,但是你用Objection的search模块搜索类名时,是能够看到的。
查看报错信息,原因是因为需要Hook的类采用的类加载器和Objection默认使用的类加载器不一致,导致Objection找不到。
同样的问题,Frida hook 类也存在,解决方案是通用的。
解决方案
既然默认的类加载器无法找到类,那么就通过遍历类加载器,让不同的类加载器加载指定类。
参考Frida API,我们可以采用Java.enumerateClassLoaders
遍历类加载器。
具体代码如下:
function load_found() {
var loaderFound = null;
var class_name = "类名";
Java.enumerateClassLoaders({
onMatch: function (loader) {
try {
// 尝试用这个 loader 加载目标类
if (loader.findClass(class_name)) {
console.log("[+] 找到合适的 ClassLoader: " + loader);
loaderFound = loader; // 找到正确的 loader 后保存
const classFactory = Java.ClassFactory.get(loaderFound);
const TargetClass = classFactory.use(class_name);
// console.log(TargetClass);
}
} catch (e) {
// 某些 loader 可能无法 findClass,忽略即可
}
},
onComplete: function () {
if (loaderFound !== null) {
console.log("[+] 成功匹配 ClassLoader,继续操作");
// 接下来你就可以用这个 loader 来使用类了
} else {
console.log("[-] 没有找到能加载目标类的 ClassLoader");
}
}
});
}
将上述代码稍作修改贴到Objection的agen.js中
路径在Python中的Libsite-packagesobjection
比如将报错位置的
const targetClass = Java.use(clazz);
替换为
let tempclass = null;
Java.enumerateClassLoaders({
onMatch: function (loader) {
try {
if (loader.findClass(clazz)) {
const classFactory = Java.ClassFactory.get(loader);
tempclass = classFactory.use(clazz);
}
} catch (e) {
}
},
onComplete: function () {
}
});
const targetClass = tempclass;
修改好的agent.js我放在知识星球了,下载文件后,替换Objection中的agent.js即可。
记得备份原来的agent.js,避免出现问题导致Objection无法使用,需要重新安装。
知识星球:
原文始发于微信公众号(进击的HACK):APP中Java类存在,但Objection报错找不到类(含解决方案)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论