Java TCP 抓包简单示例

由于目前网上没有一篇能真正方便读者操作的此类文章,本文对此通过示例做个简单介绍。

缘起

有一天本来在看头条,然后看到一则游戏的广告,看画面可能是我喜欢的建造类型(纪元1404,卡特尔一类)的游戏,就下载玩了。由于同时间我在看《网络是怎样连接的》,所以就在想如何通过抓包获取游戏中的地图数据。

前两张图是游戏截图,暴露了个人坐标,和三体中暴露地球坐标一样危险。

第3张图是最近刚看过的一本书,是一本很详细介绍网络连接的书,但不是TCP抓包方面的书。

抓包过程中发现地图数据很难分析,但是世界对话却很简单,因此就开始分析对话,分析出来后,就想着怎么写个程序来获取这些数据呢,网上搜了一些例子,都是比较早的,而且64位支持的不是很好,所以就有了本文。

准备工作

由于我很早之前安装 Wireshark 的时候安装过 winpcap,所以没有注意这个软件的兼容性,下载地址如下:

https://www.winpcap.org/

Windows 必须安装的一个软件,其他工具都是基于 winpcap 的。

现在网上能查到和 Java 抓包相关的基本都是 jPcap,由于找不到版本配套的下载文件和64位的 dll,我找到了另一个工具 jnetpcap

下载地址:https://github.com/ruedigergad/clj-net-pcap/blob/master/jnetpcap/jnetpcap-src-1.4.r1425-1.zip

打开页面点击下载,这个链接不能直接通过迅雷等软件下载。

对应网盘地址:http://pan.baidu.com/s/1o7GvB5o 密码:5g1y

下载解压后,将 jnetpcap.dll 和 jnetpcap-pcap100.dll 放到 Java 的 bin 和 jre/bin 两个目录下。

额外准备

希望这个游戏能坚持到你看这篇文章的时候。

如果你想按照我这里的过程,针对这个游戏进行抓包测试,可以额外装一些软件进行,如果仅仅是如何使用 Java 抓包,不需要这些。

  • 安卓游戏模拟器:逍遥安卓多开管理器
  • Wireshark 网络分析软件
  • 游戏链接:http://pan.baidu.com/s/1c1Qj3f6 密码:6jgw
  • 安卓无Root抓包软件:链接:http://pan.baidu.com/s/1o8ecqhk 密码:d1k6

通过安卓抓包软件简单获取服务器IP等信息,如下图:

简单抓包数据分析:

分解代码

以下内容和游戏无关,就是基本的用法。

获取网卡

通过下面代码获取当前机器的网卡信息。

StringBuilder errbuf = new StringBuilder();int r = Pcap.findAllDevs(alldevs, errbuf);
if (r == Pcap.NOT_OK || alldevs.isEmpty()) {System.err.printf("Can't read list of devices, error is %s", errbuf.toString());return;
}

输出网卡的信息。

System.out.println("Network devices found:");int i = 0;
for (PcapIf device : alldevs) {System.out.printf("#%d: %s [%s]\n", i++, device.getName(), device.getDescription());
}

在我电脑上输出的信息如下。

Network devices found:
#0: \Device\NPF_{22788384-70D1-47E6-A182-DEAE1D091D2C} [VMware Virtual Ethernet Adapter]
#1: \Device\NPF_{144877C1-CBA4-4E7A-B408-E482BFA7F59D} [VMware Virtual Ethernet Adapter]
#2: \Device\NPF_{93282E0F-D399-4904-95D5-062F4325FD48} [Microsoft]
#3: \Device\NPF_{055061E0-011E-488C-BF6C-D48252BCDEAB} [Microsoft]
#4: \Device\NPF_{6246A8BA-F000-4355-B3E0-5CAAF7229813} [VMware Virtual Ethernet Adapter]
#5: \Device\NPF_{E4AB7839-5786-427B-BB2A-E8C40C529494} [Realtek PCIe GBE Family Controller]

名字相同的网卡很难区分,还可以通过 device 获取网卡的 IP 信息来轻松识别网卡。

选择一个要监控的网卡

PcapIf device = alldevs.get(2);

可以根据更多信息来匹配一个网卡,这里简单选择的第3个网卡。

打开设备

int snaplen = 64 * 1024;
int flags = Pcap.MODE_PROMISCUOUS;
int timeout = 10 * 1000;
Pcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf);if (pcap == null) {System.err.printf("Error while opening device for capture: "+ errbuf.toString());return;
}

创建一个数据包处理器

PcapHandler<String> printSummaryHandler = new PcapHandler<String>() {public void nextPacket(String user, long seconds, int useconds,int caplen, int len, ByteBuffer buffer) {Date timestamp = new Date(seconds * 1000 + useconds/1000); // In millisSystem.out.printf("Received packet at %s caplen=%-4d len=%-4d %s\n",timestamp.toString(), // timestamp to 1 ms accuracycaplen, // Length actually capturedlen,    // Original length of the packetuser    // User supplied object);}
};

循环监听 10 个

//可以修改 10 为 Integer.MAX_VALUE 来长期监听
pcap.loop(10, printSummaryHandler, "jNetPcap rocks!");
//监听结束后关闭
pcap.close();

上述过程的完整代码见文末。

解析数据

前面提到的游戏,我个人对其中的世界聊天部分进行了分析,还提供了基于 Spring Boot 和 websocket 的小程序,可以启动后通过网页查看。

启动方法:

  1. 按照前面的要求配置好基础环境
  2. 安卓模拟器安装游戏,在12区创建一个账号(可以修改下面源码配置文件中的服务器IP)
  3. 登陆游戏后,下载下面的源码,修改代码中选择网卡的地方,改成自己连接网络的那个网卡
  4. 启动 TalkApplication 后访问 localhost:9090 即可

源码下载:

链接:http://pan.baidu.com/s/1min9JCk 密码:6sfd

已知问题:websocket 中没有维持心跳包,因此过段时间后会自动断开。

效果图:

完整示例代码

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapHandler;
import org.jnetpcap.PcapIf;import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class ClassicPcapExample {public static void main(String[] args) {List<PcapIf> alldevs = new ArrayList<PcapIf>(); // Will be filled with NICsStringBuilder errbuf = new StringBuilder();     // For any error msgs/********************************************* First get a list of devices on this system********************************************/int r = Pcap.findAllDevs(alldevs, errbuf);if (r == Pcap.NOT_OK || alldevs.isEmpty()) {System.err.printf("Can't read list of devices, error is %s", errbuf.toString());return;}System.out.println("Network devices found:");int i = 0;for (PcapIf device : alldevs) {System.out.printf("#%d: %s [%s]\n", i++, device.getName(), device.getDescription());}PcapIf device = alldevs.get(2); // We know we have atleast 1 deviceSystem.out.printf("\nChoosing '%s' on your behalf:\n", device.getDescription());/**************************************** Second we open up the selected device***************************************/int snaplen = 64 * 1024;           // Capture all packets, no trucationint flags = Pcap.MODE_PROMISCUOUS; // capture all packetsint timeout = 10 * 1000;           // 10 seconds in millisPcap pcap = Pcap.openLive(device.getName(), snaplen, flags, timeout, errbuf);if (pcap == null) {System.err.printf("Error while opening device for capture: "+ errbuf.toString());return;}/*********************************************************************** Third we create a packet hander which will be dispatched to from the* libpcap loop.**********************************************************************/PcapHandler<String> printSummaryHandler = new PcapHandler<String>() {public void nextPacket(String user, long seconds, int useconds,int caplen, int len, ByteBuffer buffer) {Date timestamp = new Date(seconds * 1000 + useconds/1000); // In millisSystem.out.printf("Received packet at %s caplen=%-4d len=%-4d %s\n",timestamp.toString(), // timestamp to 1 ms accuracycaplen, // Length actually capturedlen,    // Original length of the packetuser    // User supplied object);}};/************************************************************* Fourth we enter the loop and tell it to capture 10 packets************************************************************/pcap.loop(10, printSummaryHandler, "jNetPcap rocks!");/** Last thing to do is close the pcap handle*/pcap.close();}}

Java TCP 抓包简单示例相关推荐

  1. java抓取路由器tcp,IP 和 TCP 抓包分析实验

    IP 和 TCP 抓包分析实验 实验拓扑 图 1-1 注:如无特别说明,描述中的 R1 或 SW1 对应拓扑中设备名称末尾数字为 1 的设备, R2 或 SW2 对应拓扑中设备名称末尾数字为 2 的设 ...

  2. 计网 - TCP 实战:如何进行 TCP 抓包调试?

    文章目录 Pre 接口列表 开启捕获功能 观察 TCP 协议 消息视图 观察 HTTP 协议 过滤和筛选 报文颜色 总结 QA: 请你用自己最熟悉的语言,写一个 UDP 连接程序,然后用 Wiresh ...

  3. Wireshark下载、Wireshark使用、Wireshark抓包、ARP抓包、ICMP抓包、TCP抓包、HTTP抓包

    Wireshark下载.Wireshark使用.Wireshark抓包.ARP抓包.ICMP抓包.TCP抓包.HTTP抓包 Wireshark下载 Wireshark抓包即快速定位数据包技巧 常见协议 ...

  4. 【linux tcp抓包之三次握手】

    [linux tcp抓包之三次握手] 写在前面 三次握手 tcpdump 参数说明 返回值说明 IP 127.0.0.1.42004 > 127.0.0.1.5051 Flags [S] win ...

  5. 万能的wifi空口Tcp抓包方式

    主要介绍下最近使用中感觉很万能的空口抓包方式和wireshank分析工具使用: 目的:抓取各种设备网络通信过程中数据包,定位并分析软硬件设计中问题 背景: Tcp抓包方式有很多种,但是有一些限制: t ...

  6. Java 实现抓包程序

    前言 本学期计算机网络要求写一个抓包程序,我通过网上查阅资料,如何实现抓包,实现了一个较为简单的抓包程序. 项目准备 1. 首先得有 java 编译环境,安装并配置好 jdk:2. 需要安装 Winp ...

  7. Java实现抓包程序(网络协议分析程序)

    前言 本学期计算机网络要求写一个抓包程序,我通过网上查阅资料,如何实现抓包,实现了一个较为简单的抓包程序. 文章目录 前言 项目准备 一.抓包功能的基本实现 二.完整项目实现 1.界面布局 2.抓包功 ...

  8. 【网络】TCP抓包|RDMA抓包|ibdump、tcpdump用法说明

    目录 一.抓包命令 ibdump 抓包命令 tcpdump抓包命令 二.RDMA抓包 Mellanox 网卡 1.ibdump 2.tcpdump (docker,Linux内核从4.9以上) 3.O ...

  9. java jpcap 抓包并分析_java利用Jpcap实现抓包

    1.准备工作 Jpcap是一个可以监控当前网络情况的中间件,弥补了java对网络层以下的控制, 可以达到抓包的效果. Jpcap运行需要依赖winCap和Jpcap的dll动态库和Jpcap.jar包 ...

最新文章

  1. 上周热点回顾(9.7-9.13)
  2. android 原生砸金蛋 动画,C4D-砸金蛋动画效果制作
  3. Linux - How to Take ‘Snapshot of Logical Volume and Restore’ in LVM
  4. redis淘汰策略面试题_redis有哪些数据淘汰策略
  5. 【精华】掌握Qt调试技术
  6. 小白转前端,学习哪些知识点才能不走弯路?
  7. Jsp语法、指令及动作元素
  8. Mutable and Immutable Variables in Python
  9. vim 使用、设置笔记
  10. [入门系列]什么是面向服务的体系结构(SOA)?
  11. 深入理解Binder机制
  12. C-7统计元音字母个数
  13. 笔试题——团队活动分组
  14. I2C通讯常见问题汇总
  15. 《我为什么熬夜?》系列之 倚天屠龙记
  16. Ubuntu18安装截图工具flameshot
  17. mac系统共享服务器,mac 链接共享服务器
  18. 用免疫算法解决TSP问题
  19. 初学Arduino环境下WeMos D1制造简单智能垃圾桶项目(蜂鸣器、 SG90舵机、超声波模块)
  20. 《数据结构与抽象:Java语言描述(原书第4版)》一2.1.7 删除项的方法

热门文章

  1. HTML5期末大作业:我的家乡介绍网页设计——莆仙(6页) 代码质量好 HTML+CSS+JavaScript
  2. 使用keytool和jarsigner对jar包签名
  3. win7计算机锁频图片怎么设置,win7电脑锁屏壁纸怎么设置为个性化图片?
  4. 试验设计与因果分析课程学习
  5. Chrome 新版 关闭 禁用 阅读清单
  6. vs code颜色调整参数名
  7. 隔壁家的WIFI密码如何破解?Python教你百分之百成功蹭网~
  8. 大型数据库设计原理实验3
  9. 【机器学习】交叉验证防止过拟合(含义+代码+演示)
  10. 闭包,lambda以及倆牛叉BIF