KostasEreksonas/DVRIP_analysis
GitHub: KostasEreksonas/DVRIP_analysis
为 Xiongmai IP 摄像机提供 DVRIP/Sofia 协议的 Wireshark 解析器,填补私有协议分析空白。
Stars: 2 | Forks: 0
# DVRIP_analysis
一个用于 Xiongmai 基础 IP 摄像机的 DVRIP/Sofia 协议 Wireshark 解析器。
完整示例 IP 摄像机分析报告可在 [Besder 6024PB-XMA501 IP 摄像机安全调查](https://github.com/KostasEreksonas/Besder-6024PB-XMA501-ip-camera-security-investigation) 仓库获取。
# 目录
* [测试设备](#test-device)
* [DVRIP/Sofia 命令消息](#dvripsofia-command-message)
* [音频头](#audio-header)
* [I 帧头](#i-frame-header)
* [P 帧头](#p-frame-header)
* [信息帧头](#information-frame-header)
# 测试设备
该解析器基于一个用于端口 37777(Dahua IP 摄像机)的 DVRIP Wireshark 解析器,可在此处找到:https://github.com/r4bit999/dvrip-analysis/tree/master
在 Besder 6024PB-XMA501 IP 摄像机上测试通过:
```
Model: XM530_50X50-WG_8M
Firmware version: V5.00.R02.00030747.10010.349f17
```
媒体帧以字节形式保存在 `/tmp` 目录中(文件格式:'pinfo.number'_'frame_name')。
DVRIP/Sofia 媒体负载具有独立的头部。所有媒体负载头部字段(除签名外)均按小端(LE)重新排序以提取其实际值。
媒体负载头部是根据 [Xiongmai 位流帧格式文档](https://www.scribd.com/document/669666260/%E7%A0%81%E6%B5%81%E5%B8%A7%E6%A0%BC%E5%BC%8F%E6%96%87%E6%A1%A3) 重建的。
# DVRIP/Sofia 命令消息
单个 DVRIP/Sofia 消息的头部描述基于 [数字视频记录器接口协议文档](https://github.com/OpenIPC/python-dvr/blob/master/doc/%E9%9B%84%E8%BF%88%E6%95%B0%E5%AD%97%E8%A7%86%E9%A2%91%E5%BD%95%E5%83%8F%E6%9C%BA%E6%8E%A5%E5%8F%A3%E5%8D%8F%E8%AE%AE_V1.0.0.pdf),实际图示在第 7 页。


1. BIT 0:消息头部字节,固定为 0xFF。
2. BIT 1:观察结果为 0 表示请求,为 1 表示来自 IP 摄像机的响应。
3. BIT 2:保留字节 1:
* 当使用 H.264 视频编解码器时等于 `0`(I 帧头部 BIT4 = `0x02`)。
* 当使用 H.265 视频编解码器时等于 `1`(I 帧头部 BIT4 = `0x12`)。
4. BIT 3:保留字节 2:
* 当 DVRIP 消息包含音频帧时等于 `128`。
* 否则等于 `0`。
5. BIT 4-7:会话 ID。由摄像机在成功登录后分配,后续每条消息均需包含该值。
6. BIT 8-11:序列号。从启动后从 0 开始递增,达到(未知)最大值后重新从 0 开始。
7. BIT 12:单个消息中的数据包总数。值为 0 或 1 表示每个数据包仅包含一条消息。
8. BIT 13:当前消息中的数据包编号。仅在总数据包数(BIT 12)大于 1 时有意义。
9. BIT 14-15:命令码(也称为消息 ID)。该代码定义要执行的操作。
10. BIT 16-19:数据(负载)长度。JSON 负载的长度,紧随 DVRIP/Sofia 头部之后。
# 音频头


1. BIT 0-3:签名
2. BIT 4:音频编解码器(0x0e = G711A)
3. BIT 5:采样率(0x02 = 8kHz 采样)
4. BIT 6-7:音频负载长度
# I 帧头


1. BIT 0-3:签名
2. BIT 4:视频编解码器(0x01 = MPEG4,0x02 = H.264,0x12 = H.265)
3. BIT 5:编码帧率(可变;PAL 模式下为 1-25,NTSC 模式下为 1-30)
4. BIT 6:图像宽度的低 8 位;该值为实际宽度除以 8
5. BIT 7:图像高度的低 8 位;该值为实际高度除以 8
6. BIT 8-11:捕获时间日期
7. BIT 12-15:I 帧负载长度
I-Frame 负载的前 4 位(BIT 16-19)等于 `0x00000001`
I 帧与快照(FE)共享完全相同的头部字段。
# P 帧头


I 帧的扩展。
1. BIT 0-3:签名
2. BIT 4-7:P 帧负载长度
P 帧负载的前 4 位(BIT 8-11)等于 `0x00000001`
# 信息帧头


1. BIT 0-3:签名
2. BIT 4:通用信息(未确认)
3. BIT 5:未使用的值
4. BIT 6-7:负载长度
用于信息传输。签名后的第一个字节(字节 4):
1. 0x01 - 通用信息。
2. 0x06 - 未知值。
标签:DVRIP, IP摄像头, Sofia协议, Wireshark解析器, Xiongmai, 内核驱动, 包头解析, 协议逆向, 固件分析, 媒体帧, 小端序, 摄像头协议, 数字取证, 物联网设备, 端口34567, 网络协议, 自动化脚本, 视频流分析, 逆向工具