小编典典

内存转储的格式类似于来自gdb的xxd

python

我正在尝试检查一个缓冲区,该缓冲区包含二进制格式的消息,但也包含字符串数据。例如,我正在使用以下C代码:

int main (void) {
    char buf[100] = "\x01\x02\x03\x04String Data\xAA\xBB\xCC";

    return 0;
}

我想要buf一个类似于的格式的十六进制转储xxd(我不在乎它是否完全匹配,我真正想要的是与可打印字符并排的十六进制转储)。

在GDB中,我可以使用类似以下内容的代码:

(gdb) x /100bx buf
0x7fffffffdf00: 0x01    0x02    0x03    0x04    0x53    0x74    0x72    0x69
0x7fffffffdf08: 0x6e    0x67    0x20    0x44    0x61    0x74    0x61    0xaa
0x7fffffffdf10: 0xbb    0xcc    0x00    0x00    0x00    0x00    0x00    0x00
0x7fffffffdf18: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x7fffffffdf20: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x7fffffffdf28: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x7fffffffdf30: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x7fffffffdf38: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x7fffffffdf40: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x7fffffffdf48: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x7fffffffdf50: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x7fffffffdf58: 0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00

很好,但是很难那样挑选字符串…或者我可以使用

(gdb) x /100bs buf
0x7fffffffdf00:  "\001\002\003\004String Data\252\273\314"
0x7fffffffdf13:  ""
0x7fffffffdf14:  ""
0x7fffffffdf15:  ""
0x7fffffffdf16:  ""
0x7fffffffdf17:  ""
...

这使得很难读取二进制部分…我正在处理的实际消息中也包含大量的asciiul,所以实际上看起来就像是一团糟。

我能想到的最好的方法是:

(gdb) dump binary memory dump.bin buf buf+100

接着

$ xxd dump.bin
0000000: 0102 0304 5374 7269 6e67 2044 6174 61aa  ....String Data.
0000010: bbcc 0000 0000 0000 0000 0000 0000 0000  ................
0000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000060: 0000 0000                                ....

但这每次都很难。我发现那里以前有人想要这个,所以想知道是否有人找到了在gdb中执行此操作的方法。另外,这样会丢失原始存储器中的地址。

我使用的是内置了python支持的GDB 7.4,因此我愿意使用漂亮的打印机或类似打印机,但是我不知道如何设置它。


阅读 260

收藏
2021-01-20

共1个答案

小编典典

(gdb) define xxd
>dump binary memory dump.bin $arg0 $arg0+$arg1
>shell xxd dump.bin
>end
(gdb) xxd &j 10 
0000000: 0000 0000 0000 0000 0000 0000 4d8c a7f7  ............M...
0000010: ff7f 0000 0000 0000 0000 0000 c8d7 ffff  ................
0000020: ff7f 0000 0000 0000

似乎很容易;-)

您可能会编写Python脚本(现代GDB版本已嵌入Python解释器)来执行相同的操作,而无需“掏空”。

2021-01-20