针对免费加固型App进行抓包

使用charles+Postern 出现网络开小差,使用zip查看发现app中包含okhttp3,应该是做了证书校验

了解情况
Image.png

如果要Hook就需要拿到加固的ClassLoader
使用jadx打开,找到stub.StubApp.attachBaseContext,通过加固后的上下文可以通过context去获取加固后的ClassLoader,然后得到他加载的所有类
Image.png

我们要判断一个java类是不是同一个类,我们除了要 类路径,类名要一致以外 还需要这个ClassLoader一致

如果说你Hook的时候用的默认的ClassLoader去进行Hook是找不到这个类的,但是这个类确确实实是已经加载了,只不过是壳的ClassLoader去进行加载的,所以要先去得到壳的ClassLoader之后才能去找到这个函数,这里讲下免费壳的ClassLoader如何去获取

将加固后的壳拖入Jadx中,找到context的方法,并不一定是attachBaseContext方法但是基本是这个,并不一定全部是,将带有Context方法去Hook他 把Context接受下来

Java.perform(function(){
    var StubApp = Java.use('com.stub.StubApp');     //获取类
    console.log(StubApp);
    StubApp.attachBaseContext.implementation = function(context){   //得到后Hook attachBaseContext方法.implementation去复写方法
        this.attachBaseContext(context);    //在复写需要原函数先执行
    }
    });

这里为什么需要先执行呢?可以看jadx代码 attachBaseContext方法他入口加载比较早,会去加载一些加固的so,这些so是会来用解密他的dex文件,普通加固就是将dex文件加密了在加载的时候需要对dex文件进行解密在进行加载,所以要先把所有dex加载完毕后在Hook才能找到类
Image.png

拿到后,这里需要使用Spawn注入(启动前就注入)

Java.perform(function(){
        var StubApp = Java.use('com.stub.StubApp');     //获取类
        console.log(StubApp);
        StubApp.attachBaseContext.implementation = function(context){   //得到后Hook attachBaseContext方法.implementation去复写方法
            this.attachBaseContext(context);    //在复前需要原函数先执行
            var classLoader = context.getClassLoader();   //这样就可以得到ClassLoader加载后的类了
            console.log('classLoader: ', classLoader);  
            Java.classFactory.loader = classLoader;     //如果需要自己指定classLoader的话就需要Java.classFactory.loader给他覆盖掉,把你的classLoader赋给他


            //后续在用Java.use的话就是用的被替换掉的classLoader去寻找所有的类了
            //一般找不到有两种情况 1.加固的信息没有处理好 2.加固之前对okhttp3进行混淆了
            var certificatePinner = Java.use('okhttp3.CertificatePinner');
            console.log('certificatePinner: ', certificatePinner);
        }

    });

可以看到找得到他的加固后的类
Image.png

我们这里用frida版本的JustTrueme,他的内容会比xposed的内容更加全一些,修改一些前面的内容即可,就可以使用charles+Postern抓包了
Image.png

本文链接:

https://www.linqi.net.cn/index.php/archives/114/