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)

结果

相关推荐
JH30738 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
Coder_Boy_9 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble9 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟9 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖9 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_124987075311 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_11 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.11 小时前
Day06——权限认证-项目集成
java
瑶山11 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy11 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法