2021 01 11 PE檔案的兩種狀態

2021-10-14 12:08:21 字數 3097 閱讀 9388

pe檔案靜態(不執行)和動態(執行)是有差異的。

結構體大小(十進位制)

image_dos_header

64位元組

dos stub

注意這個不是結構體,只是為了方便寫在這裡

不確定(鏈結器插入的資料,可以修改、刪除,不影響程式執行)

image_file_header

20位元組

image_optional_header32

224位元組

image_section_header

每個結構體的成員是40個位元組

檔案的前64個位元組,就是 image_dos_header (dos mz頭)。

typedef struct _image_dos_header  image_dos_header, *pimage_dos_header;
image_dos_header (dos mz頭) 的最後乙個成員 e_lfaew,它指向了pe頭從**開始。

從image_dos_header 最後乙個成員開始,直到pe頭之前的就是 dos stub(dos塊)。

dos stub(dos塊) 中的內容是鏈結器增加的,可以修改可以刪除,不會影響程式執行。

整個pe頭的結構:pe檔案頭標誌 + image_file_header + image_optional_header32。

typedef struct _image_nt_headers  image_nt_headers32, *pimage_nt_headers32;
pe頭標誌的大小是4個位元組。

標準pe頭的大小是20個位元組,也就是從pe頭標誌往後數20個位元組。

typedef struct _image_file_header  image_file_header, *pimage_file_header;
擴充套件pe頭的大小是224個位元組(這裡是32位的程式,64位的程式擴充套件pe頭大小和32位的不一樣)。

typedef struct _image_optional_header64  image_optional_header64, *pimage_optional_header64;
結構體看著就這點東西為什麼這麼大?因為該結構體的最後乙個成員是乙個有著16個元素的結構體陣列。

擴充套件pe頭是可擴充套件的,可以往裡面加想加的東西。

在標準pe頭中有乙個成員 sizeofoptionalheader,它是用來標識擴充套件pe頭的大小的。

如果覺得擴充套件pe頭不夠用想自己往裡面加東西,那麼就修改標準pe頭重的成員 sizeofoptionalheader,改變它的值即可。

32位程式的標準pe頭的 sizeofoptionalheader 成員在預設情況下的大小是0xe0(224),如果是64位程式,預設大小是0xf0(240)。

每個結構體的成員的大小是40個位元組。

typedef struct _image_section_header  misc;

dword virtualaddress;

dword sizeofrawdata;

dword pointertorawdata;

dword pointertorelocations;

dword pointertolinenumbers;

word numberofrelocations;

word numberoflinenumbers;

dword characteristics;

} image_section_header, *pimage_section_header;

擴充套件pe頭(image_optional_header32)中的成員 sizeofheaders 是頭的大小,這個頭是dos頭+pe頭+節表,按照檔案對齊以後的值。如果dos頭+pe頭+節表是302個位元組,那麼 sizeofheaders 中儲存的一定不會是302。

擴充套件pe頭(image_optional_header32)中的另乙個成員 filealignment,指的是檔案對齊。

如果 filealignment 的值是0x200,那麼 sizeofheaders 的值一定是0x400,也就是說 sizeofheaders 的值一定是 filealignment 的整數倍。

還是上面的例子,如果dos頭+pe頭+節表是302個位元組,filealignment(檔案對齊)的值是0x200,那麼 sizeofheaders 的值一定是0x400。

如果0x400放不下,但是不超過0x600,那麼 sizeofheaders 就是0x600,如果0x600放不下,但是不超過0x800,那麼 sizeofheaders 就是0x800。

例如:

如果dos頭+pe頭+節表的大小是0x306,那麼 sizeofheaders 的值是0x400。

如果dos頭+pe頭+節表的大小不夠0x400那剩餘的位元組是可以用0x00填充的(可能會被編譯器新增常量字串)。

總而言之,剩下的空白可以拿來用,想填什麼就填什麼(再強調一遍,可能會被編譯器新增常量字串,或許是其他資訊)。

節的大小也一定會是檔案對齊(filealignment)的整數倍,也就是說如果有空白,也都會使用0x00來填充。

pe檔案在硬碟和在記憶體中拉伸後的區別:

檔案起始位址不同。節起始位址不同,由記憶體對齊(sectionalignment)成員屬性決定pe檔案執行時在記憶體中的節起始位址。成員記憶體對齊的大小和檔案對齊的大小可能一樣,也可能不一樣。差異在於每個頭和節,或每個節和節的空白區不一樣。

PE知識複習之PE的兩種狀態

從下面依次網上看.可以得出pe結構 其中dos頭有dos頭結構 也就是 image dos header 關於結構體的各項屬性.前邊已經寫過了.本系列部落格就是加深pe印象.理解複雜的原理.image dos header 大小 64個位元組 十六進製制 0x40位元組 image file hea...

Python檔案的兩種用途

python檔案總共有兩種用途,一種是執行檔案 另一種是被當做模組匯入。編寫好的乙個python檔案可以有兩種用途 指令碼,乙個檔案就是整個程式,用來被執行 模組,檔案中存放著一堆功能,用來被匯入使用 aaa.py x 1 def f1 print from f1 def f2 print from...

python檔案的兩種用途

在講這個知識點之前我們先來講一下python的兩種檔案 執行檔案 當前執行的檔案 模組檔案 被匯入的檔案 eg from m1 import y m1為模組檔案 print y 執行檔案和模組檔案是相對的 所以他的兩種用途分別是 指令碼。乙個檔案就是整個程式,用來被執行 模組。檔案中存放著一堆功能,...