hexdump用法

示例一 比较各种参数的输出结果

[root@new55 ~]# echo /etc/passwd | hexdump 
0000000 652f 6374 702f 7361 7773 0a64          
000000c
[root@new55 ~]# echo /etc/passwd | od -x 
0000000 652f 6374 702f 7361 7773 0a64
0000014
[root@new55 ~]# echo /etc/passwd | xxd 
0000000: 2f65 7463 2f70 6173 7377 640a            /etc/passwd.
[root@new55 ~]# echo /etc/passwd | hexdump -C      <== 规范的十六进制和ASCII码显示(Canonical hex+ASCII display )
00000000  2f 65 74 63 2f 70 61 73  73 77 64 0a              |/etc/passwd.|
0000000c
[root@new55 ~]# echo /etc/passwd | hexdump -b      <== 单字节八进制显示(One-byte octal display) 
0000000 057 145 164 143 057 160 141 163 163 167 144 012                
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -c      <== 单字节字符显示(One-byte character display) 
0000000   /   e   t   c   /   p   a   s   s   w   d  \n                
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -d      <== 双字节十进制显示(Two-byte decimal display) 
0000000   25903   25460   28719   29537   30579   02660                
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -o       <== 双字节八进制显示(Two-byte octal display) 
0000000  062457  061564  070057  071541  073563  005144                
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -x       <== 双字节十六进制显示(Two-byte hexadecimal display) 
0000000    652f    6374    702f    7361    7773    0a64                
000000c
[root@new55 ~]# echo /etc/passwd | hexdump -v 
0000000 652f 6374 702f 7361 7773 0a64          
000000c

 

比较来比较去,还是hexdump -C的显示效果更好些。

<think>我们正在讨论的是Scapy库中的hexdump函数。根据引用[1]中的描述:"hexdump(pkt)have a hexadecimal dump转换成十六进制数据",也就是说hexdump函数用于将数据包转换成十六进制转储形式(类似于Wireshark的十六进制视图)。下面我们来详细讲解使用方法。 ### 1. 基本功能 `hexdump()`函数将Scapy数据包对象以十六进制和ASCII混合的形式输出,便于直观查看数据包的二进制内容。 ### 2. 使用方法 ```python from scapy.all import * # 构造一个简单的ICMP数据包 packet = IP(dst="www.example.com")/ICMP() # 使用hexdump打印数据包 hexdump(packet) ``` ### 3. 输出示例 输出分为三列: - 左侧:数据偏移量(十六进制) - 中间:十六进制表示的字节(每行16个字节) - 右侧:对应的ASCII字符(非打印字符用点`.`表示) 示例输出可能如下: ``` 0000 45 00 00 1C 00 01 00 00 40 01 7C CD 7F 00 00 01 E.....@.|..... 0010 7F 00 00 01 08 00 F7 FF 00 00 00 00 ............ ``` ### 4. 保存到变量 如果需要将十六进制转储保存为字符串(而不是直接打印到控制台),可以使用`hexdump()`的`dump`参数: ```python from scapy.all import hexdump # 将转储内容捕获到字符串 output = hexdump(packet, dump=True) print(output) # 输出完整的十六进制字符串 ``` ### 5. 自定义输出 Scapy的`hexdump`函数支持两个可选参数: - `dump`:当设置为`True`时,返回字符串而不是直接打印(默认为`False`) - `label`:在输出前添加自定义标签(仅当`dump=False`时有效) 示例: ```python # 带标签的输出(适用于同时调试多个数据包) hexdump(packet, label="[ICMP Packet] ") ``` ### 6. 与其他工具对比 - Wireshark:Scapy的`hexdump`输出格式与Wireshark的十六进制视图类似,但更简洁 - `xxd`命令:Linux的`xxd`工具输出格式与`hexdump`几乎相同 ### 7. 实际应用场景 1. **调试协议字段**:当构造特殊协议包时,验证二进制布局是否正确 2. **分析原始数据**:解析未知协议时查看底层字节 3. **教学演示**:展示网络数据包的二进制结构 ### 示例代码:解析并打印TCP SYN包 ```python from scapy.all import * # 构造TCP SYN包 syn = IP(dst="example.com")/TCP(flags="S") # 打印十六进制转储 print("### TCP SYN Packet Hex Dump ###") hexdump(syn) ``` ### 注意事项 - 转储内容包含所有协议层(从以太网帧开始,除非你构造的是更高层的数据包) - 若数据包包含加密负载(如HTTPS),ASCII部分可能无法识别 - 输出长度取决于数据包大小(最大可处理64KB的数据包) §§相关问题§§ 1. 如何将Scapy捕获的数据包实时导出为PCAP文件? 2. Scapy是否有类似Wireshark的完整协议解析树功能? 3. 在Scapy中如何解析十六进制转储格式的数据包? </think>### Scapy 中 `hexdump` 使用方法详解 `hexdump()` 是 Scapy 中用于查看数据包二进制表示的实用工具,它将数据包内容以 **十六进制 + ASCII** 的形式格式化输出,类似于 Wireshark 的原始数据视图。以下是详细使用方法: #### 1. 基础用法 ```python from scapy.all import * # 创建数据包 packet = IP(dst="www.example.com")/TCP(dport=80)/Raw(load="GET / HTTP/1.1\r\n\r\n") # 查看十六进制转储 hexdump(packet) ``` 输出示例: ``` 0000 45 00 00 3C 00 01 00 00 40 06 82 2F C0 A8 01 02 E..<....@./.... 0010 5D B8 D8 22 00 14 00 50 00 00 00 00 00 00 00 00 ].."...P........ 0020 50 02 20 00 91 06 00 00 47 45 54 20 2F 20 48 54 P. .....GET / HT 0030 54 50 2F 31 2E 31 0D 0A 0D 0A TP/1.1.... ``` 输出分为三列: - **左侧**:字节偏移量(十六进制) - **中间**:十六进制表示的字节(每行16字节) - **右侧**:对应的ASCII字符(不可打印字符显示为`.`) #### 2. 保存到变量 使用 `dump=True` 参数可返回字符串而不直接打印: ```python hex_str = hexdump(packet, dump=True) print(hex_str) # 输出完整的十六进制转储字符串 ``` #### 3. 带标签输出 通过 `label` 参数添加前缀标识: ```python hexdump(packet, label="[HTTP Request] ") ``` 输出: ``` [HTTP Request] 0000 45 00 00 3C 00 01 00 00 40 06 82 2F C0 A8 01 02 E..<....@./.... [HTTP Request] 0010 5D B8 D8 22 00 14 00 50 00 00 00 00 00 00 00 00 ].."...P........ ... ``` #### 4. 结合解析使用 在协议分析时配合 `show()` 使用: ```python print("### 协议解析 ###") packet.show() print("\n### 原始数据 ###") hexdump(packet) ``` #### 5. 实际应用场景 1. **协议调试**:验证自定义协议字段的二进制布局 ```python class MyProtocol(Packet): fields_desc = [ShortField("magic", 0xABCD)] pkt = MyProtocol() hexdump(pkt) # 输出:0000 AB CD ``` 2. **负载分析**:检查加密或压缩数据的原始内容 ```python http_pkt = IP()/TCP()/Raw(load=zlib.compress(b"secret data")) hexdump(http_pkt) # 查看压缩后的二进制特征 ``` 3. **二进制对比**:检测数据包篡改 ```python pkt1 = IP(ttl=64) pkt2 = IP(ttl=128) print("TTL=64:") hexdump(pkt1) print("\nTTL=128:") hexdump(pkt2) # 对比TTL字段差异(偏移量0x08) ``` #### 注意事项 1. 转储内容包含 **所有协议层**(从链路层到应用层) 2. 长度超过 64KB 的数据包会被截断显示 3. 若需精确控制输出长度,可切片处理: ```python hexdump(packet[IP]) # 仅显示IP层及更高层数据 ``` > 引用说明:`hexdump(pkt)` 功能描述参考官方文档[^1],协议字段示例见 IP 数据包结构[^2][^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值