小工具,从wireshark中导出原始16进制数据,进而导出RTPPayload数据

本文详细介绍了如何使用Wireshark抓取的包数据,通过特定脚本提取RTP数据的payload部分,进而进行进一步的数据分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

wireshark抓到的包可以导出:file->export->file

在packet format下可以选择导出的格式,但如果需要的数据是多个包的组合那就麻烦了,因为导出的数据无论如何都会加上链路层、IP层和传输层的头信息,手动删除基本可能。

比如,我捕获了很多RTP包,但我只想取出RTP的payload来分析数据是否正确,我可以这样做:


首先导出packet byte格式的数据,我把该数据保存在RAW.dat中,数据的格式是这样的(一个wireshark中的包):



然后把其中的16进制数据提取出来,上代码:

#include "stdlib.h"
#include "stdio.h"


typedef enum state //状态机实现
{
	IGNORE,
	WAITCR,
	WAITLF,
	READY,
	READ_L,
	READ_H
}STATE;

int AToI(unsigned char *pData)
{
	unsigned char tmp[2];
	int ret;
	tmp[0] = *pData;
	tmp[1] = *(pData+1);
	for (int i=0; i<2; i++)
	{
		if (tmp[i] <= 0x39 && tmp[i] >= 0x30)
		{
			tmp[i] &= 0x0f;
		}
		else if(tmp[i] <= 0x66 && tmp[i] >= 0x61)
		{
			tmp[i] = 9 + tmp[i]&0x0f;
		}
		else
		{
			printf("Err\n");
			return -1;
		}
	}

	ret = tmp[0]*16 + tmp[1];
	return ret;
}

int main()
{
	FILE *FI, *FO;
	
	FI = fopen("RAW.dat", "rb");
	FO = fopen("RTP.dat", "wb");
	
	STATE stat=IGNORE;
	unsigned char tmp;
	int hex;
	unsigned char ch[2] = {0};
	int count = 0, line = 0;
	int blankCount = 0;
	bool bFalse = false;
	unsigned long PacketCount = 0;

	while(!feof(FI) && !bFalse)
	{
		tmp = fgetc(FI);

		switch(stat)
		{
		case IGNORE:
			if (tmp == 0x20)
			{
				stat = READY;
			}
			break;
		case WAITCR:
			if (tmp == 0x0d)
			{
				stat = WAITLF;
			}
			break;
		case WAITLF:
			if (tmp == 0x0a)
			{
				stat = IGNORE;
			}
			break;
		case READY:
			if(tmp != 0x20)
			{
				ch[0] = tmp;
				stat = READ_L;
				blankCount = 0;
			}
			else
			{
				if (++blankCount >= 2)
				{
					PacketCount++;
					blankCount = 0;
					count = 0;
					stat = WAITCR;
				}
			}
			break;
		case READ_L:
			ch[1] = tmp;
			stat = READ_H;
			break;
		case READ_H:
			hex = AToI(ch);
			if (hex < 0)
			{
				bFalse = true;
				break;
			}
			fputc(hex, FO);
			if (++count == 16)
			{
				count = 0;
				line++;
				stat = WAITCR;
			}
			else
			{
				stat = READY;
			}
			break;
		}
	}

	fclose(FI);
	fclose(FO);

	return 0;
}


因为我抓取的是RTP数据,因此我又写了个小工具,从上面提取的裸数据中在一起提取出RTP数据:

#include "stdlib.h"
#include "stdio.h"

#include <assert.h>

int main()
{
	FILE *FI, *FO;

	FI = fopen("raw.dat", "rb");
	FO = fopen("rtp.dat", "wb");
	if (!FI || !FO)
	{
		return -1;
	}

	int ret=0;
	unsigned long ToTalLen=0, PacketLen = 0;
	unsigned long count = 0;
	unsigned char *pBuf = new unsigned char[10 * 1024 *1024];
	unsigned char *pPos = pBuf;
	int paddingLen = 0;
	bool bHasPadding = false;

	do
	{
		ret = fread(pPos, 1, 1024*1024, FI);
		ToTalLen += ret;
		pPos += ret;
	}while(ret > 0);
	pPos = pBuf;

	do 
	{	
		while(ToTalLen > 0)
		{
			if(*pPos != 0x50 || *(pPos+1)!= 0xe5)
			{
				printf("Has decode %d\n", count);
				break;
			}
			PacketLen = (*(pPos+38)<<8) + *(pPos+39);
			PacketLen -= (8 + 12);
			if (PacketLen > 1460)
			{
				break;
			}

			pPos += (14 + 20 + 8 + 12);

			if (PacketLen != fwrite(pPos, 1, PacketLen, FO))
			{
				break;
			}
			count++;
			pPos += PacketLen;
			//如果RTP的payload是4, 那么以太网的包长度肯定为4 + 12 + 8 + 20 + 14 == 58 小于 60
			//因此会有2个字节是需要丢弃的
			if (PacketLen == 4)
			{
				pPos += 2;
			}
		}
	} while(0);
	
	delete []pBuf;
	fclose(FI);
	fclose(FO);
	return 0;
}

其他的传输层数据可以类似地提取,不用去掉RTP头长度(12)。


<think>好的,用户现在想了解如何使用Wireshark解析16进制数据包。之前已经推荐过Wireshark作为图形界面工具之一,但用户可能希望得到更具体的步骤指导。首先,我需要确定用户的使用场景。他们可能是网络管理员、安全分析师,或者开发者,处理网络协议或自定义数据包。用户可能已经有原始十六进制数据,需要将其导入Wireshark进行分析。 接下来,我需要考虑用户可能的痛点。比如,如何将十六进制数据转换为Wireshark可识别的格式,比如pcap或pcapng。另外,用户可能不知道如何在Wireshark中查看和解析这些数据包的结构。需要详细说明导入步骤,以及如何使用内置的协议解析器。 另外,用户可能对高级功能感兴趣,比如手动设置协议或自定义解析器,但如果是新手,可能需要先从基础开始。所以,回答需要分步骤,结构清晰,从导入数据到分析,再到高级技巧,逐步深入。 还要注意可能的常见问题,例如数据格式转换是否正确,字节顺序的问题,或者如何识别未知协议。需要提供解决这些问题的方法,比如使用text2pcap工具,或者调整解析选项。 需要确保每个步骤都具体,比如具体的菜单路径,命令示例,以及截图或代码块的使用,让用户容易跟随。同时,提醒用户注意字节顺序、协议选择是否正确,以及校验和验证的重要性。 最后,总结使用Wireshark的优势,比如支持多种协议,可视化分析,以及社区支持,帮助用户理解为什么选择这个工具。确保语言简洁明了,避免技术术语过于复杂,适合不同层次的用户理解。</think>以下是使用 **Wireshark** 解析16进制数据包的详细步骤指南,涵盖从数据导入到协议分析的完整流程: --- ### **一、准备16进制数据包** 1. **数据格式要求** - 原始数据需为 **16进制字符串**,例如: `AA BB 01 00 00 01 00 00 00 00 00 00 03 77 77 77 05 62 61 69 64 75 03 63 6F 6D 00 00 01 00 01` - 若数据以其他形式(如二进制文件 `.bin`)存储,可直接导入Wireshark。 --- ### **二、将16进制数据转换为Wireshark可读格式** #### **方法1:使用`text2pcap`工具(命令行)** - **适用场景**:将纯文本格式的16进制字符串转换为 `.pcap` 文件。 - **操作步骤**: 1. 创建输入文件(如 `input.txt`),格式示例: ``` 0000 aa bb 01 00 00 01 00 00 00 00 00 00 03 77 77 77 0010 05 62 61 69 64 75 03 63 6f 6d 00 00 01 00 01 ``` (`0000` 表示偏移量,非必须但推荐添加) 2. 运行转换命令: ```bash text2pcap -l 1 input.txt output.pcap # -l 1表示链路层类型为以太网(可省略) ``` 3. 生成 `output.pcap` 文件,用Wireshark打开。 #### **方法2:直接导入二进制文件** - **操作步骤**: 1. 打开Wireshark → `文件` → `打开` → 选择二进制文件(如 `.bin`)。 2. Wireshark会自动解析为原始数据包(需手动指定协议类型)。 --- ### **三、在Wireshark中解析数据包** 1. **基础解析流程** - **步骤1**:打开 `.pcap` 文件后,主界面分为三部分: - **数据包列表**:显示捕获的所有数据包。 - **协议详情**:分层展示各协议字段(如以太网头、IP头、TCP负载)。 - **原始字节**:显示16进制和ASCII格式的原始数据。 - **步骤2**:右键点击目标数据包 → `Follow` → `TCP Stream`(或`UDP Stream`)查看完整会话内容。 2. **强制指定协议解析** - **适用场景**:当Wireshark未自动识别协议时(如自定义私有协议)。 - **操作步骤**: 1. 选中数据包 → 右键 → `Decode As...` 2. 在`Current`列选择协议类型(如`HTTP`、`DNS`或`Data`)。 ![decode_as](https://www.wireshark.org/docs/wsug_html_chunked/wsug_graphics/decode-as-dialog.png) 3. **查看16进制原始数据** - **操作**:点击数据包详情中的`原始数据`区域,下方将高亮显示对应的16进制字节。 - **快捷键**:`Ctrl+H` 切换16进制/ASCII显示模式。 --- ### **四、高级分析技巧** 1. **过滤特定字段** - **示例**: - 过滤所有包含字节`AA BB`的数据包: ```wireshark-filter frame contains aa:bb ``` - 过滤IP地址为`192.168.1.1`的流量: ```wireshark-filter ip.addr == 192.168.1.1 ``` 2. **自定义协议解析** - **使用Lua脚本**: 1. 编写Lua脚本定义协议字段(如解析帧头、长度、校验和)。 2 在Wireshark中加载脚本: `分析` → `启用的协议` → `Lua` → 选择脚本文件。 - **示例脚本片段**: ```lua local my_proto = Proto("MyProtocol", "My Custom Protocol") local fields = { header = ProtoField.bytes("myproto.header", "Header"), length = ProtoField.uint16("myproto.length", "Length", base.DEC) } my_proto.fields = fields function my_proto.dissector(buffer, pinfo, tree) local subtree = tree:add(my_proto, buffer(), "My Protocol Data") subtree:add(fields.header, buffer(0,2)) -- 解析前2字节为帧头 subtree:add(fields.length, buffer(2,2)) -- 解析3-4字节为长度 end DissectorTable.get("udp.port"):add(1234, my_proto) -- 绑定到UDP端口1234 ``` 3. **导出特定字段** - **操作**:右键点击协议字段 → `Export Packet Bytes` → 选择范围保存为文件。 --- ### **五、常见问题与解决** 1. **数据包显示为`[Malformed Packet]`** - **原因**:协议解析失败(如校验和错误、字段长度不匹配)。 - **解决**: - 检查原始数据是否完整。 - 通过`Analyze` → `Enabled Protocols` 禁用错误协议的解析。 2. **字节顺序问题(大端/小端)** - **调整方法**:在`协议详情`中右键字段 → `Switch Byte Order`。 3. **时间戳校正** - **操作**:`视图` → `时间显示格式` → 选择`UTC`或相对时间。 --- ### **六、关键优势总结** 1. **协议支持广泛**:内置3000+协议解析器(如HTTP、DNS、TLS)。 2. **可视化分析**:通过IO图表、流量统计等功能快速定位异常。 3. **社区支持**:通过[Wireshark官方Wiki](https://wiki.wireshark.org/)获取协议插件和脚本。 --- **示例截图**: ![Wireshark解析界面](https://www.wireshark.org/docs/wsug_html_chunked/wsug_graphics/ws-main-window.png) (图中展示典型的数据包分层解析视图) 通过以上步骤,您可高效利用Wireshark完成16进制数据包的解析、调试和逆向工程任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值