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

目的

使用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

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协议的数据,看到三次握手,还有后面的四次挥手(他应该是把第二次挥手和第三挥手和在一起了)

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)

结果

相关推荐
鶴哥只手遮天12 分钟前
Spring AI Alibaba 深度技术系列-第 05 章 编译与执行引擎:CompiledGraph、GraphRunner与三段式 Executor
java·人工智能·开源
开开心心_Every29 分钟前
免费压缩软件WinRAR无弹窗、广告干扰
java·开发语言·前端·spring·智能手机·word·winrar
计算机毕设定制辅导-无忧学长32 分钟前
《基于微信小程序的个人智能刷题助手的设计与实现》
java·spring boot·mysql·微信小程序·uniapp·个人智能刷题助手系统
步行cgn1 小时前
Spring MVC 中实现 request 域效果的几种方式
java·后端
Thomas.Sir1 小时前
第3课:SpringBoot4.x 自动配置原理:@EnableAutoConfiguration底层源码剖析
java·spring boot
Rain的Java大神之路1 小时前
MySQL 被高并发打爆?从定位到分库分表逐层拆解(含秒杀库存实战)
java·后端·面试
cc_瀚海知行1 小时前
工具调用 6|助手什么时候该停下来?
java·服务器·前端·人工智能·python·ai
YDS8291 小时前
Small Spring IOC篇:应用上下文实现和Bean的扩展
java·后端·spring
Pniubi1 小时前
ConcurrentHashMap拆分线程池难点再讲
java·jvm
golang学习记1 小时前
IDEA 的 Java 智能,现在跑到 Cursor 和 VS Code 里去了
java·ide·vscode·intellij-idea·claude code