我需要驗證給定的二進制文件是否爲PE文件(例如,如果我將JS/HTML或.class文件重命名爲.exe或.dll),它不會仍然是PE文件。解析PE文件會給我關於這個問題的信息;什麼字段表示給定的二進制文件是否是有效的PE文件?什麼領域的PE頭文件告訴你是否一個有效的PE文件?
我檢查了FileHeader的「e_magic」字段,它總是在錯誤的PE文件(即js/html/java/class文件改名爲.dll/Exe)的情況下填充,並且不會說任何關於PE的有效性。
我需要驗證給定的二進制文件是否爲PE文件(例如,如果我將JS/HTML或.class文件重命名爲.exe或.dll),它不會仍然是PE文件。解析PE文件會給我關於這個問題的信息;什麼字段表示給定的二進制文件是否是有效的PE文件?什麼領域的PE頭文件告訴你是否一個有效的PE文件?
我檢查了FileHeader的「e_magic」字段,它總是在錯誤的PE文件(即js/html/java/class文件改名爲.dll/Exe)的情況下填充,並且不會說任何關於PE的有效性。
檢查Portable Executable/Common Object File Format Specification。一共有三個魔術值,你的檢查:
除此之外,你必須分析整個文件,並期待在每一個處理器的指令,以確保它是有效的,等幾個文件的使用COFF規範內部,你可能沒有一個簡單的方法來區分這一點。 PE的格式本身是用多臺機器設計的,並且可以包含許多不同形式的編譯代碼,同時保持文件的有效性。
感謝Billy ONeal回答。 我認爲只考慮PE頭的PE00字節組成關於PE文件有效性的決定就足夠了。我認爲MZ頭字節只是說明你的文件不能在DOS模式下運行,而Windows需要這樣的功能。 Is'nt? – Usman 2010-07-15 05:39:23
它也可能要求您有一個有效sizeof可選標題。 – 2014-12-08 23:46:45
如果存在這樣的字段,那麼創建無效的exe文件並將其標記爲有效是非常容易的。
您驗證一個文件是通過讀取PE頭和各個領域的檢查值的PE文件(值應屬於有效範圍,不應該將文件等外點)。
+1有很多RVA(相對虛擬地址)字段需要檢查;這些都應該指向PE中合適的部分。但是,一旦你完成了,你仍然不知道二進制文件是否是惡意的。 – 2010-07-14 12:20:26
我不認爲他說任何關於惡意的東西。他只是不想讓某人使用明顯不是PE的文件作爲PE文件。 – 2010-07-14 12:27:15
'使用'的意義在這裏很重要。如果用戶信任這個二進制文件,並且在這次檢查之後立即運行它,那麼Windows PE加載器將進行必要的驗證。如果此檢查的目的是確定二進制文件是否可信,那麼需要做很多工作。 – 2010-07-14 12:30:58
一種方法是使用GetBinaryType
函數(請參閱http://msdn.microsoft.com/en-us/library/aa364819.aspx)或使用SHGetFileInfo
與SHGFI_EXETYPE
。
你在做什麼需要這項檢查?無論如何你要運行EXE,最好把檢查留給Windows。如果你正在檢查惡意的二進制文件,那麼你需要做一個幾乎無止境的檢查清單;你最終會寫自己的病毒掃描程序。 – 2010-07-14 12:21:22
請解釋PE,因爲我的體育教育定義不適合這種情況。 – 2010-07-14 18:17:09