文件数据文本化: xxd / hexdump / readelf
xxd file > output.txt
hexdump -C file > output.txt
readelf -h file > output.txt
xxd
xxd 用于创建给定文件或标准输入的十六进制转储,也可以将十六进制转储转换回其原始二进制形式。与 uuencode(1) 和 uudecode(1) 类似,它允许以 “邮件安全” 的ASCII表示形式传输二进制数据,但优势在于可以解码到标准输出。此外,它还可用于执行二进制文件修补。
| 参数 | 说明 |
|---|---|
| -a, -autoskip | 切换自动跳过功能:用单个 * 替换全零行。默认关闭。 |
| -b, -bits | 切换到二进制位转储,而不是十六进制转储。此选项将字节写为八个 “1” 和 “0” 组成的数字,而不是普通的十六进制转储。每行前面是十六进制的行号,后面是ASCII(或EBCDIC)表示。命令行开关 -p、-i 在此模式下不起作用。 |
| -c cols, -cols cols | 每行格式化 <cols> 个字节。默认值为16(-i 时为12,-ps 时为30,-b 时为6)。最大值为256。-ps 模式下无最大值。在 -ps 模式下,值为0会导致输出为一整行长字符串。 |
| -C, -capitalize | 在使用 -i 时,以C语言头文件风格将变量名大写。 |
| -E, -EBCDIC | 将右侧列中的字符编码从ASCII更改为EBCDIC。这不会改变十六进制表示。此选项与 -r、-p 或 -i 组合使用时无意义。 |
| -e | 切换到小端序十六进制转储。此选项将字节组视为小端序字节顺序的字。默认的4字节分组可使用 -g 更改。此选项仅适用于十六进制转储,不改变ASCII(或EBCDIC)表示。命令行开关 -r、-p、-i 在此模式下不起作用。 |
| -g bytes, -groupsize bytes | 每 <bytes> 个字节(每个字节用两个十六进制字符或八个二进制位表示)的输出之间用空格分隔。指定 -g 0 可取消分组。正常模式下 <bytes> 默认值为2,小端序模式下为4,二进制位模式下为1。分组不适用于PostScript或头文件风格输出。 |
| -h, -help | 打印可用命令的摘要并退出。不执行十六进制转储。 |
| -i, -include | 以C语言头文件风格输出。除非 xxd 从标准输入读取,否则会写入一个完整的静态数组定义(数组名以输入文件名命名)。 |
| -l len, -len len | 写入 <len> 个字节后停止。 |
| -n name, -name name | 在使用 -i 时覆盖输出的变量名。数组名为 name,长度名为 name_len。 |
| -o offset | 在显示的文件位置上加上 <offset>。 |
| -p, -ps, -postscript, -plain | 以PostScript连续十六进制转储风格输出,也称为纯十六进制转储风格。 |
| -r, -revert | 反向操作:将十六进制转储转换(或修补)为二进制。如果不写入标准输出,xxd 会在不截断输出文件的情况下写入。使用 -r -p 组合可读取无行号信息且无特定列布局的纯十六进制转储。输入中任何位置允许有额外的空格和换行符。使用 -r -b 组合可读取二进制位转储而非十六进制转储。 |
| -R when | 在输出中,根据十六进制值对十六进制值和字符值都进行相同的颜色标记,主要用于区分可打印和不可打印字符。when 取值为 never、always 或 auto。当设置了 $NO_COLOR 环境变量时,颜色标记功能将被禁用。 |
| -seek offset | 在 -r 之后使用:在十六进制转储中找到的文件位置上加上 <offset> 后进行转换。 |
| -s [+][-]seek | 从输入文件的 <seek> 字节绝对(或相对)偏移位置开始。+ 表示偏移相对于当前标准输入文件位置(不从标准输入读取时此符号无意义)。- 表示偏移从输入末尾开始计算(或与 + 组合使用时,表示从当前标准输入文件位置之前开始计算)。如果不使用 -s 选项,xxd 从当前文件位置开始。 |
| -u | 使用大写十六进制字母。默认使用小写字母。 |
| -v, -version | 显示版本字符串。 |
hexdump
hexdump 工具是一个过滤器,它能以用户指定的格式显示指定文件的内容;若未指定文件,则显示标准输入的内容。
| 参数 | 说明 |
|---|---|
| -b, --one-byte-octal | 单字节八进制显示。每行以十六进制显示输入偏移量,后跟十六个用空格分隔、三位一列且用零填充的输入数据字节(以八进制表示)。 |
| -c, --one-byte-char | 单字节字符显示。每行以十六进制显示输入偏移量,后跟十六个用空格分隔、三位一列且用空格填充的输入数据字符。 |
| -C, --canonical | 标准十六进制+ASCII显示。每行以十六进制显示输入偏移量,后跟十六个用空格分隔、两位一列的十六进制字节,接着是同样的十六个字节,以 %_p 格式显示并包含在 ` |
| -d, --two-bytes-decimal | 双字节十进制显示。每行以十六进制显示输入偏移量,后跟八个用空格分隔、五位一列、用零填充的双字节输入数据单元(以无符号十进制表示)。 |
| -e, --format format_string | 指定用于显示数据的格式字符串。 |
| -f, --format-file file | 指定一个文件,该文件包含一个或多个用换行符分隔的格式字符串。空行和第一个非空白字符是井号(#)的行将被忽略。 |
| -L, --color[=when] | 接受输出的颜色设置。可选参数 when 可以是 auto(自动)、never(从不)或 always(总是)。如果省略 when 参数,则默认为 auto。颜色显示可以被禁用;当前内置的默认设置可查看 --help 的输出。另请参阅下面的 “颜色” 小节和 “颜色” 部分。 |
| -n, --length length | 仅处理长度为 length 字节的输入。 |
| -o, --two-bytes-octal | 双字节八进制显示。每行以十六进制显示输入偏移量,后跟八个用空格分隔、六位一列、用零填充的双字节输入数据量(以八进制表示)。 |
| -s, --skip offset | 从输入开头跳过 offset 字节。 |
| -v, --no-squeezing | -v 选项使 hexdump 显示所有输入数据。如果不使用 -v 选项,任何一组与前一组输出行(除了输入偏移量)完全相同的输出行,都将被替换为仅包含一个星号的行。 |
| -x, --two-bytes-hex | 双字节十六进制显示。每行以十六进制显示输入偏移量,后跟八个用空格分隔、四位一列、用零填充的双字节输入数据量(以十六进制表示)。 |
| -h, --help | 显示帮助文本并退出。 |
| -V, --version | 输出版本信息并退出。 |
readelf
readelf用于展示一个或多个ELF(Executable and Linkable Format)格式目标文件的相关信息。借助各种选项,用户能够灵活控制具体要展示的信息内容。它不仅支持32位和64位的ELF文件,还能处理包含ELF文件的归档文件。该程序和objdump功能类似,但readelf提供的信息更为详尽,并且它独立于BFD(Binary File Descriptor)库运行。这意味着如果BFD库出现问题,readelf的正常工作不会受到影响。
| 参数 | 说明 |
|---|---|
| -a, --all | 等同于同时指定--file-header、--program-headers、--sections、--symbols、--relocs、--dynamic、--notes、--version-info、--arch-specific、--unwind、--section-groups和--histogram这些参数。不过要注意,此选项不会自动启用--use-dynamic。所以,若命令行中未明确给出--use-dynamic参数,那么动态符号和动态重定位信息将不会展示出来 |
| -h, --file-header | 用于展示文件起始位置ELF头中所包含的信息 |
| -l, --program-headers, --segments | 若文件存在段头,该参数可展示其相关信息 |
| -S, --sections, --section-headers | 用于展示文件节头的信息(前提是文件存在节头) |
| -s, --symbols, --syms | 若文件有符号表节,此参数会展示其中的条目。若符号关联了版本信息,也会一并展示。版本字符串会以符号名后缀的形式呈现,前面加上@字符,比如foo@VER_1。要是该版本是解析未版本化符号引用时的默认版本,后缀前则加两个@字符,即foo@@VER_2 |
| -e, --headers | 可以展示文件中的所有头信息,效果等同于同时使用-h -l -S这三个参数 |
| -n, --notes | 若文件包含NOTE段和(或)节,使用此参数可展示其内容 |
| -r, --relocs | 用于展示文件重定位节的内容(若文件存在该节) |
| -u, --unwind | 用于展示文件展开节的内容(仅支持IA64 ELF文件的展开节以及ARM展开表,即.ARM.exidx和.ARM.extab)。如果针对您的架构尚未实现支持,可尝试利用--debug-dump=frames或--debug-dump=frames-interp参数来转储.eh_frames节的内容 |
| -d, --dynamic | 若文件存在动态节,使用此参数可展示其内容 |
| -V, --version-info | 用于展示文件中版本节的内容(若存在版本节) |
| -A, --arch-specific | 若文件包含特定于架构的信息,此参数可将其展示出来 |
| -x |
把指定的节内容以十六进制字节形式展示。其中,数字代表节表中的索引,用于指定特定的节;而其他字符串则会匹配目标文件中所有具有该名称的节 |
| -p |
将指定节的内容展示为可打印字符串。同样,数字通过节表索引指定节,其他字符串匹配同名节 |
| -w, --debug-dump | 用于展示文件中DWARF调试节的内容(若存在)。压缩的调试节在展示前会自动临时解压缩。在--debug-dump后添加不同的字母或单词,可指定展示特定类型的调试信息,如=info展示.debug_info节内容、=abbrev展示.debug_abbrev节内容等 |
| -v, --version | 用于展示readelf的版本号 |
| -W, --wide | 默认情况下,readelf会对64位ELF文件的节头和段列表行进行换行处理,以适配80列的显示宽度。使用此参数后,readelf会在单行中打印每个节头或每个段,在宽度超过80列的终端上查看时可读性更高 |
| -H, --help | 用于展示readelf可识别的命令行选项 |


浙公网安备 33010602011771号