Netty 开发Mitm解决请求响应匹配问题
## 前言
最近着迷开发Mitm工具,希望能够实现对安卓系统的一键系统级证书注入、流量劫持以及插件化的请求响应处理,从而更好的提效。
由于Un1kAndroid前期由JavaFx开发,于是最终选择了Netty作为我的网络编程框架。开发过程就不说了,只需要对Netty有基础的认识以及会使用API即可。
由于netty的I/O操作都是异步的,所以在开发过程中,我遇到了无法匹配上代理的请求响应流量的问题,看了很多文章都没有写清楚怎么解决这个问题,可能使用的场景不太一样,最终是通过本文的方法解决的,希望能够提供一些帮助。
## ChannelFuture
在Netty中所有的I/O操作都是异步的,这意味着任何的I/O调用都将立即返回,而不保证这些被请求的I/O操作在调用结束的时候已经完成。
取而代之地,你会得到一个返回的ChannelFuture实例,这个实例将给你一些关于I/O操作结果或者状态的信息。
## Test
所以我们需要去研究一下,设置channelFuture监听器时的一些参数变量,代码会出现在差不多这个位置:
this.httpsRequestCf.addListener( (ChannelFutureListener)(future) ->
在代码下面加一行:
System.out.println("写入响应的ChannelID:"+future.channel().id());
并且观察HttpProxyResponseHandler
这个handler的channelRead
方法被触发时候的channel_id:
开启代理转发流量到端口,日志如下:
通过对几个写入响应的channel_id做查找,发现都是一一匹配的,响应并不会共用channel_id。由此我们就有了思路:
1、https的流量代理下,握手结束后要写入clientrequest到server,创建channelFuture时获取id,把请求包以及相关参数创建类,并把类加到全局的list对象列表里
2、响应触发获取当前的channel_id,找到list对象列表中属性id为此id的对象,对对象的response属性做字符串追加的操作(https响应是分段read),一直到响应结束。
最终我们可以在全局的MitmFlow的List里观察到所有被捕获的流量请求包,以及对应的响应channel_id
## 放个工具图
感谢CFC4N、Lilac给我的一些帮助。