frida hook不到方法

大佬们的文章时刻提醒我,我是个辣鸡,继续学习!

本篇文章仅供交流学习,侵权删(满满的求生欲)

本次app样本:5Y2O5ZWG5aS05p2h

我做过的尝试

1.使用spawnattach两种启动方式去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到了!

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Frida hook Java层全部AES加密函数JavaScript代码示例: ```javascript Java.perform(function() { // 找到所有的AES加密函数 var cipherClasses = [ "javax.crypto.Cipher", "javax.crypto.CipherInputStream", "javax.crypto.CipherOutputStream", "javax.crypto.NullCipher" ]; var aesFunctions = [ "AES/CBC/NoPadding", "AES/CBC/PKCS5Padding", "AES/CFB/NoPadding", "AES/CFB/PKCS5Padding", "AES/ECB/NoPadding", "AES/ECB/PKCS5Padding", "AES/OFB/NoPadding", "AES/OFB/PKCS5Padding" ]; // hook所有的AES加密函数 for (var i = 0; i < cipherClasses.length; i++) { var cipherClass = Java.use(cipherClasses[i]); for (var j = 0; j < aesFunctions.length; j++) { var aesFunction = aesFunctions[j]; var cipherFunc = aesFunction.split("/")[0]; var paddingFunc = aesFunction.split("/")[1]; try { // hook encrypt函数 cipherClass['getInstance'].overload('java.lang.String').implementation = function(mode) { var instance = this.getInstance(mode); if (mode.indexOf(cipherFunc) != -1 && mode.indexOf(paddingFunc) != -1) { instance.encryptImpl = instance.doFinal.overload().implementation; instance.doFinal.overload('[B').implementation = function(data) { // 打印参数 console.log("[*] Cipher Mode: " + mode); console.log("[*] Cipher Function: " + cipherFunc); console.log("[*] Padding Function: " + paddingFunc); console.log("[*] Data: " + data); // 调用原始函数 var result = this.encryptImpl(); // 打印返回值 console.log("[*] Encrypted Data: " + result); // 返回真正的返回值 return result; }; } return instance; }; // hook decrypt函数 cipherClass['getInstance'].overload('java.lang.String').implementation = function(mode) { var instance = this.getInstance(mode); if (mode.indexOf(cipherFunc) != -1 && mode.indexOf(paddingFunc) != -1) { instance.decryptImpl = instance.doFinal.overload().implementation; instance.doFinal.overload('[B').implementation = function(data) { // 打印参数 console.log("[*] Cipher Mode: " + mode); console.log("[*] Cipher Function: " + cipherFunc); console.log("[*] Padding Function: " + paddingFunc); console.log("[*] Data: " + data); // 调用原始函数 var result = this.decryptImpl(); // 打印返回值 console.log("[*] Decrypted Data: " + result); // 返回真正的返回值 return result; }; } return instance; }; } catch (e) { console.log(e); } } } }); ``` 以上代码示例是使用Frida hook Java层全部AES加密函数,并在函数执行前后打印函数参数和返回值。如果需要修改加密算法,可以在hook函数中修改参数或者返回值。注意,这个示例代码可能会hook到一些不需要的函数,需要根据具体情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值