# 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-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # JShark - Java通用网络抓包工具 JShark是一个使用Java开发的跨平台命令行网络包捕获和重放工具。它是一个通用的网络抓包工具,可以捕获和分析各种网络协议流量。 **注意**:虽然JShark可以捕获所有网络流量,但报文的详细解释和高级分析功能目前仅支持以下协议: - **DIS协议**(分布式交互仿真协议) - **HTTP协议**(超文本传输协议) 对于其他协议(如TCP、UDP、ICMP等),JShark提供基本的协议识别和原始数据展示。 ## 功能特性 - **实时包捕获**:使用pcap4j库进行跨平台网络包捕获 - **BPF过滤器**:支持标准的Berkeley Packet Filter表达式 - **多输出格式**:支持PCAP文件输出、数据库存储、控制台显示 - **数据库集成**:使用DuckDB存储捕获的包数据,支持高效查询 - **包重放功能**:从数据库重放捕获的网络流量 - **通用协议支持**:支持TCP、UDP、ICMP等常见网络协议的捕获和基本解析 - **高级协议解析**:提供详细的报文解释,目前支持: - **DIS协议**:完整的分布式交互仿真协议解析,支持所有PDU类型 - **HTTP协议**:完整的超文本传输协议解析,支持请求/响应分析 - **高级过滤**:支持基于包内容的表达式过滤,特别针对DIS和HTTP协议提供字段级过滤 - **自动文件轮转**: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`(支持通配符 `*` 匹配任意字符, `?` 匹配单个字符) - **分组运算符**:`()` 用于改变运算优先级 **语法示例:** **DIS协议示例:** ```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" ``` **HTTP协议示例:** ```bash # 过滤特定HTTP方法 --exfilter "http.request.method=POST" # 过滤特定状态码 --exfilter "http.response.status=404" # 过滤特定URL路径 --exfilter "http.request.url like \"/api/*\"" # 过滤特定用户代理 --exfilter "http.header.user-agent like \"*Chrome*\"" # 过滤特定内容类型 --exfilter "http.header.content-type like \"application/json\"" # 组合条件过滤 --exfilter "http.request.method=POST && http.response.status=200" ``` **注意事项:** 1. 键名使用点号分隔,如 `dis.pdu.type` 或 `http.request.method` 2. 字符串值可以使用双引号包裹,如 `dis.domain="land"` 或 `http.header.host="example.com"` 3. 数值比较会自动进行类型转换 4. `like` 操作符支持通配符:`*` 匹配0个或多个字符,`?` 匹配1个字符 5. 目前支持的协议前缀:`dis.` 和 `http.` ### 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 ``` ## DIS协议支持 JShark对DIS(分布式交互仿真)协议提供了完整的解析支持。DIS协议通常用于军事仿真系统,运行在UDP端口上(默认端口3000-3003)。 ### DIS协议解析功能 JShark可以解析以下DIS PDU类型: | PDU类型 | 名称 | 描述 | |-------|----------------------------------------|-------------------------| | 1 | Entity State PDU | 实体状态PDU,包含实体位置、方向、速度等信息 | | 2 | Fire PDU | 开火PDU,表示武器发射事件 | | 3 | Detonation PDU | 爆炸PDU,表示爆炸事件 | | 4 | Service Request PDU | 服务请求PDU | | 5 | Resupply Offer PDU | 补给提供PDU | | 6 | Resupply Received PDU | 补给接收PDU | | 7 | Resupply Cancel PDU | 补给取消PDU | | 8 | Repair Complete PDU | 维修完成PDU | | 9 | Repair Response PDU | 维修响应PDU | | 10 | Create Entity PDU | 创建实体PDU | | 11 | Remove Entity PDU | 移除实体PDU | | 12 | Start/Resume PDU | 开始/恢复PDU | | 13 | Stop/Freeze PDU | 停止/冻结PDU | | 14 | Acknowledge PDU | 确认PDU | | 15 | Action Request PDU | 动作请求PDU | | 16 | Action Response PDU | 动作响应PDU | | 17 | Data Query PDU | 数据查询PDU | | 18 | Set Data PDU | 设置数据PDU | | 19 | Data PDU | 数据PDU | | 20 | Event Report PDU | 事件报告PDU | | 21 | Comment PDU | 注释PDU | | 22 | Electromagnetic Emission PDU | 电磁辐射PDU | | 23 | Designator PDU | 指示器PDU | | 24 | Transmitter PDU | 发射器PDU | | 25 | Signal PDU | 信号PDU | | 26 | Receiver PDU | 接收器PDU | | 27 | IFF/ATC NAVAIDS PDU | IFF/ATC导航辅助PDU | | 28 | Underwater Acoustic PDU | 水下声学PDU | | 29 | Supplemental Emission/Entity State PDU | 补充辐射/实体状态PDU | | 30 | Intercom Signal PDU | 内部通信信号PDU | | 31 | Intercom Control PDU | 内部通信控制PDU | | 32 | Aggregate State PDU | 聚合状态PDU | | 33 | IsGroupOf PDU | 分组PDU | | 34 | Transfer Control PDU | 传输控制PDU | | 35 | IsPartOf PDU | 部分PDU | | 36 | Minefield State PDU | 雷场状态PDU | | 37 | Minefield Query PDU | 雷场查询PDU | | 38 | Minefield Data PDU | 雷场数据PDU | | 39 | Minefield Response NACK PDU | 雷场响应否定确认PDU | | 40 | Environmental Process PDU | 环境过程PDU | | 41 | Gridded Data PDU | 网格数据PDU | | 42 | Point Object State PDU | 点对象状态PDU | | 43 | Linear Object State PDU | 线性对象状态PDU | | 44 | Areal Object State PDU | 区域对象状态PDU | | 45 | TSPI PDU | 时间空间位置信息PDU | | 46 | Appearance PDU | 外观PDU | | 47 | Articulated Parts PDU | 关节部件PDU | | 48 | LE Fire PDU | LE开火PDU | | 49 | LE Detonation PDU | LE爆炸PDU | | 50 | Create Entity-R PDU | 创建实体-R PDU | | 51 | Remove Entity-R PDU | 移除实体-R PDU | | 52 | Start/Resume-R PDU | 开始/恢复-R PDU | | 53 | Stop/Freeze-R PDU | 停止/冻结-R PDU | | 54 | Acknowledge-R PDU | 确认-R PDU | | 55 | Action Request-R PDU | 动作请求-R PDU | | 56 | Action Response-R PDU | 动作响应-R PDU | | 57 | Data Query-R PDU | 数据查询-R PDU | | 58 | Set Data-R PDU | 设置数据-R PDU | | 59 | Data-R PDU | 数据-R PDU | | 60 | Event Report-R PDU | 事件报告-R PDU | | 61 | Comment-R PDU | 注释-R PDU | | 62 | Record-R PDU | 记录-R PDU | | 63 | Set Record-R PDU | 设置记录-R PDU | | 64 | Record Query-R PDU | 记录查询-R PDU | | 65 | Collision-Elastic PDU | 弹性碰撞PDU | | 66 | Entity State Update PDU | 实体状态更新PDU | ### DIS协议过滤示例 JShark支持对DIS协议进行高级过滤,可以使用`--exfilter`参数进行精确过滤: ```bash # 捕获特定PDU类型的DIS数据 java -jar target/jshark-1.0.0-capture.jar --filter="udp port 3000" --exfilter="dis.pdu.type=1" # 捕获特定演习ID的实体状态PDU java -jar target/jshark-1.0.0-capture.jar --filter="udp port 3000" --exfilter="dis.pdu.type=1 && dis.exercise.id=17" # 捕获特定实体ID的数据 java -jar target/jshark-1.0.0-capture.jar --filter="udp port 3000" --exfilter="dis.entity.id=1001" # 捕获特定站点ID的数据 java -jar target/jshark-1.0.0-capture.jar --filter="udp port 3000" --exfilter="dis.site.id=1" # 捕获特定应用ID的数据 java -jar target/jshark-1.0.0-capture.jar --filter="udp port 3000" --exfilter="dis.application.id=1" # 使用like操作符进行模糊匹配 java -jar target/jshark-1.0.0-capture.jar --filter="udp port 3000" --exfilter="dis.entity.name like \"*tank*\"" ``` ### DIS协议字段说明 在过滤表达式中,可以使用以下DIS协议字段: | 字段路径 | 类型 | 描述 | |--------------------------|-----|---------------------------------------------| | `dis.pdu.type` | 整数 | PDU类型(1-66) | | `dis.exercise.id` | 整数 | 演习ID | | `dis.site.id` | 整数 | 站点ID | | `dis.application.id` | 整数 | 应用ID | | `dis.entity.id` | 整数 | 实体ID | | `dis.entity.name` | 字符串 | 实体名称 | | `dis.entity.kind` | 整数 | 实体种类 | | `dis.entity.domain` | 字符串 | 实体领域(land, air, surface, subsurface, space) | | `dis.entity.country` | 整数 | 实体国家代码 | | `dis.entity.category` | 整数 | 实体类别 | | `dis.entity.subcategory` | 整数 | 实体子类别 | | `dis.entity.specific` | 整数 | 实体特定类型 | ## HTTP协议支持 JShark对HTTP(超文本传输协议)提供了完整的解析支持。HTTP协议是Web应用的基础协议,运行在TCP端口80(HTTP)和443(HTTPS)上。 ### HTTP协议解析功能 JShark可以解析以下HTTP协议元素: | 解析功能 | 描述 | |--------------|--------------------------------------------------------| | **HTTP请求解析** | 解析HTTP请求方法、URL、协议版本、请求头、请求体 | | **HTTP响应解析** | 解析HTTP状态码、状态消息、响应头、响应体 | | **请求方法识别** | 支持GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH等HTTP方法 | | **状态码分类** | 识别1xx(信息)、2xx(成功)、3xx(重定向)、4xx(客户端错误)、5xx(服务器错误) | | **头部字段解析** | 解析常见的HTTP头部字段,如Content-Type、Content-Length、User-Agent等 | | **内容类型识别** | 根据Content-Type识别JSON、XML、HTML、文本、二进制等数据类型 | | **Cookie解析** | 解析Set-Cookie和Cookie头部字段 | | **编码处理** | 支持gzip、deflate等压缩编码的识别 | ### HTTP协议过滤示例 JShark支持对HTTP协议进行高级过滤,可以使用`--exfilter`参数进行精确过滤: ```bash # 捕获所有HTTP流量(端口80) java -jar target/jshark-1.0.0-capture.jar --filter="tcp port 80" --exfilter="http.protocol=http" # 捕获特定HTTP方法的请求(如POST请求) java -jar target/jshark-1.0.0-capture.jar --filter="tcp port 80" --exfilter="http.request.method=POST" # 捕获特定URL路径的请求 java -jar target/jshark-1.0.0-capture.jar --filter="tcp port 80" --exfilter="http.request.url like \"/api/*\"" # 捕获特定状态码的响应 java -jar target/jshark-1.0.0-capture.jar --filter="tcp port 80" --exfilter="http.response.status=404" # 捕获包含特定头部字段的HTTP流量 java -jar target/jshark-1.0.0-capture.jar --filter="tcp port 80" --exfilter="http.header.user-agent like \"*Chrome*\"" # 捕获特定内容类型的响应 java -jar target/jshark-1.0.0-capture.jar --filter="tcp port 80" --exfilter="http.header.content-type like \"application/json\"" # 捕获特定主机名的请求 java -jar target/jshark-1.0.0-capture.jar --filter="tcp port 80" --exfilter="http.header.host=\"example.com\"" # 组合条件过滤 java -jar target/jshark-1.0.0-capture.jar --filter="tcp port 80" --exfilter="http.request.method=POST && http.response.status=200" ``` ### HTTP协议字段说明 在过滤表达式中,可以使用以下HTTP协议字段: | 字段路径 | 类型 | 描述 | |----------|------|------| | `http.protocol` | 字符串 | 协议类型("http"或"https") | | `http.request.method` | 字符串 | HTTP请求方法(GET、POST、PUT等) | | `http.request.url` | 字符串 | HTTP请求URL | | `http.request.version` | 字符串 | HTTP协议版本(HTTP/1.0、HTTP/1.1、HTTP/2) | | `http.response.status` | 整数 | HTTP响应状态码(200、404、500等) | | `http.response.message` | 字符串 | HTTP响应状态消息 | | `http.header.*` | 字符串 | HTTP头部字段,如`http.header.content-type`、`http.header.user-agent`等 | | `http.body.size` | 整数 | HTTP消息体大小(字节) | | `http.body.type` | 字符串 | 消息体类型(json、xml、html、text、binary) | | `http.body.format` | 字符串 | 正文格式标识(JSON、Form URL-encoded等) | | `http.json.parsed` | 布尔值 | JSON解析是否成功 | | `http.content.*` | 多种 | JSON格式响应内容的字段(如`http.content.status`、`http.content.message`) | | `http.content.string` | 字符串 | 非JSON格式的完整响应内容 | | `http.is_request` | 布尔值 | 是否为HTTP请求 | | `http.is_response` | 布尔值 | 是否为HTTP响应 | | `http.is_secure` | 布尔值 | 是否为HTTPS(加密)连接 | #### JSON响应消息处理说明 当HTTP响应消息包含JSON格式内容时,JShark会自动解析JSON并将其字段提取到`http.content.*`命名空间中: 1. **JSON格式检测**:响应正文以`{`开头并以`}`结尾时,被识别为JSON格式 2. **自动解析**:使用FastJSON2库解析JSON内容 3. **字段提取**:所有JSON字段都会被提取,例如: - `{"status": "success", "message": "操作成功"}` 会被解析为: - `http.content.status` = "success" - `http.content.message` = "操作成功" 4. **键名安全处理**:特殊字符会被替换为下划线,例如: - `{"user-name": "john"}` 会被解析为: - `http.content.user_name` = "john" 5. **解析失败处理**:如果JSON解析失败,原始内容会保存在`http.content.string`中 对于非JSON格式的响应,完整内容会记录在`http.content.string`字段中。 ### HTTPS支持说明 对于HTTPS流量(TCP端口443),JShark可以捕获加密的流量,但无法解密TLS/SSL加密的内容。HTTPS流量将显示为加密的TCP数据流。如果需要分析HTTPS内容,需要配置TLS私钥或使用中间人代理。 ## 项目结构 ``` 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 │ └── http/ # HTTP协议支持 │ ├── HTTPProtocolParser.java │ └── HTTPEnums.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 ``` *最后更新: 2026年3月*