项目场景:
这是一款金融类型的安卓app,有着root检测,与sslpinning校验,并且带有壳。下载的unpinning脚本根本行不通,接下来咱们看看该怎么去分析。众所知周,要分析一款app抓包只是第一步。偏偏是第一步就难倒不少人,本文只做知识要点记录,均会脱敏处理。大佬们轻喷
问题描述
一般来说我们拿到apk都迫不及待的装到手机上,立马开始抓包,结果就会和下图一样
文章来源地址https://www.toymoban.com/news/detail-444559.html
Charles这边是这样显示的
初步判断是存在sslpinning校验
sslpinning校验定位:
把apk拖动到apk,发现加壳了,随后使用frida-dump进行脱壳,拿到dex,使用jadx-gui进行反编译。
经过r0capture 工具可以定位出网络包收发位置,以下是在总众多调用栈寻找到正确的调用栈:
接下来直接偷懒,不得不说gpt的面世,给各行各业都带来了便利,对于安卓逆向而言,ai简直就是一个学习导师不厌其烦的解答,随后我们将以上调用栈发送给gpt。问问它,哪里才是最有可能是sslpinning校验的地方,大家最好是以开发人员的角度去提问。
最终我们在第二行找到了和证书校验有关的地方,也就是
okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:336)
在jadx-gui工具搜索上面的类名,在类中找到如下代码:
hostnameVerifier()此函数将我们需要使用frida hook的函数方法,在这个对象里还有verify方法,看verify函数形参是传递了2个参数,分别是一个url网址和session,我们先hook 一下verify函数得到如下信息:参数1也确实是一个url网址,并且和我们抓包工具的域名一致,接下来我们看看hostnameVerifier函数是什么样的
它会返回一个HostnameVerifier类型的数据,继续hook hostnameVerifier() 函数,打印返回值
明显打印不出来,使用JSON.stringify()将这个object对象转字符串得到以下信息
从图中得知实例的类型和类的实现路径,我们把实现的类路径去jadx-gui搜索一下,得到如下:
以上图中的verify()是一个native修饰过的函数,具体实现流程在so,由于经过测试只要返回true,就能正常抓包了。就不再深入分析。
附上frida的完整hook抓包代码:
Java.perform(function(){
console.log("===start===");
Java.enumerateClassLoaders({
onMatch: function (classLoader) {
try {
if (classLoader.findClass("com.xxxx.http.RetrofitClient$createRsaOkHttpClient$1")) {
console.log("===success===");
Java.classFactory.loader = classLoader;
var RetrofitClient$createRsaOkHttpClient$1 = Java.use("com.xxxx.http.RetrofitClient$createRsaOkHttpClient$1");
RetrofitClient$createRsaOkHttpClient$1["verify"].implementation = function (str, sSLSession) {
console.log('verify is called' + ', ' + 'str: ' + str + ', ' + 'sSLSession: ' + sSLSession);
// var ret = this.verify(str, sSLSession);
// console.log(ret);
return true;
};
var RetrofitClient$createOkHttpClient$1 = Java.use("com.xxxx.http.RetrofitClient$createOkHttpClient$1");
RetrofitClient$createOkHttpClient$1["verify"].implementation = function (str, sSLSession) {
console.log('verify is called' + ', ' + 'str: ' + str + ', ' + 'sSLSession: ' + sSLSession);
return true;
};
}
} catch (e) {
}
},
onComplete: function () {
}
});
try {
} catch (e) {
}
});
上述的frida代码主要功能是枚举所有的classloader查找指定类名进而实现hook,在dex没完全加载完成是找不到类的。我们需要遍历所有classloader。文章来源:https://www.toymoban.com/news/detail-444559.html
到了这里,关于chatGPT与逆向的相遇,快速解决sslpinning抓包问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!