likes
comments
collection
share

Java网络抓包: 使用wintun完成http请求

作者站长头像
站长
· 阅读数 3

目的

使用wintun完成http请求,了解tcp协议和http请求过程。我们通过java的tcp获取到数据然后封装一层写入wintun创建的网络适配中。

http请求

在windows下简单发起http请求,可以通过cmd下执行 curl example.com

简单了解一下发起http请求流程,首先通过域名查询dns服务器获取ip,然后ip通过路由表对应的网络适配器,建立tcp连接交换数据。

Wireshark分析http过程

先使用Wireshark监听以太网,过滤栏输入dns contains "example",cmd下执行 curl example.com

Java网络抓包: 使用wintun完成http请求

dns响应ip4地址和ip6地址,ip4地址:93.184.216.34 ip6地址:2606:2800:220:1:248:1893:25c8:1946

我们用ip4在Wireshark过滤 ip.addr == 93.184.216.34,可以看到tcp协议的数据,看到三次握手,还有后面的四次挥手(他应该是把第二次挥手和第三挥手和在一起了)

Java网络抓包: 使用wintun完成http请求

Wireshark右键->追踪流->TCP Stream 查看整个tcp数据包流。

可以发现发送包和接收包只是ip和端口交换。实际上我们只管回复方的,通过java的socket已经完成tcp协议,从socket的数据流中拿到数据然后发送给网络适配器。

域名走自定义网络适配器

首先得让example.com走自定义的网络适配器,如何让他走呢?添加路由表规则。

默认自己创建得网络适配器可以设置ip和子掩码。子掩码指指定一个范围会走该适配器。

例如:ip: 192.168.1.1 子掩码:255.255.255.0 那么 192.168.1.x 都会走该适配器。(x可以是1~255)

通过cmd下执行 route print 可以查看路由表 ,跃点数指的优先级别,越小越优先。

在cmd ping example.com 获得实际ip

在window下可以修改hosts将域名解析成指定的临时ip

最后我们可以通过设置hosts,将example.com指定到适配器的ip的子掩码内。

在java中socket把临时ip变成实际ip访问。(不设置成实际ip会导致死循环的,数据包一直在网路适配器中逗留,因为那个ip是在网路适配器的子掩码中)

完成TCP协议

通过Wireshark可以看到 example.com 的 tcp 握手包。

了解一下tcp协议,三次握手和四次挥手。

在Java中完成tcp协议,只用负责创建回应数据包,写入网络适配器中。构建数据包通过pcap4j,构建数据包主要有两个重要的序号seq和ack。seq是自己已发的序列号,ack是对方已发的序列号,seq的计算,发送syn时seq+1,发送带有数据时seq+数据长度,发送fin时seq+1,其他不加。同理计算ack也是一样。可能会遇到这边发送了fin结束标志,socket那边还读取写入网络适配器问题。

总结

在windows下我们通过设置hosts将example.com域名设置指定ip,走自定义网络适配器。通过java调用wintun创建网络适配器,获取tcp数据包,通过java创建socket连接完成tcp连接获取到数据,封装好数据包写入网络适配中,解析和构建数据包使用通过pcap4j,构建。

具体操作

修改window下hosts文件,添加下面代码(hosts在C:\Windows\System32\drivers\etc)

172.29.1.25 example.com

具体代码:wintun-02 · 断续/learn-demo - 码云 - 开源中国 (gitee.com)

结果

Java网络抓包: 使用wintun完成http请求