1. HexdumpWindows下的二进制文件显微镜第一次接触二进制文件时我盯着满屏的乱码完全无从下手。直到发现Hexdump这个神器——它就像给二进制文件装上了X光机能直接把十六进制机器码和ASCII字符对照显示。在Windows平台上虽然原生没有Linux的hexdump命令但David Ireland移植的Windows版本完美填补了这个空白。这个工具特别适合以下几类人安全分析师逆向分析恶意软件时查看PE文件头开发人员调试网络协议时检查原始数据包数据恢复工程师修复损坏文件前确认文件签名普通极客好奇JPG/PNG等文件头部的魔术数字安装过程简单到令人发指从官网下载zip包解压后把包含hexdump.exe的目录添加到PATH环境变量。我习惯在C盘创建Tools目录集中管理这类命令行工具这样重装系统时备份也更方便。注意下载后务必校验SHA256哈希值我遇到过第三方站点提供的捆绑恶意软件的版本2. 基础使用从文本文件到二进制解析2.1 查看纯文本的十六进制表示先来个最简单的例子创建一个test.txt文件echo Hello World test.txt用默认模式查看hexdump test.txt输出类似000000 48 65 6c 6c 6f 20 57 6f 72 6c 64 0d 0a这里能看到每个字符对应的ASCII码0x48H0x65e最后的0d0a是Windows的CRLF换行符。2.2 规范显示模式-C参数更实用的方式是使用-C参数它会同时显示十六进制和ASCIIhexdump -C test.txt输出变成两栏格式00000000 48 65 6c 6c 6f 20 57 6f 72 6c 64 0d 0a |Hello World..|右边栏直接显示可打印字符不可见字符显示为点号。这种模式在分析混合了文本和二进制数据时特别有用比如我最近分析的一个配置文件00000000 5b 73 65 63 74 69 6f 6e 5d 0a 6b 65 79 3d 76 61 |[section].keyva| 00000010 6c 75 65 00 00 00 00 1f 8b 08 00 00 00 00 00 |lue...........|这里能清晰看到文本部分[section].keyvalue后面跟着的00填充和1f8bgzip文件头签名。3. 高级实战技巧3.1 分析PHP序列化数据有次调试PHP应用时发现序列化字符串在传输过程中被篡改。用hexdump查看serialize()的输出php -r echo serialize([nametest]); | hexdump -C输出显示00000000 61 3a 31 3a 7b 73 3a 34 3a 22 6e 61 6d 65 22 3b |a:1:{s:4:name;| 00000010 73 3a 34 3a 22 74 65 73 74 22 3b 7d |s:4:test;}|对比正常序列化数据可以快速定位到被注入的恶意代码位置。比如如果看到中间突然出现3c 3f 70 68 70?php基本可以确定有代码注入。3.2 网络数据包分析抓取到的TCP包经常需要人工检查。假设有个HTTP请求包保存为http.pcap用tcpdump提取载荷后tcpdump -r http.pcap -A | hexdump -C能看到类似这样的HTTP头00000000 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a |GET / HTTP/1.1..| 00000010 48 6f 73 74 3a 20 77 77 77 2e 65 78 61 6d 70 6c |Host: www.exampl| 00000020 65 2e 63 6f 6d 0d 0a 55 73 65 72 2d 41 67 65 6e |e.com..User-Agen|这对理解自定义协议或检测异常流量非常有用。上周我就通过这种方式发现了一个IoT设备固件更新时未加密的敏感信息传输。4. 鲜为人知的黑科技4.1 批量处理多个文件用for循环处理目录下所有.bin文件for %f in (*.bin) do echo %f hexdump -C %f %f.txt这个命令会把每个二进制文件的hexdump结果保存到同名.txt文件。在批处理脚本中记得把%f改成%%f。4.2 HTML实体转义模式-H参数需要把结果嵌入网页时-H参数会自动转义特殊字符hexdump -H malware.exe report.html这样生成的报告中、、等字符会变成lt;、gt;、amp;避免破坏HTML结构。4.3 原始字节模式-R参数查看字符在控制台的原始显示hexdump -R unicode.txt输出类似00000000 4f 6c c3 a1 20 6d 75 6e 64 6f 20 4d c3 a9 78 69 |Olß mundo MÚxi| 00000010 63 6f 20 3c 26 3e 0d 0a |co ..|虽然显示可能乱码但重定向到文件后可以用专业工具进一步分析编码问题。5. 排错与性能优化5.1 处理大文件技巧分析几个GB的数据库文件时直接hexdump会卡死。可以用more分页hexdump -C hugefile.bin | more或者只查看前1MB内容head -c 1M hugefile.bin | hexdump -C5.2 常见问题解决如果看到输出全是问号00000000 3f 3f 3f 3f 3f 3f 3f 3f ????????说明文件编码与控制台不匹配。尝试chcp 65001 # 切换为UTF-8编码 hexdump -C unicode.txt5.3 与其他工具配合结合grep快速定位特征码hexdump -C firmware.bin | grep 89 50 4e 47 # PNG文件头或者用awk提取特定偏移量hexdump -C data.bin | awk /00000060/ {print $2,$3}
Windows命令行利器:Hexdump十六进制文件解析实战
1. HexdumpWindows下的二进制文件显微镜第一次接触二进制文件时我盯着满屏的乱码完全无从下手。直到发现Hexdump这个神器——它就像给二进制文件装上了X光机能直接把十六进制机器码和ASCII字符对照显示。在Windows平台上虽然原生没有Linux的hexdump命令但David Ireland移植的Windows版本完美填补了这个空白。这个工具特别适合以下几类人安全分析师逆向分析恶意软件时查看PE文件头开发人员调试网络协议时检查原始数据包数据恢复工程师修复损坏文件前确认文件签名普通极客好奇JPG/PNG等文件头部的魔术数字安装过程简单到令人发指从官网下载zip包解压后把包含hexdump.exe的目录添加到PATH环境变量。我习惯在C盘创建Tools目录集中管理这类命令行工具这样重装系统时备份也更方便。注意下载后务必校验SHA256哈希值我遇到过第三方站点提供的捆绑恶意软件的版本2. 基础使用从文本文件到二进制解析2.1 查看纯文本的十六进制表示先来个最简单的例子创建一个test.txt文件echo Hello World test.txt用默认模式查看hexdump test.txt输出类似000000 48 65 6c 6c 6f 20 57 6f 72 6c 64 0d 0a这里能看到每个字符对应的ASCII码0x48H0x65e最后的0d0a是Windows的CRLF换行符。2.2 规范显示模式-C参数更实用的方式是使用-C参数它会同时显示十六进制和ASCIIhexdump -C test.txt输出变成两栏格式00000000 48 65 6c 6c 6f 20 57 6f 72 6c 64 0d 0a |Hello World..|右边栏直接显示可打印字符不可见字符显示为点号。这种模式在分析混合了文本和二进制数据时特别有用比如我最近分析的一个配置文件00000000 5b 73 65 63 74 69 6f 6e 5d 0a 6b 65 79 3d 76 61 |[section].keyva| 00000010 6c 75 65 00 00 00 00 1f 8b 08 00 00 00 00 00 |lue...........|这里能清晰看到文本部分[section].keyvalue后面跟着的00填充和1f8bgzip文件头签名。3. 高级实战技巧3.1 分析PHP序列化数据有次调试PHP应用时发现序列化字符串在传输过程中被篡改。用hexdump查看serialize()的输出php -r echo serialize([nametest]); | hexdump -C输出显示00000000 61 3a 31 3a 7b 73 3a 34 3a 22 6e 61 6d 65 22 3b |a:1:{s:4:name;| 00000010 73 3a 34 3a 22 74 65 73 74 22 3b 7d |s:4:test;}|对比正常序列化数据可以快速定位到被注入的恶意代码位置。比如如果看到中间突然出现3c 3f 70 68 70?php基本可以确定有代码注入。3.2 网络数据包分析抓取到的TCP包经常需要人工检查。假设有个HTTP请求包保存为http.pcap用tcpdump提取载荷后tcpdump -r http.pcap -A | hexdump -C能看到类似这样的HTTP头00000000 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a |GET / HTTP/1.1..| 00000010 48 6f 73 74 3a 20 77 77 77 2e 65 78 61 6d 70 6c |Host: www.exampl| 00000020 65 2e 63 6f 6d 0d 0a 55 73 65 72 2d 41 67 65 6e |e.com..User-Agen|这对理解自定义协议或检测异常流量非常有用。上周我就通过这种方式发现了一个IoT设备固件更新时未加密的敏感信息传输。4. 鲜为人知的黑科技4.1 批量处理多个文件用for循环处理目录下所有.bin文件for %f in (*.bin) do echo %f hexdump -C %f %f.txt这个命令会把每个二进制文件的hexdump结果保存到同名.txt文件。在批处理脚本中记得把%f改成%%f。4.2 HTML实体转义模式-H参数需要把结果嵌入网页时-H参数会自动转义特殊字符hexdump -H malware.exe report.html这样生成的报告中、、等字符会变成lt;、gt;、amp;避免破坏HTML结构。4.3 原始字节模式-R参数查看字符在控制台的原始显示hexdump -R unicode.txt输出类似00000000 4f 6c c3 a1 20 6d 75 6e 64 6f 20 4d c3 a9 78 69 |Olß mundo MÚxi| 00000010 63 6f 20 3c 26 3e 0d 0a |co ..|虽然显示可能乱码但重定向到文件后可以用专业工具进一步分析编码问题。5. 排错与性能优化5.1 处理大文件技巧分析几个GB的数据库文件时直接hexdump会卡死。可以用more分页hexdump -C hugefile.bin | more或者只查看前1MB内容head -c 1M hugefile.bin | hexdump -C5.2 常见问题解决如果看到输出全是问号00000000 3f 3f 3f 3f 3f 3f 3f 3f ????????说明文件编码与控制台不匹配。尝试chcp 65001 # 切换为UTF-8编码 hexdump -C unicode.txt5.3 与其他工具配合结合grep快速定位特征码hexdump -C firmware.bin | grep 89 50 4e 47 # PNG文件头或者用awk提取特定偏移量hexdump -C data.bin | awk /00000060/ {print $2,$3}