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头和大写
coute_magic="e_magice_lfanew="e_lfanewMachineNumberOfSectionsTimeDateStampPointerToSymbolTableSizeOfOptionalHeaderCharacteristicsMagicMajorLinkerVersionMinorLinkerVersionSizeOfCodeSizeOfInitializedDataSizeOfUninitializedDataAddressOfEntryPointBaseOfCodeBaseOfDataImageBaseSectionAlignmentFileAlignmentMajorOperatingSystemVersionMinorOperatingSystemVersionMajorImageVersionMinorImageVersionMajorSubsystemVersionMinorSubsystemVersionSizeOfImageSizeOfHeadersCheckSumSubsystemDllCharacteristicsSizeOfStackReserveSizeOfStackCommitSizeOfHeapReserveSizeOfHeapCommitLoaderFlagsNumberOfRvaAndSizesDataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddressDataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].SizeDataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddressDataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].SizeDataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddressDataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].SizeDataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].VirtualAddressDataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].SizeDataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddressDataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].SizeNumberOfSections;i++)
{
cout
分类:
C/C++
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com