大佬们的文章时刻提醒我,我是个辣鸡,继续学习!
本篇文章仅供交流学习,侵权删(满满的求生欲)
本次app样本:5Y2O5ZWG5aS05p2h
我做过的尝试
1.使用spawn和attach两种启动方式去hook
attach模式下有双进程保护,而spawn模式下则会报错没有找到目标方法。
2.第一时间想到会不会是动态加载dex,就是多个dex,而我们只hook了一个dex。
Java.perform(function(){
console.log('dddd')
// frida有个类加载器,遍历
Java.enumerateClassLoaders({
onMatch: function(loader){
// 每次匹配到,都要把匹配到的赋值给java默认的loader
Java.classFactory.loader = loader;
var TestClass;
// 没报错就hook到了,报错了就hook下一个,如果全都报错了,没打印东西,那可能就是hook错了。
try{
TestClass = Java.use("****");
TestClass.***.implementation = function(p1,p2){
console.log('decrypt p1:'+p1)
console.log('decrypt p2:'+p2)
return this.***(p1,p2)
}
}catch(error){
if(error.message.includes("ClassNotFoundException")){
console.log(" You are trying to load encrypted class, trying next loader");
}
else{
console.log(error.message);
}
}
},
onComplete: function(){
}
})
})
但是没有成功,那看来不是动态加载了dex
3.后来思考会不会是hook的时机不对呢,于是又试验了这篇文章的三种方法。
https://www.codeprj.com/blog/d51ac91.html
第一种方案 命令行不加 --no-pause
frida -U -f XXX,这时候app已经被拉起了,但是处于等待的状态,然后输入%resume,有一定几率可以hook到(暂不清楚用于什么场景。。)
第二种方案 setTimeout
//执行Hook方法
function test()
{
Java.perform(function ()
{
console.log("====start hook====");
var cls_MainActivity = Java.use("com.example.test_trace.MainActivity");
cls_MainActivity.show_test.implementation = function ()
{
console.log("start show_test");
return this.show_test();
};
});
}
//延迟5秒调用Hook方法
setTimeout(test, 5000);
当然这篇文章也是转载,原文章已经没了,但是也没有成功,好气!
4.最终终于在这篇文章找到了答案。
https://bbs.pediy.com/thread-246767.htm
简单来说就是dex被加固了,所以hook不到,具体的原理可以看上面那篇文章。
if(Java.available) {
Java.perform(function(){
var reflectClass = Java.use("java.lang.Class");
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 AyWelcome = Java.classFactory.use("*****"); //这里不能直接使用Java.use,因为java.use会检查在不在perform里面,不在就会失败
var methods = AyWelcome.class.getDeclaredMethods();
for(var i=0; i<methods.length;i++){
console.log(methods[i]);
}
// 然后下面的代码就和写正常的hook一样啦
console.log(1)
AyWelcome.***.implementation = function(str){
console.log("str:",str);
var result = this.***(str);
console.log("result:",result);
return result
}
console.log(3)
return result;
}
});
}
终于成功hook到了!