手寫乙個pe檔案,首先要對pe檔案有乙個基本的了解。這裡使用的工具是hex workshop6.5。
一、開始為乙個結構體,我們來看一下:
typedef struct _image_dos_header image_dos_header, *pimage_dos_header;首先e_magic應為0x5a4d,ansi對應為「mz」。還有乙個關鍵的就是e_lfanew,指向image_nt_header的開始位置。根據
由於儲存的方式是地位存放低位元組,高位存放高位元組,所以開始本來是0x5a4d,結果變成了4d5a,到d8000000的時候,這個結構體結束。
後面是一段dos的程式,然後是image_nt_header結構,d800000000(其實真正的資料時0000『00d8),指向後面的signature,即00004550.ansi為「pe00」,表示pe的有效性。我們可以使用ctrl+g,然後輸入十六進製制資料「000000d8」,直接跳轉到該位置。
下面,我們再來看看 image_nt_header的結構
typedef struct為了程式設計方便,windows為dos檔案標記和pe檔案標記都定義了巨集標識。_image_nt_headers
image_nt_headers;
#define image_dos_header 0x5a4d //二、了解了pe的檔案結構,我們就可以來寫乙個pe檔案mz#define image_nt_signature 0x00004550 //
pe00
特別要注意位置的相對性,因為hex workshop是可調節大小的。
這樣,第乙個結構體就差最後乙個資料了,那就是e_lfanew的值(我這裡寫了,為42000000,實際為00000042,即下一行的開始)。
42000000之後的資料就代表了dos程式,雖然是幾個0。而42000000(實際是0000『0042),指向的是下一行的開始,即image_nt_headers的開始部分。
而且只要這個位置的值是ansi的pe00,則表示這個檔案時乙個pe檔案:
這樣,乙個pe檔案就完成了,我們儲存為pe.exe,等待下一步的驗證。
三、pe的驗證
在王豔萍的windows程式設計中,有涉及到pe檔案的驗證,我們就以書中**設計乙個程式,用來驗證程式是否是pe檔案。我對其中**進行了修改,**如下:
voidccheckdlg::onbutton1()
image_dos_header dosheader;
image_nt_headers32 ntheader;
bool bvalid=false;
dword dwread;
::readfile(hfile,&dosheader,sizeof(dosheader),&dwread,null);
if(dwread==sizeof
(dosheader))}}
if(bvalid)
messagebox(
"是乙個pe格式的檔案
","提示
如何判斷乙個檔案是否為PE檔案
pe檔案,portable executable file format簡稱。那麼如何判斷乙個檔案是否為pe格式的檔案?1 首先檢驗檔案頭部第乙個字的值是否等於 image dos signature,是則 dos mz header 有效。2 一旦證明檔案的 dos header 有效後,就可用e...
手寫乙個Tomcat
1 工程截圖 2 封裝請求物件 通過輸入流,對http協議進行解析,拿到了http請求頭的方法和url author wangjie version 2018 11 9 封裝請求物件 通過輸入流,對http協議進行解析,拿到http請求頭的方法和url 3 封裝響應物件 基於http協議的格式進行輸...
手寫乙個ajax
在我看來,寫乙個ajax就需要5步,也就是5個單詞,這就是乙個ajax的流程。這五個單詞分別為 new open setrequestheader onreadystatechange send。記住這五個單詞你就有了ajax的整體的框架了。以上是最麻煩的一步,後面的步驟就比較簡單了。ajax.op...