原創 手寫乙個PE檔案

2021-09-08 16:08:56 字數 1941 閱讀 2301

手寫乙個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

_image_nt_headers

image_nt_headers;

為了程式設計方便,windows為dos檔案標記和pe檔案標記都定義了巨集標識。

#define image_dos_header         0x5a4d          //

mz#define image_nt_signature 0x00004550 //

pe00

二、了解了pe的檔案結構,我們就可以來寫乙個pe檔案

特別要注意位置的相對性,因為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檔案。我對其中**進行了修改,**如下:

void

ccheckdlg::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...