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 執行檔案和模組檔案是相對的 所以他的兩種用途分別是 指令碼。乙個檔案就是整個程式,用來被執行 模組。檔案中存放著一堆功能,...