我正在尝试检查一个缓冲区,该缓冲区包含二进制格式的消息,但也包含字符串数据。例如,我正在使用以下C代码:
int main (void) { char buf[100] = "\x01\x02\x03\x04String Data\xAA\xBB\xCC"; return 0; }
我想要buf一个类似于的格式的十六进制转储xxd(我不在乎它是否完全匹配,我真正想要的是与可打印字符并排的十六进制转储)。
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,因此我愿意使用漂亮的打印机或类似打印机,但是我不知道如何设置它。
(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解释器)来执行相同的操作,而无需“掏空”。