今天看了下关于windows平台的PE结构,然后通过C++写了一个简单的加载PE信息的程序,只加载了DOS头、NT头、以及节点的信息,以后补上关于加载输出表、输入表的相关代码,详细代码如下:
InBlock.gif#include <iostream>
InBlock.gif#include < string>
InBlock.gif#include <Windows.h>
InBlock.gif
InBlock.gif using namespace std;
InBlock.gif
InBlock.gif //Dos Header
InBlock.gif
InBlock.giftypedef struct _BEGIN09_IMAGE_DOS_HEADER { // DOS .EXE header
InBlock.gif
InBlock.gif        WORD e_magic; // Magic number
InBlock.gif
InBlock.gif        WORD e_cblp; // Bytes on last page of file
InBlock.gif
InBlock.gif        WORD e_cp; // Pages in file
InBlock.gif
InBlock.gif        WORD e_crlc; // Relocations
InBlock.gif
InBlock.gif        WORD e_cparhdr; // Size of header in paragraphs
InBlock.gif
InBlock.gif        WORD e_minalloc; // Minimum extra paragraphs needed
InBlock.gif
InBlock.gif        WORD e_maxalloc; // Maximum extra paragraphs needed
InBlock.gif
InBlock.gif        WORD e_ss; // Initial (relative) SS value
InBlock.gif
InBlock.gif        WORD e_sp; // Initial SP value
InBlock.gif
InBlock.gif        WORD e_csum; // Checksum
InBlock.gif
InBlock.gif        WORD e_ip; // Initial IP value
InBlock.gif
InBlock.gif        WORD e_cs; // Initial (relative) CS value
InBlock.gif
InBlock.gif        WORD e_lfarlc; // File address of relocation table
InBlock.gif
InBlock.gif        WORD e_ovno; // Overlay number
InBlock.gif
InBlock.gif        WORD e_res[4]; // Reserved words
InBlock.gif
InBlock.gif        WORD e_oemid; // OEM identifier (for e_oeminfo)
InBlock.gif
InBlock.gif        WORD e_oeminfo; // OEM information; e_oemid specific
InBlock.gif
InBlock.gif        WORD e_res2[10]; // Reserved words
InBlock.gif
InBlock.gif        LONG e_lfanew; // File address of new exe header
InBlock.gif
InBlock.gif} BEGIN09_IMAGE_DOS_HEADER, *PBEGIN09_IMAGE_DOS_HEADER;
InBlock.gif
InBlock.gif //NT_Header
InBlock.gif
InBlock.giftypedef struct _BEGIN09_IMAGE_NT_HEADERS {
InBlock.gif        DWORD Signature;
InBlock.gif        IMAGE_FILE_HEADER FileHeader;
InBlock.gif        IMAGE_OPTIONAL_HEADER32 OptionalHeader;
InBlock.gif} BEGIN09_IMAGE_NT_HEADERS32, *PBEGIN09_IMAGE_NT_HEADERS32;
InBlock.gif
InBlock.gif //File Header
InBlock.gif
InBlock.giftypedef struct _BEGIN09_IMAGE_FILE_HEADER {
InBlock.gif        WORD Machine;
InBlock.gif        WORD NumberOfSections;
InBlock.gif        DWORD TimeDateStamp;
InBlock.gif        DWORD PointerToSymbolTable;
InBlock.gif        DWORD NumberOfSymbols;
InBlock.gif        WORD SizeOfOptionalHeader;
InBlock.gif        WORD Characteristics;
InBlock.gif} BEGIN09_IMAGE_FILE_HEADER, *PBEGIN09_IMAGE_FILE_HEADER;
InBlock.gif
InBlock.gif //Option Header
InBlock.gif
InBlock.giftypedef struct _BEGIN09_IMAGE_OPTIONAL_HEADER {
InBlock.gif         //
InBlock.gif
InBlock.gif         // Standard fields.
InBlock.gif
InBlock.gif         //
InBlock.gif
InBlock.gif
InBlock.gif        WORD Magic;
InBlock.gif        BYTE MajorLinkerVersion;
InBlock.gif        BYTE MinorLinkerVersion;
InBlock.gif        DWORD SizeOfCode;
InBlock.gif        DWORD SizeOfInitializedData;
InBlock.gif        DWORD SizeOfUninitializedData;
InBlock.gif        DWORD AddressOfEntryPoint;
InBlock.gif        DWORD BaseOfCode;
InBlock.gif        DWORD BaseOfData;
InBlock.gif
InBlock.gif         //
InBlock.gif
InBlock.gif         // NT additional fields.
InBlock.gif
InBlock.gif         //
InBlock.gif
InBlock.gif
InBlock.gif        DWORD ImageBase;
InBlock.gif        DWORD SectionAlignment;
InBlock.gif        DWORD FileAlignment;
InBlock.gif        WORD MajorOperatingSystemVersion;
InBlock.gif        WORD MinorOperatingSystemVersion;
InBlock.gif        WORD MajorImageVersion;
InBlock.gif        WORD MinorImageVersion;
InBlock.gif        WORD MajorSubsystemVersion;
InBlock.gif        WORD MinorSubsystemVersion;
InBlock.gif        DWORD Win32VersionValue;
InBlock.gif        DWORD SizeOfImage;
InBlock.gif        DWORD SizeOfHeaders;
InBlock.gif        DWORD CheckSum;
InBlock.gif        WORD Subsystem;
InBlock.gif        WORD DllCharacteristics;
InBlock.gif        DWORD SizeOfStackReserve;
InBlock.gif        DWORD SizeOfStackCommit;
InBlock.gif        DWORD SizeOfHeapReserve;
InBlock.gif        DWORD SizeOfHeapCommit;
InBlock.gif        DWORD LoaderFlags;
InBlock.gif        DWORD NumberOfRvaAndSizes;
InBlock.gif        IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
InBlock.gif} BEGIN09_IMAGE_OPTIONAL_HEADER32, *PBEGIN09_IMAGE_OPTIONAL_HEADER32;
InBlock.gif
InBlock.gif //Data Dir
InBlock.gif
InBlock.giftypedef struct _BEGIN09_IMAGE_DATA_DIRECTORY {
InBlock.gif        DWORD VirtualAddress;
InBlock.gif        DWORD Size;
InBlock.gif} BEGIN09_IMAGE_DATA_DIRECTORY, *PBEGIN09_IMAGE_DATA_DIRECTORY;
InBlock.gif
InBlock.gif //Sec Header
InBlock.gif
InBlock.giftypedef struct _BEGIN09_IMAGE_SECTION_HEADER {
InBlock.gif        BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
InBlock.gif        union {
InBlock.gif                DWORD PhysicalAddress;
InBlock.gif                DWORD VirtualSize;
InBlock.gif        } Misc;
InBlock.gif        DWORD VirtualAddress;
InBlock.gif        DWORD SizeOfRawData;
InBlock.gif        DWORD PointerToRawData;
InBlock.gif        DWORD PointerToRelocations;
InBlock.gif        DWORD PointerToLinenumbers;
InBlock.gif        WORD NumberOfRelocations;
InBlock.gif        WORD NumberOfLinenumbers;
InBlock.gif        DWORD Characteristics;
InBlock.gif} BEGIN09_IMAGE_SECTION_HEADER, *PBEGIN09_IMAGE_SECTION_HEADER;
InBlock.gif
InBlock.gif int main()
InBlock.gif{
InBlock.gif        
InBlock.gif        BEGIN09_IMAGE_DOS_HEADER                        *pDos_Header = NULL;
InBlock.gif        BEGIN09_IMAGE_NT_HEADERS32                        *pNt_Header = NULL;
InBlock.gif        BEGIN09_IMAGE_SECTION_HEADER                *pSection_Header = NULL;
InBlock.gif         int                                                                        nFileSize = 0x400;
InBlock.gif         int                                                                        nRetCode = 0;
InBlock.gif        BYTE                                                         *pByteBuffer = NULL;
InBlock.gif        size_t nReadBytes = 0;
InBlock.gif        
InBlock.gif        
InBlock.gif        FILE *pFileOpen = fopen( "C:\\Documents and Settings\\Administrator\\桌面\\PE\\PE\\ASM.exe" , "r+b" );
InBlock.gif         if ( NULL == pFileOpen )
InBlock.gif        {
InBlock.gif                 goto Exit0;
InBlock.gif        }
InBlock.gif        
InBlock.gif         pByteBuffer = new BYTE[ nFileSize + 1 ];
InBlock.gif         if ( NULL == pByteBuffer )
InBlock.gif         {
InBlock.gif                 goto Exit0;
InBlock.gif         }
InBlock.gif
InBlock.gif         memset( pByteBuffer, 0, nFileSize + 1);
InBlock.gif                    
InBlock.gif         nReadBytes = fread( pByteBuffer, sizeof(BYTE), nFileSize, pFileOpen);
InBlock.gif         if ( nReadBytes == 0 )
InBlock.gif         {
InBlock.gif                 goto Exit0;
InBlock.gif        }
InBlock.gif    
InBlock.gif         pDos_Header = (BEGIN09_IMAGE_DOS_HEADER*) (pByteBuffer);
InBlock.gif         if ( NULL == pDos_Header )
InBlock.gif         {
InBlock.gif                 goto Exit0;
InBlock.gif         }
InBlock.gif    
InBlock.gif         pNt_Header = ( BEGIN09_IMAGE_NT_HEADERS32* ) ( pByteBuffer + pDos_Header->e_lfanew );
InBlock.gif         if ( NULL == pNt_Header )
InBlock.gif         {
InBlock.gif                 goto Exit0;
InBlock.gif         }
InBlock.gif            
InBlock.gif         pSection_Header = ( BEGIN09_IMAGE_SECTION_HEADER* ) ( pByteBuffer + pDos_Header->e_lfanew + sizeof(DWORD) + sizeof(BEGIN09_IMAGE_FILE_HEADER) + pNt_Header->FileHeader.SizeOfOptionalHeader );
InBlock.gif         if ( NULL == pSection_Header)
InBlock.gif         {
InBlock.gif                 goto Exit0;
InBlock.gif         }
InBlock.gif
InBlock.gif         nRetCode = 1;
InBlock.gif        
InBlock.gif        cout<< "此程序的运行平台为:"<<endl;
InBlock.gif         if ( 0x014C == pNt_Header->FileHeader.Machine )
InBlock.gif         {
InBlock.gif                 cout<< "运行平台为 Intel 386"<<endl;
InBlock.gif         }
InBlock.gif         else
InBlock.gif         {
InBlock.gif                 cout<< "未知的运行平台"<<endl;
InBlock.gif         }
InBlock.gif    
InBlock.gif         cout<< "此文件程序入口为:"<<endl;
InBlock.gif         cout<<pNt_Header->OptionalHeader.AddressOfEntryPoint;
InBlock.gif         cout<< "此程序一共有多少个节:"<<endl;
InBlock.gif         cout<<pNt_Header->FileHeader.NumberOfSections<<endl;
InBlock.gif         cout<< "此程序的基地址为:"<<endl;
InBlock.gif         cout<<pNt_Header->OptionalHeader.ImageBase<<endl;
InBlock.gif
InBlock.gifExit0:
InBlock.gif         return nRetCode;
InBlock.gif}
 
此程序用了静态的文件路径以及文件记载信息的大小申请空间都是用的固定的数值,比较山寨,呵呵以后写一个详细的加载PE信息的程序.