首页
论坛
课程
招聘
[原创] 如何实现 Https拦截进行 非常规“抓包”(20.9.13-代码更新)
2019-6-20 13:39 21534

[原创] 如何实现 Https拦截进行 非常规“抓包”(20.9.13-代码更新)

2019-6-20 13:39
21534

前言:

(本帖只用于学习和交流,切勿用于非法用途!!!)

正文:

前段时间 在自己做开发的时候 发现一个 很好用的工具 

OKHttp的 拦截器  大概 效果 如下 

(何为拦截器? 就是 在 每次发送网络请求的时候 都会走的 一个 回调)



现在 OkHttp 也是 谷歌 推荐的 一款 网络请求 框架 

不管是现在 很火的  Retrofit2  也都是基于OkHttp的封装 


如果 每次 看 Log 服务器 返回的数据 等 都需要用 PostMan发请求 显得有点 low

可以直接集成 拦截器 在发送请求的 时候打印出来 就如同 上图 


使用也很简单  


然后 在 OkHttp 创建的时候  调用 即可 

builder.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







2019-07-09

更新内容:(Git代码同步更新)

1,添加了多个函数hook  以前只是hook了build函数

,添加了构造方法的hook,模式1(hook  build函数),模式2(hook构造函数)切换,用户自行选择。

2,修复了多次调用build等会添加多个拦截器的bug

3,修改了动态加载dex失败的问题。




2019年11月14日16:27:13

1,修复动态加载 DexClassloader不匹配 问题 

以前的代码里 生成的 Classloader 是自定义的 ClassLoader如果 用这个 classloader去加载 拦截器 在把拦截 添加进去的话 会提示 classloader不配的 问题 


仿照 热修复的原理 把 原来的 classloader和自定义的classloader里面的 DexElements数组进行合并 代码如下 


获取 原来项目里面的 classloader DexElements数组 




再把自己加载的classloader 拿到手 然后进行合并 类似 腾讯的 Tinker动态加载 里面的类 




将两个 数组合并以后 直接用原来的 Classloader加载 拦截器 集合 动态加载 





成品 放在了附件 






具体请求信息看log E等级    

过滤条件  XposedNet  为 抓包信息的 Log 。

XposedInto 为调试日志 。


更新日志

2020年9月13日14:42:53

1,增加okHttp 4.0支持

2,去掉模式选择

3,自识别优化







[招聘] 欢迎你加入看雪团队!

最后于 2020-9-13 14:43 被珍惜Any编辑 ,原因: 错误纠正
上传的附件:
收藏
点赞2
打赏
分享
最新回复 (40)
雪    币: 61
活跃值: 活跃值 (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Ddddz 活跃值 2019-6-20 13:57
2
0
图裂了,珍惜大佬
雪    币: 6
活跃值: 活跃值 (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dreamerqq 活跃值 2019-6-20 14:03
3
0
膜大佬,图挂了
雪    币: 268
活跃值: 活跃值 (105)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
currwin 活跃值 1 2019-6-20 14:15
4
0
大佬牛逼
雪    币: 292
活跃值: 活跃值 (1416)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
珍惜Any 活跃值 2019-6-20 14:21
5
0
currwin 大佬牛逼
别这样,我看你视频  学起来的 哈哈哈 
雪    币: 680
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chenbihui 活跃值 2019-6-20 14:59
6
0
感谢开源!!!注释和log一直很详细,对学习很有帮助!
雪    币: 7
活跃值: 活跃值 (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
重庆rcbing 活跃值 2019-6-20 15:25
7
0
来来来,大家挤一挤,一起围观大佬。虽然天气热,但本论坛空调24小时开放。
雪    币: 2144
活跃值: 活跃值 (10021)
能力值: (RANK:75 )
在线值:
发帖
回帖
粉丝
Editor 活跃值 2019-6-20 15:53
8
0
666,厉害啊
雪    币: 5297
活跃值: 活跃值 (472)
能力值: ( LV5,RANK:76 )
在线值:
发帖
回帖
粉丝
Imyang 活跃值 1 2019-6-20 16:41
9
0
666,厉害啊
雪    币: 1054
活跃值: 活跃值 (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yikuaiyingbi 活跃值 2019-6-20 16:53
10
0
66666666
雪    币: 5249
活跃值: 活跃值 (200)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
cqzhou 活跃值 2019-6-20 17:00
11
0
66666666
雪    币: 36
活跃值: 活跃值 (160)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
芃杉 活跃值 2019-6-21 10:04
12
0
66666666
雪    币: 1882
活跃值: 活跃值 (718)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
virjar 活跃值 1 2019-6-21 22:38
13
0
https://gitee.com/virjar/ucrack/blob/master/app/src/main/java/com/virjar/ucrack/plugin/socket/InputStreamWrapper.java
雪    币: 1882
活跃值: 活跃值 (718)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
virjar 活跃值 1 2019-6-21 22:38
14
1
https://gitee.com/virjar/ucrack/blob/master/app/src/main/java/com/virjar/ucrack/plugin/socket/InputStreamWrapper.java

我这个java的http协议通杀啊。okhttp混淆都可以拦截,还有纯socket模式。都可解。就差native的流量拦截了
最后于 2019-6-21 22:39 被virjar编辑 ,原因:
雪    币: 241
活跃值: 活跃值 (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
THT-EX 活跃值 2019-6-22 19:31
15
0
666
雪    币: 280
活跃值: 活跃值 (293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huluxia 活跃值 2019-6-24 10:56
16
0
好人作品,必须顶大牛
雪    币: 1984
活跃值: 活跃值 (235)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
diypc 活跃值 2019-6-25 14:19
17
0
这个厉害, 大致看懂了
雪    币: 639
活跃值: 活跃值 (969)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Monkeylord 活跃值 2019-6-26 16:14
18
0
virjar https://gitee.com/virjar/ucrack/blob/master/app/src/main/java/com/virjar/ucrack/plugin/socket/InputS ...
感觉如果你采用动态代理的方式,代码会简单一点。
雪    币: 1882
活跃值: 活跃值 (718)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
virjar 活跃值 1 2019-6-26 17:36
19
0
Monkeylord 感觉如果你采用动态代理的方式,代码会简单一点。
没区别吧,复杂点在数据解析,不在怎么做侵入。而且,这个动态代理可能还复杂一些。。。。动态代理你要代理那个对象?
雪    币: 1530
活跃值: 活跃值 (252)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
skyun 活跃值 3 2019-6-27 17:35
20
0
大佬牛逼 66666666
雪    币: 69
活跃值: 活跃值 (243)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
iceway 活跃值 2019-6-29 13:30
21
0
都能ROOT了,还有啥干不了的?
雪    币: 301
活跃值: 活跃值 (24)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yshell 活跃值 2019-7-1 23:02
22
0
virjar https://gitee.com/virjar/ucrack/blob/master/app/src/main/java/com/virjar/ucrack/plugin/socket/InputS ...
大佬你好,使用您的ucrack抓包是否,POST参数没有被记录,不知道是不是我的使用方式有误。
雪    币: 1882
活跃值: 活跃值 (718)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
virjar 活跃值 1 2019-7-2 08:59
23
0
yshell 大佬你好,使用您的ucrack抓包是否,POST参数没有被记录,不知道是不是我的使用方式有误。
是我的bug。。。。。这个逻辑实习生写的,(顺手摔锅
雪    币: 2016
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
ioshackery 活跃值 2019-7-2 16:09
24
0
看看好不好使
雪    币: 18
活跃值: 活跃值 (72)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
轻快笑着行 活跃值 2019-7-4 18:57
25
0
先占楼
游客
登录 | 注册 方可回帖
返回