admin管理员组

文章数量:1530034

项目场景:

这是一款金融类型的安卓app,有着root检测,与sslpinning校验,并且带有壳。下载的unpinning脚本根本行不通,接下来咱们看看该怎么去分析。众所知周,要分析一款app抓包只是第一步。偏偏是第一步就难倒不少人,本文只做知识要点记录,均会脱敏处理。大佬们轻喷


问题描述

一般来说我们拿到apk都迫不及待的装到手机上,立马开始抓包,结果就会和下图一样

 

 

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。


 

 

本文标签: 快速chatGPTsslpinning