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)

结果

相关推荐
NE_STOP27 分钟前
SpringBoot--如何整体读取多个配置属性及其相关操作
java·spring
apihz1 小时前
通用图片搜索-搜狗源免费API接口使用指南
android·java·python·php·音视频
风象南1 小时前
基于 SpringBoot 的 REST API 与 RPC 调用的统一封装
java·spring boot·后端
素雪风华1 小时前
Jenkins+Gitee+Docker容器化部署
java·docker·gitee·jenkins·springboot·持续部署
用户40315986396632 小时前
带 WriteBuffer 的内存读写操作
java·算法
岁忧2 小时前
(LeetCode 面试经典 150 题 ) 209. 长度最小的子数组(双指针)
java·c++·算法·leetcode·面试·go
码银2 小时前
基于Java的Markdown到Word文档转换工具的实现
java·word
Mr_Xuhhh3 小时前
QWidget的属性
java·数据库·c++·qt·系统架构
小张在编程3 小时前
Java设计模式实战:备忘录模式与状态机模式的“状态管理”双雄
java·设计模式·备忘录模式
大葱白菜3 小时前
Java 接口与抽象类:深入解析两者的区别及应用场景
java·后端