pe(portable executeable file format)可移植的執行文體格式,我們平時常見的exe\dll\sys等都是pe檔案的一種。pe檔案的組成可以被分為pe head和pe body,我們先從pe檔案頭的dos頭部說起。
dos頭部分為兩部分:第一部分是dos mz頭第二部分是dos stub(指令位元組碼)。
以下為dos mz頭部微軟給出的定義,其中我學習中用到的最關鍵兩個字段就是e_magic和e_lfanew,分別用來確定是否是pe檔案和定址nt headers的首位址
typedef
struct _image_dos_header // dos .exe header
image_dos_header,
*pimage_dos_header;
dos stub大多數時候是由編譯器自動生成,其長度是pe檔案鏈結生成時確定的,其長度在不同的pe檔案中不一定相同,其緊跟在dos mz頭部的下面,整個時乙個位元組塊,pe中沒有與之相關的結構體。所以我們不可以直接用 dos heaher基位址+sizeof(image_dos_header)的方式定位到nt頭部。
接下來附上一點我的測試**和定位到nt頭的**:
tchar* cpehelper::
getfilemempointer
(tchar* filefullpath,dword* m_filesize)
//獲取檔案大小
dword filesize =
getfilesize
(filehandle,
null);
*m_filesize = filesize;
//檔案大小返出值
//申請記憶體 用來存放pe檔案資料
tchar* buferdata =
new tchar[filesize]
;//讀檔案
dword returnlength;
readfile
(filehandle, buferdata, filesize,
&returnlength,
null);
//關閉檔案控制代碼
if(filehandle !=
null
)//返回pe檔案起始位置(基址)
return buferdata;
}//.......判斷pe檔案的一部分**
pimage_dos_header imagedosheader =
(pimage_dos_header)filebuffer;
//filebuffer = 上面函式返回的bufferdata
if(imagedosheader-
>e_magic != image_dos_signature)
//定位到nt頭部
pimage_nt_headers imagentheaders =
(pimage_nt_headers)
(imagedosheader-
>e_lfanew +
(ulong)filebuffer)
;
next:image_nt_headers PE檔案學習 Nt頭部
當我們越過dos stub之後就來到了image nt headers,這個結構在32位和64位下的大小是不一樣的,這個結構體緊跟在dos stub之後,結構體看起來只有三個成員,接下來我們來乙個乙個細細解剖 typedef struct image nt headers64 image nt he...
PE檔案之DOS頭
微軟為了照顧相容性,在以後的pe檔案中也加入了dos頭 在dos頭有兩個部分 1 dos mz頭 結構體為 image dos header struct 0h word e magic magic dos signature mz 4dh5ah dos可執行檔案標記 2h word e cblp ...
PE檔案詳解一 M DOS頭部IMAGE DOS
1.m dos頭部結構體 image dos header struct image dos header ends 1.該結構有兩個重要的成員 dword e magic和long e lfanew。dword e magic為 mz 定義為image dos signature。long e l...