PE檔案的有效性判斷

來源:互聯網
上載者:User

 

  可攜式執行檔格式被組織為一個線性資料流。開始的是 MS-DOS 頭,然後是實模式的程式根,再就是 可攜式執行檔簽名,緊隨其後的便是 可攜式執行檔頭和可選頭。在這之後,出現的是所有的節頭,再跟著的就是所有節的節身。檔案常以一些其它方面的雜項資訊,包括重定位資訊、符號表資訊、行數資訊以及字串表資料等作為結尾。所有這些都可以通過查看圖 1 中的圖象資訊更輕鬆地被消化吸收。

 

 

判斷一個檔案是否是有效性 可攜式執行檔,主要是判斷指定檔案是否有:“有效 DOS 頭”和“ 可攜式執行檔簽名”

在WinNT.h檔案中,定義一下兩個結構體:<br />typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header<br /> WORD e_magic; // Magic number<br /> WORD e_cblp; // Bytes on last page of file<br /> WORD e_cp; // Pages in file<br /> WORD e_crlc; // Relocations<br /> WORD e_cparhdr; // Size of header in paragraphs<br /> WORD e_minalloc; // Minimum extra paragraphs needed<br /> WORD e_maxalloc; // Maximum extra paragraphs needed<br /> WORD e_ss; // Initial (relative) SS value<br /> WORD e_sp; // Initial SP value<br /> WORD e_csum; // Checksum<br /> WORD e_ip; // Initial IP value<br /> WORD e_cs; // Initial (relative) CS value<br /> WORD e_lfarlc; // File address of relocation table<br /> WORD e_ovno; // Overlay number<br /> WORD e_res[4]; // Reserved words<br /> WORD e_oemid; // OEM identifier (for e_oeminfo)<br /> WORD e_oeminfo; // OEM information; e_oemid specific<br /> WORD e_res2[10]; // Reserved words<br /> LONG e_lfanew; // File address of new exe header<br />} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;<br />typedef struct _IMAGE_NT_HEADERS {<br /> DWORD Signature;<br /> IMAGE_FILE_HEADER FileHeader;<br /> IMAGE_OPTIONAL_HEADER32 OptionalHeader;<br />} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;<br />

 

具體操作:

1、 把指定檔案載入到記憶體中

2、  擷取檔案的DOS 頭部(IMAGE_DOS_HEADER ), 判斷 IMAGE_DOS_HEADER 中的成員變數e_magic 是否等於“ MZ ”,如果是,則說明該檔案擁有有效DOS 頭

3、  根據IMAGE_DOS_HEADER 中的成員變數e_lfanew ,擷取可攜式執行檔頭(IMAGE_NT_HEADERS32 ),判斷IMAGE_NT_HEADERS32 中的成員變數Signature 是否等於“ PE00 ”,如果是,則說明該檔案是 有效可攜式執行檔

4、  從記憶體中刪除載入的檔案

 

// [9/28/2010 zcg]<br />//判斷pe檔案的有效性<br />bool CheckPEFile(const wchar_t *lpFilePath)<br />{<br />bool isPEFile = false;<br />HANDLE hFile = NULL;<br />IMAGE_DOS_HEADER stDosHeader;<br />IMAGE_NT_HEADERS32 stNtheader;<br />DWORD dwRet = 0;</p><p>//判斷檔案路徑的有效性<br />if (NULL == lpFilePath)<br />{<br />isPEFile = false;<br />goto END;<br />}<br />//第一步,開啟要檢測的檔案<br />hFile = CreateFile(lpFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);<br />if (NULL == hFile)<br />{<br />isPEFile = false;<br />goto END;<br />}<br />//第二步,檢測DOS頭部的有效性<br />ReadFile(hFile, &stDosHeader, sizeof(IMAGE_DOS_HEADER), &dwRet, NULL);<br />if (dwRet == sizeof(IMAGE_DOS_HEADER))<br />{<br />//有效DOS頭部為“MZ”<br />if(IMAGE_DOS_SIGNATURE == stDosHeader.e_magic)<br />{<br />//第三步,定位image_nt_headers的位置<br />dwRet = SetFilePointer(hFile, stDosHeader.e_lfanew, NULL, FILE_BEGIN);<br />if (0xFFFFFFFF == dwRet)<br />{<br />isPEFile = false;<br />goto END;<br />}<br />//最後一步,檢測是否有有效PE檔案簽名<br />ReadFile(hFile, &stNtheader, sizeof(IMAGE_NT_HEADERS32), &dwRet, NULL);<br />if (IMAGE_NT_SIGNATURE == stNtheader.Signature)<br />{<br />isPEFile =true;<br />}<br />}<br />}<br />END:<br />if (hFile)<br />{<br />CloseHandle(hFile);<br />hFile = NULL;<br />}<br />return isPEFile;<br />} 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.