C++打印PE文件头信息Demo

PE文件格式被组织为一个线性的数据流,它由一个MS-DOS头部开始,接着是一个是模式的程序残余以及一个PE文件标志,这之后紧接着PE文件头和可选头部。这些之后是所有的段头部,段头部之后跟随着所有的段实体。文件的结束处是一些其它的区域,其中是一些混杂的信息,包括重分配信息、符号表信息、行号信息以及字串表数据。

 

PE文件主要信息按顺序

 

IMAGE_DOS_HEADER MS-DOS MZ头部

DOS STUB MS-DOS 实模式残余程序

NTSIGNATURE PE文件标识

IMAGE_FILE_HEADER PE文件头

IMAGE_OPTIONAL_HEADER PE可选头

IMAGE_SECTION_HEADER 多个段

包括.text .bss .rdata等

 

更详细的信息请参考:http://www.vckbase.com/document/viewdoc/?id=1334

 

下面给出将头文件打印出来的源码:

PE.h

#ifndef _X_PE_H_ #define _X_PE_H_ //获取PE头基地址 #define SIZE_OF_NT_SIGNATURE sizeof(DWORD) #define NTSIGNATURE(a) ((LPVOID)((BYTE *)a + ((PIMAGE_DOS_HEADER)a)->e_lfanew - 1)) #define PEFHDROFFSET(a) ((LPVOID)((BYTE *)a + ((PIMAGE_DOS_HEADER)a)->e_lfanew - 1 + SIZE_OF_NT_SIGNATURE)) #define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + ((PIMAGE_DOS_HEADER)a)->e_lfanew - 1 + SIZE_OF_NT_SIGNATURE + sizeof(IMAGE_FILE_HEADER))) DWORD WINAPI ImageFileType (LPVOID lpFile); #endif 

PE.cpp

#include #include #include #include "pe.h" using namespace std; //PE文件类型判断 DWORD WINAPI ImageFileType (LPVOID lpFile) { /* 首先出现的是DOS文件标志 */ if (*(USHORT *)lpFile == IMAGE_DOS_SIGNATURE) { /* 由DOS头部决定PE文件头部的位置 */ if (LOWORD (*(DWORD *)NTSIGNATURE (lpFile)) == IMAGE_OS2_SIGNATURE || LOWORD (*(DWORD *)NTSIGNATURE (lpFile)) == IMAGE_OS2_SIGNATURE_LE) return (DWORD)LOWORD(*(DWORD *)NTSIGNATURE (lpFile)); else if (*(DWORD *)NTSIGNATURE (lpFile) == IMAGE_NT_SIGNATURE) return IMAGE_NT_SIGNATURE; else return IMAGE_DOS_SIGNATURE; } else /* 不明文件种类 */ return 0; } int main() { //业务信息参考 //http://www.vckbase.com/document/viewdoc/?id=1334 CHAR szBuf[2048]; FILE* pFile=fopen("E://task//Win32//Debug//win32.exe","r");//这里加载一个PE文件 int iRead=fread(szBuf,1,2048,pFile); //MZ-DOS头 IMAGE_DOS_HEADER* dos; dos=(IMAGE_DOS_HEADER*)szBuf; cout.setf(ios::hex,ios::basefield);//设置十六进制显示数值 cout.setf(ios::showbase|ios::uppercase);//设置0x头和大写 cout<<"dos->e_magic="<e_magic<e_lfanew="<e_lfanew<ImageBase<DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress<DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size<DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress<DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size<DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress<DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].Size<DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].VirtualAddress<DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].Size<DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress<DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size<NumberOfSections;i++) { cout<

你可能感兴趣的:(C/C++,c++,image,header,dos,winapi,microsoft)