2010-07-14 63 views
2

我需要驗證給定的二進制文件是否爲PE文件(例如,如果我將JS/HTML或.class文件重命名爲.exe或.dll),它不會仍然是PE文件。解析PE文件會給我關於這個問題的信息;什麼字段表示給定的二進制文件是否是有效的PE文件?什麼領域的PE頭文件告訴你是否一個有效的PE文件?

我檢查了FileHeader的「e_magic」字段,它總是在錯誤的PE文件(即js/html/java/class文件改名爲.dll/Exe)的情況下填充,並且不會說任何關於PE的有效性。

+3

你在做什麼需要這項檢查?無論如何你要運行EXE,最好把檢查留給Windows。如果你正在檢查惡意的二進制文件,那麼你需要做一個幾乎無止境的檢查清單;你最終會寫自己的病毒掃描程序。 – 2010-07-14 12:21:22

+0

請解釋PE,因爲我的體育教育定義不適合這種情況。 – 2010-07-14 18:17:09

回答

2

檢查Portable Executable/Common Object File Format Specification。一共有三個魔術值,你的檢查:

  • 的MZ頭的幻數在文件
  • 開頭的PE頭的幻數「PE \ 0 \ 0」的PE頭
  • 開始
  • 可選標題IIRC的版本標識符,PE文件爲0x10b,PE +(x64)文件爲0x20b。

除此之外,你必須分析整個文件,並期待在每一個處理器的指令,以確保它是有效的,等幾個文件的使用COFF規範內部,你可能沒有一個簡單的方法來區分這一點。 PE的格式本身是用多臺機器設計的,並且可以包含許多不同形式的編譯代碼,同時保持文件的有效性。

+0

感謝Billy ONeal回答。 我認爲只考慮PE頭的PE00字節組成關於PE文件有效性的決定就足夠了。我認爲MZ頭字節只是說明你的文件不能在DOS模式下運行,而Windows需要這樣的功能。 Is'nt? – Usman 2010-07-15 05:39:23

+0

它也可能要求您有一個有效sizeof可選標題。 – 2014-12-08 23:46:45

6

如果存在這樣的字段,那麼創建無效的exe文件並將其標記爲有效是非常容易的。

您驗證一個文件是通過讀取PE頭和各個領域的檢查值的PE文件(值應屬於有效範圍,不應該將文件等外點)。

+0

+1有很多RVA(相對虛擬地址)字段需要檢查;這些都應該指向PE中合適的部分。但是,一旦你完成了,你仍然不知道二進制文件是否是惡意的。 – 2010-07-14 12:20:26

+0

我不認爲他說任何關於惡意的東西。他只是不想讓某人使用明顯不是PE的文件作爲PE文件。 – 2010-07-14 12:27:15

+0

'使用'的意義在這裏很重要。如果用戶信任這個二進制文件,並且在這次檢查之後立即運行它,那麼Windows PE加載器將進行必要的驗證。如果此檢查的目的是確定二進制文件是否可信,那麼需要做很多工作。 – 2010-07-14 12:30:58