檢測PE檔案的有效性

2021-05-01 10:31:08 字數 2433 閱讀 8989

2023年01月14日 星期一 13:41

本文刊登於2023年第8期的《黑客防線》,有內容部分改動。

正文如下:

從防毒軟體的角度來講檢測檔案是否為pe檔案,並再進一步判斷使用何種方式對檔案進行操作。在病毒感染可執行檔案時,也是應該有這樣步驟的。那麼,就來看看防毒軟體是如何檢測pe檔案的有效性了。

pe檔案是在windows系統中任何可執行模組或者dll的檔案格式。pe的意思是portable executable(可移植的執行體)。它是win32環境自身所帶的執行體檔案格式。pe檔案格式是跨win32平台的,就是說即使是執行在非intel cpu上的windows都能夠被pe裝載器識別和使用該檔案格式。

所有常見的pe結構定義在winnt.h標頭檔案中。我們一般關心的有:image_dos_header、image_file_header、image_optional_header32、image_section_header、image_nt_header……還有很多的!在這裡,我們只討論兩個結構,乙個是image_dos_header,另乙個是image_nt_headers。通過這兩個結構,我們就可以完成我們檢測pe有效性的功能了。好了,看看這兩個結構在winnt.h中的定義吧。

typedef struct _image_dos_header image_dos_header, *pimage_dos_header;

typedef struct _image_nt_headers image_nt_headers32, *pimage_nt_headers32;

由於image_dos_header結構中有很多成員,因此我們只列出了我們要討論的就可以了,其他的就用省略號代替就可以了。在_image_dos_header結構中,e_magic為dos可執行檔案標記;e_lfanew是相對實際pe頭標的相對偏移量,也就是image_nt_headers結構的位址。在image_nt_headers中,我們只使用signature這個成員,它是pe檔案的標識(pe/0/0)。為了方便程式設計,在winnt.h中為dos標識和pe標識定義了巨集,分別是:

#define image_dos_signature0x5a4d// mz

#define image_nt_signature0x00004550// pe00

好了,有了上面的pe結構的知識,我們就可以完成檢測pe檔案的有效性的程式了。那麼來看看編寫檢測pe檔案有效性程式的步驟好了。首先,我們需要用createfile開啟要檢測的檔案,然後通過判斷是否是image_dos_signature來檢測是否是有效的dos頭,接下來用e_lfnew來定位pe頭了,最後通過判斷是否是image_nt_signature來檢測檔案的有效性了。一共四步,不過最後記得要用closehandle來關閉已開啟檔案的控制代碼。好了,可以介紹的內容大概就這麼多了,來看看具體的**吧!

//這裡就是我們的第一步,開啟要檢測的檔案

hfile=createfile(filename,generic_read,file_share_read,null,open_existing,file_attribute_normal,null);

//這裡是第二步,檢測dos頭部的有效性

readfile(hfile,&image_dos_header,sizeof(image_dos_header),&dwread,null);

if(dwread==sizeof(image_dos_header))}}

}if(b)

messagebox("該程式是乙個有效pe檔案!");

else

messagebox("該程式不是乙個有效pe檔案!");

closehandle(hfile);

依據我開始寫的程式的邏輯,得到了這樣的**,其中還有createfile()、readfile()、setfilepointer()這些api函式,它們都可以在msdn中找到,大家自己找一下吧。這裡就不在給出它們的定義了。

其實這種方式並不是唯一的一種檢測

pe檔案有效性的方式,這些也只是起到拋磚引玉的目的了。在《黑防》今年第

4期中的《以「熊貓燒香」的名義,再談

delphi

編寫病毒程式》文章中,這位作者判斷

pe檔案有效性的方式是順序讀取檔案前

0x108

位元組的內容,每次讀取兩個位元組,然後判斷是否為「

pe」標識。當然,除了這兩種方法外,還有其他的方法。在另外的其他方式中不在使用

readfile()

和setfilepointer()

這兩個api

函式了,而是除了使用

createfile()

函式外,還要使用一些記憶體對映檔案方面的相關函式

和mapviewoffile()

。這裡就不討論它們了,就留給大家自己去研究一下了。

以上就是文章的正文了。

引自:   http://hi.baidu.com/jester/blog/item/3e79a3865d37413a67096eb2.html

PE檔案的有效性判斷

pe 檔案格式被組織為乙個線性的資料流。開始的是 ms dos 頭,然後是實模式的程式根,再就是 pe檔案簽名,緊隨其後的便是 pe檔案頭和可選頭。在這之後,出現的是所有的節頭,再跟著的就是所有節的節身。檔案常以一些其它方面的雜項資訊,包括重定位資訊 符號表資訊 行數資訊以及字串表資料等作為結尾。所...

PE教程2 檢驗PE檔案的有效性

如何才能校驗指定檔案是否為一有效 pe檔案呢 這個問題很難回答,完全取決於想要的精準程度。您可以檢驗 pe檔案格式裡的各個資料結構,或者僅校驗一些關鍵資料結構。大多數情況下,沒有必要校驗檔案裡的每乙個資料結構,只要一些關鍵資料結構有效,我們就認為是有效的 pe檔案了。下面我們就來實現前面的假設。我們...

有效性單元

demonstration company公司生產乙個叫做pcx conveyor的產品,portable model pcx conveyor.標準的產品bom如下 物料數量 發料倉庫 10pcx belt black trackmate 533 cos pvc 1.0000 whams1 20p...