混淆后 OKHTTP 框架的通用抓包方案探索
看雪论坛作者ID:Avacci
https://bbs.pediy.com/user-home-879855.htm
目标:
okhttp因其稳定、开源、简单易用被众多的app开发人员所使用。okhttp中的execute和enqueue分别为发出同步和异步请求,通过对okhttp发起请求的整个流程进行简单分析就可以快速得到合适的hook点完成对app网络请求的抓包和溯源。但是,为了防止被快速逆向分析,部分app针对okhttp的代码进行了混淆,请以课程中的被混淆了的okhttp框架的apk为例,提出针对混淆了的okhttp框架,进行抓包和溯源的通用解决方案。
针对okhttp框架的抓包,暂时知道两种使用frida的hook方式。
第一种是自定义一个拦截器,并添加到okhttp框架的拦截器链中。如Yang神的实现(https://bbs.pediy.com/thread-252129.htm)。
还有一种是hook RealCall类的enqueue和execute方法,获取到返回的response对象。然后逐步解析出请求和响应的内容。(如https://github.com/siyujie/OkHttpLogger-Frida)
OkHttpLogger-Frida的作者还考虑到了okhttp框架的代码被混淆的情况。它专门打包了一个okhttpfind.dex文件来从Java层寻找okhttp的特征,并记录所有后续要用到的类名,方法名和变量名。
通过查阅其代码(https://github.com/siyujie/okhttp_find),发现它寻找特征的方法也很简单粗暴。就是先去所有可能属于okhttp框架层的类中找到OkHttpClient$Builder内部类。该类的特征为有四个List类型的成员变量,其中两个有final修饰符,两个的列表类型为接口类型。
一旦找到满足这个条件的类,就可以通过getEnclosingClass方法获取该类的外部类,也就定位到了关键类OkHttpClient。关键实现代码如下:
通过hook NativeCrypto类的SSL_write方法,得到一下调用栈:
定位CallServerInterceptor的过程应该也可以用frida完成,就是先hook出调用堆栈后,从上至下逐个类判读是否满足Interceptor接口实现类的特征。将找到的第一个满足条件的类作为拦截器链中的最后一个拦截器。 解析过程中对RequestBody的处理没处理好。 ResponseBody只处理了UTF-8编码的内容,对于其他编码的内容(如Gzip),则暂时未处理。 不太稳定,时不时会挂掉。但可能是app自带的反hook措施。
逆锋起笔
是一个专注于程序员圈子的技术平台,你可以收获最新技术动态
、最新内测资格
、BAT等大厂的经验
、精品学习资料
、职业路线
、副业思维
,微信搜索逆锋起笔
关注!
推荐阅读:
别再用 LayUI 了 再见,Linux 浏览器缓存的力量 8 年开发,连登陆接口都写这么烂... 横空出世,比 Visio 快 10 倍的画图工具来了 明天见(。・ω・。)ノ♡