当前位置:   article > 正文

chatGPT与逆向的相遇,快速解决sslpinning抓包问题_ssl pinning 抓包

ssl pinning 抓包

项目场景:

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


问题描述

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

c94e4f323b1b4e6db9b8a70176095e5e.jpeg

 

 

Charles这边是这样显示的

8612ff98cb5840789dadd7bdf19688fe.png

 

 初步判断是存在sslpinning校验

 


sslpinning校验定位:

把apk拖动到apk,发现加壳了,随后使用frida-dump进行脱壳,拿到dex,使用jadx-gui进行反编译。

4508f55647304432b3218062ec898964.png

 经过r0capture 工具可以定位出网络包收发位置,以下是在总众多调用栈寻找到正确的调用栈:

0779a437ddb74ca887f372c75d7ee4be.png

 接下来直接偷懒,不得不说gpt的面世,给各行各业都带来了便利,对于安卓逆向而言,ai简直就是一个学习导师不厌其烦的解答,随后我们将以上调用栈发送给gpt。问问它,哪里才是最有可能是sslpinning校验的地方,大家最好是以开发人员的角度去提问。

52da1459fa7149098d329b6c011886a9.png

 最终我们在第二行找到了和证书校验有关的地方,也就是

okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:336)

在jadx-gui工具搜索上面的类名,在类中找到如下代码:

10c089a3dd5a4da289b5fd650bad1094.png

 

hostnameVerifier()此函数将我们需要使用frida hook的函数方法,在这个对象里还有verify方法,看verify函数形参是传递了2个参数,分别是一个url网址和session,我们先hook 一下verify函数得到如下信息:

3b2f74ccb2174960bc9fc6be9a57bf74.png

595fae7cf0fa4e9cbed8a9458cb75602.png

 参数1也确实是一个url网址,并且和我们抓包工具的域名一致,接下来我们看看hostnameVerifier函数是什么样的

495ebaf50ce9400fb47656eda39fee45.png

 

它会返回一个HostnameVerifier类型的数据,继续hook hostnameVerifier() 函数,打印返回值

 

a4c36f4467624146afbce846e97e5e51.png

明显打印不出来,使用JSON.stringify()将这个object对象转字符串得到以下信息

dfa916328e114039ba4b874f837dd5f6.png

 

 从图中得知实例的类型和类的实现路径,我们把实现的类路径去jadx-gui搜索一下,得到如下:

172df751b4e549259e07d322de21f8d6.png

 以上图中的verify()是一个native修饰过的函数,具体实现流程在so,由于经过测试只要返回true,就能正常抓包了。就不再深入分析。

1884405b66694b65839fea7e24ecfa50.png

 

附上frida的完整hook抓包代码:

  1. Java.perform(function(){
  2. console.log("===start===");
  3. Java.enumerateClassLoaders({
  4. onMatch: function (classLoader) {
  5. try {
  6. if (classLoader.findClass("com.xxxx.http.RetrofitClient$createRsaOkHttpClient$1")) {
  7. console.log("===success===");
  8. Java.classFactory.loader = classLoader;
  9. var RetrofitClient$createRsaOkHttpClient$1 = Java.use("com.xxxx.http.RetrofitClient$createRsaOkHttpClient$1");
  10. RetrofitClient$createRsaOkHttpClient$1["verify"].implementation = function (str, sSLSession) {
  11. console.log('verify is called' + ', ' + 'str: ' + str + ', ' + 'sSLSession: ' + sSLSession);
  12. // var ret = this.verify(str, sSLSession);
  13. // console.log(ret);
  14. return true;
  15. };
  16. var RetrofitClient$createOkHttpClient$1 = Java.use("com.xxxx.http.RetrofitClient$createOkHttpClient$1");
  17. RetrofitClient$createOkHttpClient$1["verify"].implementation = function (str, sSLSession) {
  18. console.log('verify is called' + ', ' + 'str: ' + str + ', ' + 'sSLSession: ' + sSLSession);
  19. return true;
  20. };
  21. }
  22. } catch (e) {
  23. }
  24. },
  25. onComplete: function () {
  26. }
  27. });
  28. try {
  29. } catch (e) {
  30. }
  31. });

 上述的frida代码主要功能是枚举所有的classloader查找指定类名进而实现hook,在dex没完全加载完成是找不到类的。我们需要遍历所有classloader。


 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/257392
推荐阅读
相关标签
  

闽ICP备14008679号