前言:
(本帖只用于学习和交流,切勿用于非法用途!!!)
正文:
前段时间 在自己做开发的时候 发现一个 很好用的工具
OKHttp的 拦截器 大概 效果 如下
(何为拦截器? 就是 在 每次发送网络请求的时候 都会走的 一个 回调)
现在 OkHttp 也是 谷歌 推荐的 一款 网络请求 框架
不管是现在 很火的 Retrofit2 也都是基于OkHttp的封装
如果 每次 看 Log 服务器 返回的数据 等 都需要用 PostMan发请求 显得有点 low
可以直接集成 拦截器 在发送请求的 时候打印出来 就如同 上图
使用也很简单
然后 在 OkHttp 创建的时候 调用 即可
1builder.addInterceptor(loggingInterceptor);
如果 我可以 通过 Xposed 实现Hook 动态 添加自己的 拦截器 是不是 就可以 做出来 一款基于OkHttp的 通杀器
话不多说 开整
这个时候需要 考虑几个 问题
1,怎么拿到对方 进程的 Classloader
2,我应该Hook 什么方法 才能把我自己的拦截器 进行 注入
3,注入以后 我应该 怎么初始化 这个拦截器 类 将其添加进去
4,因为 OkHttp 的拦截器 是需要 导入 三方 依赖的 如果 app没有 导入 应该怎么办 如何实现动态加载
问题1:
想拿到 地方 ClassLoader 很简单 直接 Hook attach 固定 系统级别的方法
问题2:
在 OkHttp 初始化的完毕的时候 肯定会调用 build方法
就用这个当 突破口 直接 xposed 挂钩
在 挂钩 之前 需要 判断 一下 对方 是否使用了 OkHttp 用 刚刚 拿到的 Classloader 试着反射一下 看看 能不能 拿到 okHttpClient$Build
也就是OkHttp里面的 特征类
拿到了 以后 直接对 build函数 进行 挂钩
这块 看到了 在 build调用 之前 也就是 OkHttpClient 初始化 之前 进行 添加 动态 拦截器
看上面代码可知 用了反射 拿到 这个 拦截器集合的字段 然后 添加的 拦截器
其实 在 okHttp里面 添加 拦截器 方法如下
其实最终 就是 在 拦截器 集合里面的 进行添加
我只需要 动态 在这个 拦截 里面 添加即可
问题 3:我应该 怎么初始化 拦截器
先试着 反射一下 看看 对方 的 app 里面 是否 导入了 拦截器的 依赖 如果 拿到了 既 直接初始化
这块代码 很重要 也是核心代码 回顾一下 拦截器创建的 代码
在 构造 里面 传的是一个 接口 而这个接口 就是 在 这个 拦截器里实现的 内部接口
还需要 调用 setLevel 设置 等级 Body是将全部数据都打印 Body这个 是 level 里面的一个枚举
用动态代理的方式 Proxy.newProxyInstance 拿到 这个 接口的实体类 然后 作为 参数 new 出来拦截器
反射拿到枚举 作为 setLevel 的参数 进行 反射调用 即可 初始化 完毕 直接添加到拦截器集合里
问题4:
如果 这个 app没有 导入 拦截器的log 依赖
反射 这个 是拿不到的 这个时候需要用他的 Classloader进行 动态 加载
先把 拦截器log 的 jar包 放到 assets 目录下 在 app模块 启动的时候 初始化的 把Jar 保存到 SD卡内
在没有 找到的时候 直接进行 动态 加载
第四个 参数 传入 目标的 ClassLoader 直接进行 LoadClass即可 然后进行 下面的初始化
大功告成
随便 找了几个 App 测试一下 效果 还可以 具体 是什么 我就不说了
这个 东西有个弊端 ,就是 比如 app被混淆了 路径肯定会对不上,我个人想法就是 可以根据方法的签名信息定位到
还有时候 虽然 集成 了 OKHTTP但是 他没有调用 Build 方法 进行初始化 不知道 为啥 这块代码可以 优化的 看看 有没有其他的突破口
我现在 这个思路 只是 添加了 LOG拦截器 拦截器 还有很多种 比如 直接 修改 请求头 等参数的 拦截器 具体 可以 百度 看看
项目地址:
https://github.com/w296488320/XposedOkHttpCat
推荐一波 自己的 空白混淆 :
https://bbs.pediy.com/thread-247680.htm
2019-07-09
更新内容:(Git代码同步更新)
1,添加了多个函数hook 以前只是hook了build函数
,添加了构造方法的hook,模式1(hook build函数),模式2(hook构造函数)切换,用户自行选择。
2,修复了多次调用build等会添加多个拦截器的bug
3,修改了动态加载dex失败的问题。
编译好成品下载地址:
https://pan.baidu.com/s/1RSizuwFP11iTAnHxRoLxVA
提取码:8wu1
具体请求信息看log E等级。
如果对 逆向,脱壳,新技术 感兴趣的 同学 可以加 我Q群 欢迎各位能人志士 一起讨论
欢迎加入故事,群聊号码:773642813
---------------------------------------------------------------------------------------------------------------------
喜欢逆向 ,有问题需要求助的 可以 加下 小密圈 不懂得可以直接问我
我正在「故事」和朋友们讨论有趣的话题,你⼀起来吧?
网友评论