参考:https://bbs.kanxue.com/thread-246767.htm
对于未加固应用,我们可以通过如下方式打印堆栈
if(Java.available) {
Java.perform(function(){
var Def = Java.use("com.abc.Def");
if(Def != undefined) {
console.log("Def: " + Def.toString());
console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));//java打印堆栈
} else {
console.log("Def: undefined");
}
});
}
但是如果应用到加固应用中会报错
Error: java.lang.ClassNotFoundException: Didn't find class "xxx" on path: DexPathList[[zip file
根据参考文章解决如下。
主要是重新指向classloader
if(Java.available) {
Java.perform(function(){
var application = Java.use("android.app.Application");
application.attach.overload('android.content.Context').implementation = function(context) {
var result = this.attach(context); // 先执行原来的attach方法
var classloader = context.getClassLoader(); // 获取classloader
Java.classFactory.loader = classloader;
var Def = Java.classFactory.use("com.abc.Def"); //这里不能直接使用Java.use,因为java.use会检查在不在perform里面,不在就会失败
console.log("Def: " + Def);
// 然后下面的代码就和写正常的hook一样啦
Def.e.overload('java.lang.String').implementation = function(arg1) {
console.log("arg1: " + arg1);//打印原有参数
var ret = this.e(arg1,arg2);//执行原有调用
console.log("ret: " + ret);//打印原有调用返回
return ret;
}
return result;
}
});
}