针对免费加固型App进行抓包
使用charles+Postern 出现网络开小差,使用zip查看发现app中包含okhttp3,应该是做了证书校验
了解情况
如果要Hook就需要拿到加固的ClassLoader
使用jadx打开,找到stub.StubApp.attachBaseContext,通过加固后的上下文可以通过context去获取加固后的ClassLoader,然后得到他加载的所有类
我们要判断一个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才能找到类
拿到后,这里需要使用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);
}
});
可以看到找得到他的加固后的类
我们这里用frida版本的JustTrueme,他的内容会比xposed的内容更加全一些,修改一些前面的内容即可,就可以使用charles+Postern抓包了