2016-09-23 49 views
0

我有印像使用gdb進行解碼的十六進制數據結構

0x3a45×1234 0x0352十六進制數據的十六進制流(實時更長的時間)

我知道,這是一個結構的內容。 gdb中有一種方法可以將這個映射到結構上嗎? Gdb似乎只接受單個值做這個。

喜歡:

(GDB)打印(MYSTRUCT)0x3a45 0x1234的0x0352

$ 1 = {A = 3A,B = 45,F = 0×1234,C = 03,E = 52}

在這種情況下,它非常簡單,但是結構複雜,十六進制字符串更大。

回答

1

我認爲有幾個可行的方法,在gdb來做到這一點。

最簡單的方法就是以某種方式將數據寫入下的內存。它看起來是這樣的:

(gdb) set $mem = malloc(50) # number of bytes 
(gdb) set $mem[0] = 0x72 
(gdb) set $mem[1] = 0xff 
# etc - you can find faster ways to do this 
(gdb) print *(struct whatever *) $mem 

填補記憶是痛苦的,但這個可以編寫腳本。例如,你可以寫一個小shell腳本的原始字節轉換成set命令序列,然後source它。或者你可以在Python中編寫一個新的gdb命令,將其自動化。

GDB也有一個擴展,讓一個建立在命令行上的數組,並做一種就可以了「重新詮釋投」。我發現這個方法有點不太方便,因爲我只能使陣列功能創建的int,不char陣列。但無論如何,考慮這個小程序:

struct x { 
    int a; 
    long b; 
}; 

int main() { 
    struct x x = { 23, 97 }; 
    return 0; 
} 

我啓動gdb,並停止對return,然後檢查內存:

(gdb) p sizeof(int) 
$1 = 4 
(gdb) p sizeof(x) 
$2 = 16 
(gdb) x/4xw &x 
0x7fffffffe240: 0x00000017 0x00007fff 0x00000061 0x00000000 

(即第二個字是垃圾,因爲它是在結構中填充。 ..)

現在,我們可以用手從原始數據重建x

(gdb) print {struct x}{0x17, 0x7fff, 0x61, 0} 
$3 = { 
    a = 23, 
    b = 97 
} 

該表達式對gdb提供的C表達式使用了兩個擴展。首先,{0x17, 0x7fff...}是寫入數組的一種方式。其次,{struct x}是一種「重新解釋強制轉換」 - 它將值的原始字節重新解釋爲命名類型。