赞
踩
这是一款金融类型的安卓app,有着root检测,与sslpinning校验,并且带有壳。下载的unpinning脚本根本行不通,接下来咱们看看该怎么去分析。众所知周,要分析一款app抓包只是第一步。偏偏是第一步就难倒不少人,本文只做知识要点记录,均会脱敏处理。大佬们轻喷
一般来说我们拿到apk都迫不及待的装到手机上,立马开始抓包,结果就会和下图一样
Charles这边是这样显示的
初步判断是存在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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。