加载exe的PE信息并输出相关PE信息的一段c++代码

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



本文转自wiliiwin 51CTO博客,原文链接:http://blog.51cto.com/wiliiwin/236425
上一篇:.net 链接oracle


下一篇:ubuntu下Mysql的HA(corosync+pacemaker+drbd)