// 读取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; }