图像处理小技巧:用xxd命令玩转BMP/PNG的16进制数据(含反向还原教程)

张开发
2026/6/1 6:56:46 15 分钟阅读
图像处理小技巧:用xxd命令玩转BMP/PNG的16进制数据(含反向还原教程)
图像处理小技巧用xxd命令玩转BMP/PNG的16进制数据含反向还原教程在逆向工程和安全研究领域理解文件的底层数据结构是基本功。而图像文件作为常见的数据载体其16进制结构往往隐藏着关键信息。本文将带你深入探索如何利用Linux下的xxd命令对BMP/PNG等图像格式进行16进制层面的操作甚至实现修改后的反向还原。1. 为什么需要直接操作图像的16进制数据你可能好奇在拥有各种成熟图像处理工具的今天为什么还要直接操作16进制数据实际上这种原始方法在多个场景下具有不可替代的价值CTF竞赛许多逆向题目会故意修改图像文件头或植入隐藏数据数字取证恢复损坏文件时需要手动修复文件结构安全研究分析恶意样本中的图像隐写技术嵌入式开发需要将图像直接转换为C语言数组嵌入固件xxd作为Linux自带的十六进制转储工具完美胜任这些任务。它不仅能以人类可读的形式展示二进制内容还能将修改后的十六进制数据重新转换回二进制格式。2. 初识xxd基础用法与图像转储让我们从最基本的操作开始将图像文件转换为十六进制表示xxd image.bmp hexdump.txt这个简单的命令会产生类似如下的输出00000000: 424d 368c 0000 0000 0000 3600 0000 2800 BM6.......6...(. 00000010: 0000 8000 0000 8000 0000 0100 1800 0000 ................ 00000020: 0000 008c 0000 0000 0000 0000 0000 0000 ................每一行包含左侧的偏移地址中间的16个字节的十六进制表示右侧对应的ASCII字符显示对于图像分析几个实用参数特别值得关注xxd -g 1 -u -c 16 image.png # 以大写字母显示每字节一组每行16字节3. 深入图像文件结构BMP与PNG的16进制特征不同图像格式在16进制层面展现出独特的指纹。理解这些特征对逆向分析至关重要。3.1 BMP文件结构解析典型的BMP文件头前54字节结构如下表所示偏移量长度描述示例值0x002文件标识BM42 4D0x024文件大小36 8C 00 000x0A4像素数据偏移量36 00 00 000x124图像宽度像素80 00 00 000x164图像高度像素80 00 00 00手动修改这些值可以改变图像的显示属性。例如将宽度值从80 00 00 00改为40 00 00 00图像宽度将减半。3.2 PNG文件签名分析PNG文件则以8字节的签名开头89 50 4E 47 0D 0A 1A 0A紧随其后的是IHDR块包含关键图像信息xxd -l 32 image.png | head -2输出示例00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR 00000010: 0000 0080 0000 0080 0806 0000 00c3 3e39 ..............94. 高级技巧修改并还原图像数据xxd最强大的功能在于它的反向操作能力-r参数允许我们将修改后的十六进制数据重新转换为二进制文件。4.1 基本还原流程xxd image.bmp original.hex # 编辑hex文件... xxd -r original.hex modified.bmp4.2 实战修改BMP图像宽度让我们通过具体案例演示如何修改图像属性首先生成十六进制转储xxd sample.bmp sample.hex找到宽度字段通常位于0x12-0x15偏移处假设原始值为00000010: ... 8000 0000 ...修改为新的宽度值如640像素00000010: ... 8002 0000 ...还原为二进制xxd -r sample.hex modified.bmp注意修改时需考虑字节序问题。BMP使用小端序因此6400x280应表示为80 02 00 004.3 自动化脚本示例对于频繁操作可以编写简单的shell脚本#!/bin/bash # 修改BMP宽度脚本 INPUT$1 NEW_WIDTH$(( $2 )) xxd $INPUT temp.hex printf %08x $NEW_WIDTH | sed -r s/(..)(..)(..)(..)/\4\3\2\1/ | xxd -r -p | dd oftemp.hex bs1 seek$((0x12)) count4 convnotrunc xxd -r temp.hex ${INPUT%.*}_modified.bmp rm temp.hex使用方法./resize_bmp.sh test.bmp 6405. 逆向工程中的实际应用在安全研究领域这些技巧有诸多实际应用场景隐写分析检测图像中异常的数据块文件修复手动修复损坏的文件头数据提取从内存转储中恢复图像片段CTF解题修复被破坏的文件签名提取隐藏在图像数据中的flag绕过基于文件头的过滤检查一个典型的CTF解题过程可能如下使用xxd查看文件十六进制发现异常的IHDR块CRC校验值计算正确的CRC并修改使用xxd -r还原文件获得隐藏的flag信息6. 性能优化与注意事项处理大图像文件时这些技巧能提升效率限制转储范围xxd -l 128 -s 0x1000 large.img # 仅转储从0x1000开始的128字节使用二进制补丁模式echo 0000010: 1234 5678 | xxd -r - original.bmp处理大文件时的内存管理split -b 1M large.hex # 分割大hex文件常见问题解决方案还原后文件损坏检查hex文件格式是否严格符合xxd输出规范确保没有意外修改了偏移地址列字节序问题使用hexdump交叉验证多字节值对于网络序数据考虑使用dd convswab编码问题确保文本编辑器使用ASCII编码保存hex文件避免Windows换行符CRLF导致的问题7. 扩展应用嵌入图像数据到代码xxd的-i选项可以直接生成C语言数组这在嵌入式开发中非常实用xxd -i logo.png logo.h生成的文件内容类似unsigned char logo_png[] { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, ... }; unsigned int logo_png_len 12345;对于需要优化存储空间的情况可以添加压缩步骤pngquant logo.png -o logo_small.png xxd -i logo_small.png logo.h

更多文章