Próbuję sprawdzić bufor, który zawiera binarnie sformatowaną wiadomość, ale także zawiera ciąg danych. Jako przykład, używam tego kodu C:Zrzut pamięci sformatowany jak xxd z gdb
int main (void) {
char buf[100] = "\x01\x02\x03\x04String Data\xAA\xBB\xCC";
return 0;
}
Chciałbym uzyskać zrzut szesnastkowy, co w buf
, o formacie zbliżonym do xxd
(I nie obchodzi mnie, czy jest to dokładne dopasowanie , czego tak naprawdę szukam, to zrzut heksowy obok siebie z drukowanymi znakami).
Wewnątrz GDB mogę używać coś takiego:
(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
który jest w porządku, ale trudno wyłowić sznurki w ten sposób ... czy mogę używać
(gdb) x /100bs buf
0x7fffffffdf00: "\001\002\003\004String Data\252\273\314"
0x7fffffffdf13: ""
0x7fffffffdf14: ""
0x7fffffffdf15: ""
0x7fffffffdf16: ""
0x7fffffffdf17: ""
...
który sprawia, że trudno do czytania części binarnej ... rzeczywiste wiadomości, z którymi mam do czynienia, mają w sobie także wiele ascii, więc tak naprawdę wygląda jak bałagan.
Najlepszym mogę wymyślić to, aby to zrobić:
(gdb) dump binary memory dump.bin buf buf+100
a następnie
$ 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 ....
ale to ból robić to za każdym razem. Pomyślałem, że ktoś tam chciał tego wcześniej, więc zastanawiam się, czy ktoś znalazł sposób, aby to zrobić wewnątrz gdb. Plus tracisz adresy z oryginalnej pamięci w ten sposób.
Używam GDB 7.4 z wbudowanym wsparciem Pythona, więc jestem otwarty na pomysł użycia ładnej drukarki lub podobnej, ale nie wiem jak to ustawić.
Ah, dobre myślenie. Nie zdawałem sobie sprawy, że tak łatwo można dodać skróty do GDB. Zakończyłem to w pythonie, o którym wspomniałeś, ale jestem pewien, że będę mógł użyć tego idiomu. – FatalError
Należy zauważyć, że jeśli '$ arg0' jest wskaźnikiem do struktury, to' $ arg1' będzie traktowane jako liczba obiektów, a nie bajtów. Użyj '((void *) $ arg0) + $ arg1' zamiast' $ arg0 + $ arg1' jeśli to będzie problem. –
Należy również zauważyć, że nowsze wersje 'xxd' obsługują flagę' -o', która dodaje przesunięcie do wyświetlanych wartości adresów. –