天天看點

讀取PE檔案頭的簡單實作

// 讀取PE檔案頭.cpp : 定義控制台應用程式的入口點。
//

#include "stdafx.h"

#include
  
   
#include
   
#include
    
     
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE hFile=CreateFile(L"D:\\project\\Proc_Url\\Debug\\Proc_Url.exe",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(INVALID_HANDLE_VALUE==hFile)
	{
		cout<<"sorry the file open failed\n";
		return 0;
	}
	//讀取DOS檔案頭
	_IMAGE_DOS_HEADER dosHeader={0};
	//首先移動到檔案頭
	DWORD num;
	::SetFilePointer(hFile,0,NULL,FILE_BEGIN);
	if(ReadFile(hFile,&dosHeader,sizeof(IMAGE_DOS_HEADER),&num,NULL))
	{		
		cout<<"IMAGE_NT_HEADER的偏移位置是"<<dosHeader.e_lfanew<<endl;
	}
	else
	{
		cout<<"讀取dos頭部失敗\n";
		return 0;
	}
	_IMAGE_NT_HEADERS peHeader={0};

	if(ReadFile(hFile,&peHeader,sizeof(_IMAGE_NT_HEADERS),&num,NULL))
	{
		if(peHeader.Signature==0x00004500)
		{
			cout<<"經檢測是有效地PE檔案\n";
		}
		time_t tim=peHeader.FileHeader.TimeDateStamp;
		tm* dat=localtime(&tim);
		
		cout<<"PE檔案的運作平台是:"<<hex<<peHeader.FileHeader.Machine<<endl;
		cout<<"PE檔案的區塊數目是:"<<hex<<peHeader.FileHeader.NumberOfSections<<endl;
		cout<<"PE檔案的建立時間是"<<dec<
     
      tm_year+1970<<"年"<<dec<
      
       tm_mon+1<<"月"<<dec<
       
        tm_mday+1<<"日"<<endl; cout<<"PE檔案的調試檔案位置"<<hex<<peHeader.FileHeader.PointerToSymbolTable<<endl; cout<<"PE檔案的OPTIOANALHEADER大小"<<hex<<peHeader.FileHeader.SizeOfOptionalHeader<<endl; cout<<"PE檔案屬性"<<hex<<peHeader.FileHeader.Characteristics<<endl; cout<<"PE檔案的符号個數,也就是符号表指向的個數"<<hex<<peHeader.FileHeader.NumberOfSymbols<<endl; } else { cout<<"讀取pe檔案頭失敗\n"; return 0; } //輸出OPTIONAL HEADER字段 cout<<"程式入口點:"<<peHeader.OptionalHeader.AddressOfEntryPoint<<endl; cout<<"代碼部分RVA:"<<peHeader.OptionalHeader.BaseOfCode<<endl; cout<<"資料部分RVA:"<<peHeader.OptionalHeader.BaseOfData<<endl; cout<<"校驗和:"<<peHeader.OptionalHeader.CheckSum<<endl; cout<<"資料目錄:"<<peHeader.OptionalHeader.DataDirectory<<"\n"; cout<<"dll屬性:"<<peHeader.OptionalHeader.DllCharacteristics<<endl; cout<<"檔案對齊:"<<peHeader.OptionalHeader.FileAlignment<<"\n"; cout<<"檔案基址:"<<peHeader.OptionalHeader.ImageBase<<"\n"; cout<<"鏡像大小:"<<peHeader.OptionalHeader.SizeOfImage<<endl; ::CloseHandle(hFile); return 0; }