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)

结果

相关推荐
七夜zippoe32 分钟前
事务方案选型全景图:金融与电商场景的实战差异与落地指南
java·分布式·事务
杨二K2 小时前
认识HertzBeat的第一天
java·hertzbeat
DevilSeagull2 小时前
JavaScript WebAPI 指南
java·开发语言·javascript·html·ecmascript·html5
期待のcode4 小时前
Spring框架1—Spring的IOC核心技术1
java·后端·spring·架构
葵野寺4 小时前
【RelayMQ】基于 Java 实现轻量级消息队列(七)
java·开发语言·网络·rabbitmq·java-rabbitmq
书院门前细致的苹果4 小时前
JVM 全面详解:深入理解 Java 的核心运行机制
java·jvm
上官浩仁5 小时前
springboot excel 表格入门与实战
java·spring boot·excel
Hello.Reader5 小时前
从零到一上手 Protocol Buffers用 C# 打造可演进的通讯录
java·linux·c#
树码小子6 小时前
Java网络初识(4):网络数据通信的基本流程 -- 封装
java·网络
稻草人想看远方6 小时前
GC垃圾回收
java·开发语言·jvm