# JShark **Repository Path**: RobotSlacker/jshark ## Basic Information - **Project Name**: JShark - **Description**: 简化版的WireShark,使用Java开发的跨平台命令行网络包捕获和重放工具。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-04 - **Last Updated**: 2026-03-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JShark - Java Packet Capture Tool 简化版的WireShark,使用Java开发的跨平台命令行网络包捕获和重放工具。 ## 功能特性 - **实时包捕获**:使用pcap4j库进行跨平台网络包捕获 - **BPF过滤器**:支持标准的Berkeley Packet Filter表达式 - **多输出格式**:支持PCAP文件输出、数据库存储、控制台显示 - **数据库集成**:使用DuckDB存储捕获的包数据,支持高效查询 - **包重放功能**:从数据库重放捕获的网络流量 - **协议解析**:支持TCP、UDP、ICMP等常见协议,以及DIS协议扩展 - **高级过滤**:支持基于包内容的表达式过滤 - **自动文件轮转**:PCAP文件大小限制,自动创建新文件 ## 系统要求 - Java 17 或更高版本 - 网络抓包库: - Windows: Npcap 或 WinPcap - Linux/macOS: libpcap - 适当的权限(管理员/root权限进行网络捕获) ## 快速开始 ### 1. 安装依赖 #### Windows 1. 下载并安装 Npcap ```bash npcap-1.87.exe /winpcap_mode=yes ``` #### Linux (基于RPM) ```bash sudo yum install libpcap-devel ``` ### 2. 构建项目 ```bash # 克隆项目 git clone cd jshark # 编译项目 mvn clean compile # 打包可执行JAR mvn package ``` 构建完成后,会在`target`目录生成两个可执行JAR文件: - `jshark-1.0.0-capture.jar` - 包捕获工具 - `jshark-1.0.0-replay.jar` - 包重放工具 ## 使用指南 ### CliShark - 包捕获工具 #### 基本用法 ```bash java -jar target/jshark-1.0.0-capture.jar --ip_address=192.168.1.100 --filter="tcp port 80" --count=100 ``` #### 命令行选项 | 选项 | 参数 | 说明 | 默认值 | 示例 | |-----------------|--------|------------------------------------------|-------|------------------------------------------------------| | `--ip_address` | IP地址 | 根据IP地址选择网络接口 | 无 | `--ip_address=192.168.1.100` | | `--filter` | BPF表达式 | 包过滤表达式 | 无 | `--filter="tcp port 80"` | | `--count` | 数字 | 捕获指定数量的包后停止 | 无 | `--count=1000` | | `--timeout` | 秒数 | 指定时间后停止捕获 | 无 | `--timeout=60` | | `--pcapoutput` | 文件路径 | 保存到PCAP文件(支持自动轮转) | 无 | `--pcapoutput=capture.pcap` | | `--pcapsize` | 大小 | 每个PCAP文件的最大大小(支持KB,MB,GB) | 200MB | `--pcapsize=200MB` | | `--logdb` | 数据库路径 | 保存所有消息到数据库 | 无 | `--logdb=capture.db` | | `--exfilter` | 表达式 | 高级表达式过滤additionalInfo内容(支持括号、逻辑运算、比较运算等) | 无 | `--exfilter="dis.pdu.type=28 && dis.exercise.id=17"` | | `--promiscuous` | 无 | 启用混杂模式 | 关闭 | `--promiscuous` | | `--verbose` | 无 | 启用详细输出 | 关闭 | `--verbose` | #### 使用示例 1. **捕获HTTP流量** ```bash java -jar target/jshark-1.0.0-capture.jar --ip_address=192.168.1.100 --filter="tcp port 80" --count=100 --pcapoutput=http_traffic.pcap ``` 2. **捕获所有流量到数据库** ```bash java -jar target/jshark-1.0.0-capture.jar --ip_address=192.168.1.100 --logdb=network_capture.db --timeout=300 ``` 3. **捕获特定协议的DIS数据** ```bash java -jar target/jshark-1.0.0-capture.jar --ip_address=192.168.1.100 --filter="udp port 3000" --exfilter="dis.pdu.type=28 && dis.exercise.id=17" --logdb=dis_capture.db ``` #### 高级表达式过滤语法 `--exfilter` 参数支持强大的表达式语法,用于过滤数据包的additionalInfo内容: **支持的运算符:** - **比较运算符**:`=`(等于), `!=`(不等于), `>`(大于), `<`(小于), `>=`(大于等于), `<=`(小于等于) - **逻辑运算符**:`&&`(与), `||`(或) - **字符串匹配**:`like`(支持通配符 `*` 匹配任意字符, `?` 匹配单个字符) - **分组运算符**:`()` 用于改变运算优先级 **语法示例:** ```bash # 基本相等比较 --exfilter "dis.pdu.type=28" # 多个条件与运算 --exfilter "dis.pdu.type=28 && dis.exercise.id=17" # 使用括号和或运算 --exfilter "(dis.pdu.type=28 || dis.pdu.type=1) && dis.exercise.id!=0" # 数值范围过滤 --exfilter "dis.pdu.type>20 && dis.pdu.type<30" # 字符串模糊匹配 --exfilter "dis.entity.name like \"*tank*\"" # 复杂组合表达式 --exfilter "(dis.pdu.type=28 && dis.exercise.id=17) || dis.entity.id>50" ``` **注意事项:** 1. 键名使用点号分隔,如 `dis.pdu.type` 2. 字符串值可以使用双引号包裹,如 `dis.domain="land"` 3. 数值比较会自动进行类型转换 4. `like` 操作符支持通配符:`*` 匹配0个或多个字符,`?` 匹配1个字符 ### CliReplay - 包重放工具 #### 基本用法 ```bash java -jar target/jshark-1.0.0-replay.jar --db=capture.db --speed=2.0 --sourceIp=192.168.1.100 ``` #### 命令行选项 | 选项 | 参数 | 说明 | 默认值 | 示例 | |---------------------|-------|-----------|-----|---------------------------------| | `--db` | 数据库文件 | 从数据库文件重放包 | 必需 | `--db=capture.db` | | `--speed` | 倍数 | 重放速度乘数 | 1.0 | `--speed=2.0` | | `--start` | 时间戳 | 重放开始时间 | 无 | `--start="2024-01-01 10:00:00"` | | `--end` | 时间戳 | 重放结束时间 | 无 | `--end="2024-01-01 11:00:00"` | | `--sourceIp` | IP地址 | 按源IP地址过滤 | 无 | `--sourceIp=192.168.1.100` | | `--destinationIp` | IP地址 | 按目标IP地址过滤 | 无 | `--destinationIp=192.168.1.200` | | `--sourcePort` | 端口号 | 按源端口过滤 | 无 | `--sourcePort=8080` | | `--destinationPort` | 端口号 | 按目标端口过滤 | 无 | `--destinationPort=80` | #### 使用示例 1. **以原始速度重放所有流量** ```bash java -jar target/jshark-1.0.0-replay.jar --db=capture.db ``` 2. **以2倍速度重放特定时间段的流量** ```bash java -jar target/jshark-1.0.0-replay.jar --db=capture.db --speed=2.0 --start="2024-01-01 10:00:00" --end="2024-01-01 11:00:00" ``` 3. **重放特定主机间的流量** ```bash java -jar target/jshark-1.0.0-replay.jar --db=capture.db --sourceIp=192.168.1.100 --destinationIp=192.168.1.200 ``` ## 项目结构 ``` jshark/ ├── src/main/java/com/jshark/ │ ├── CliShark.java # 包捕获命令行接口 │ ├── CliReplay.java # 包重放命令行接口 │ ├── PacketCapture.java # 包捕获核心逻辑 │ ├── PacketCaptureException.java │ ├── FilterEngine.java # 过滤引擎 │ ├── InterfaceManager.java # 网络接口管理 │ └── parser/ # 协议解析器 │ ├── PacketParser.java # 包解析器 │ ├── ProtocolParser.java # 协议解析器 │ ├── PacketLogger.java # 包日志记录器 │ ├── PacketDBLogger.java # 数据库日志记录器 │ ├── PacketDBEventHandler.java │ ├── ApplicationProtocol.java │ └── dis/ # DIS协议支持 │ ├── DISProtocolParser.java │ ├── DISEnums.java │ └── DISParseException.java ├── src/main/java/com/jshark/tools/ │ ├── DBReplayTool.java # 数据库重放工具 │ ├── NettyPacketSender.java # Netty包发送器 │ ├── AdditionalInfoParser.java │ └── AdditionalInfoBatchUpdater.java ├── pom.xml # Maven配置文件 └── README.md # 本文档 ``` ## 开发指南 ### 编译项目 ```bash mvn clean compile ``` ### 运行测试 ```bash mvn test ``` ### 打包可执行JAR ```bash mvn package ``` ### 常见问题 1. **无法找到网络接口** - 确保以管理员/root权限运行 - 检查Npcap/WinPcap是否正确安装 - 使用`--verbose`选项查看详细错误信息 2. **包捕获速度慢** - 可以关闭数据库捕获 - 减少过滤表达式的复杂度 - 可以通过关闭pcapoutput来禁用PCAP文件捕获 ### 日志查看 启用详细日志输出: ```bash java -jar target/jshark-1.0.0-capture.jar --verbose --ip_address=192.168.1.100 ``` *最后更新: 2024年1月*