PE计算机语言,[造轮子系列]手动打造一个PE分析工具

详细解释:这里的结构体代码详细描述了上述结构

MS-DOS头:

//DOS头

//typedef struct _IMAGE_DOS_HEADER {                // DOS .EXE header

//                WORD   e_magic;                     // Magic number 0x5A4D

//                WORD   e_cblp;                      // 文件末页字节数

//                WORD   e_cp;                        // 文件页数

//                WORD   e_crlc;                      // 重定位项的数目

//                WORD   e_cparhdr;                   // 区段中头部大小

//                WORD   e_minalloc;                  // 最小内存附加段需求

//                WORD   e_maxalloc;                  // 最大内存附加段需求

//                WORD   e_ss;                        // 初始SS值

//                WORD   e_sp;                        // 初始SP值

//                WORD   e_csum;                      // 校验和

//                WORD   e_ip;                        // 初始IP值(程序入口点)

//                WORD   e_cs;                        // 初始CS值

//                WORD   e_lfarlc;                    // 重定位表偏移

//                WORD   e_ovno;                      // 代码附加数

//                WORD   e_res[4];                    // Reserved words

//                WORD   e_oemid;                     // OEM identifier (for e_oeminfo)

//                WORD   e_oeminfo;                   // OEM information; e_oemid specific

//                WORD   e_res2[10];                  // Reserved words

//                LONG   e_lfanew;                    // PE头的偏移

//} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

PE头

//PE文件头(PE头)

//typedef struct _IMAGE_FILE_HEADER {

//                WORD    Machine;                                                //运行平台,一般为IMAGE_FILE_MACHINE_I386

//                WORD    NumberOfSections;                                //区段的数量

//                DWORD   TimeDateStamp;                                        //文件的创建时间

//                DWORD   PointerToSymbolTable;                        //符号表指针,一般为0

//                DWORD   NumberOfSymbols;                                //符号表中符号的数量

//                WORD    SizeOfOptionalHeader;                        //在IMAGE_FILE_HEADER结构后面的扩展头大小,一般为0x00E0

//                WORD    Characteristics;                                //文件属性,EXE文件(IMAGE_FILE_EXECUTABLE_IMAGE)为0x010F,DLL(IMAGE_FILE_DLL)为0x210

//} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

PE文件头

//PE文件头(PE头)

//typedef struct _IMAGE_FILE_HEADER {

//                WORD    Machine;                                                //运行平台,一般为IMAGE_FILE_MACHINE_I386

//                WORD    NumberOfSections;                                //区段的数量

//                DWORD   TimeDateStamp;                                        //文件的创建时间

//                DWORD   PointerToSymbolTable;                        //符号表指针,一般为0

//                DWORD   NumberOfSymbols;                                //符号表中符号的数量

//                WORD    SizeOfOptionalHeader;                        //在IMAGE_FILE_HEADER结构后面的扩展头大小,一般为0x00E0

//                WORD    Characteristics;                                //文件属性,EXE文件(IMAGE_FILE_EXECUTABLE_IMAGE)为0x010F,DLL(IMAGE_FILE_DLL)为0x210

//} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

PE可选头

//PE可选头

//typedef struct _IMAGE_OPTIONAL_HEADER {

//        //

//        // Standard fields.

//        //

//

//                WORD    Magic;                                        //文件类型标识(普通可执行映像0x010B、ROM镜像为0x0170、PE32+为0x020B)

//                BYTE    MajorLinkerVersion;                //链接器的主版本号。

//                BYTE    MinorLinkerVersion;                //链接器的子版本号。

//                DWORD   SizeOfCode;                                //所有IMAGE_SCN_CNT_CODE属性的区段总大小,此大小在计算时按照磁盘扇区字节数的整数倍计算。

//                DWORD   SizeOfInitializedData;        //已初始化的数据块大小。

//                DWORD   SizeOfUninitializedData;//未初始化的数据块大小,装载程序需要在虚拟地址空间中为这些

//数据保留空间,但是这些块在磁盘中并不占用任何空间(在程序

//运行之前没有指定的值),未初始化的数据通常都位于一个名称为.bbs的区段中。

//                DWORD   AddressOfEntryPoint;        //程序执行入口的RAV,一般指向运行时的库代码,然后再调用main

//在DLL文件中,这个入口

//点有可能在进程初始化、进程关闭、线程创建与线程关闭时被调用,

//并且鉴于DLL文件的特殊性,这个入口点在DLL文件中可以被置为0

//                DWORD   BaseOfCode;                                //代码段的起始RVA,这个值通常为0x00001000

//                DWORD   BaseOfData;                                //数据段的起始RVA,数据段通常位于PE文件头与代码段之后

//

//                //

//                // NT additional fields.

//                //

//

//                DWORD   ImageBase;                                        //文件在内存中的首选装入,地址加载器将试图在此地址装

//入这个映像文件,如果载入成功,则装载器将跳过应用基

//址重定位的步骤,如果此地址被占用,则加载器会重新在

//正确对齐的合法地址中选择一个作为实际装载地址。

//                DWORD   SectionAlignment;                        //映像文件在被装入内存时的区段对齐大小

//                DWORD   FileAlignment;                                //映像文件在磁盘上的区段对齐大小

//                WORD    MajorOperatingSystemVersion;//要求操作系统最低版本的主版本号

//                WORD    MinorOperatingSystemVersion;//要求操作系统最低版本的子版本号

//                WORD    MajorImageVersion;                        //此可执行文件的主版本号,此版本号由程序作者指定

//(它与后一个字段成对使用,可以被置为0,可以通过连接器开关 / VERSION控制)

//                WORD    MinorImageVersion;                        //此可执行文件的子版本号,此版本号由程序作者指定

//                WORD    MajorSubsystemVersion;                //要求最低子系统的主版本号(与后一个字段成对使用,一

//般情况下其值为4,可以通过连接器开关 / SUBSYSTEM控制)。

//                WORD    MinorSubsystemVersion;                //要求最低子系统的子版本号

//                DWORD   Win32VersionValue;                        //这是一个保留值,且必须为0x00000000

//                DWORD   SizeOfImage;                                //映像文件装入内存后的总大小(从Image Base

//到最后一个区段的总大小)

//                DWORD   SizeOfHeaders;                                //是MS-DOS头、PE头、区块表的尺寸之和

//                DWORD   CheckSum;                                        //映像文件的校验和(在内核模式的驱动和系统dll中必须为有效值)

//                WORD    Subsystem;                                        //可执行文件所期望的子系统值IMAGE_SUBSYSTEM_WINDOWS_GUI

//                WORD    DllCharacteristics;                        //DllMain()函数何时被调用,默认为0

//                DWORD   SizeOfStackReserve;                        //在EXE文件中,为线程保留的堆栈大小

//                DWORD   SizeOfStackCommit;                        //在EXE文件中,栈初始内存大小(默认4KB)

//                DWORD   SizeOfHeapReserve;                        //在EXE文件中,为进程默认堆保留的内存(默认1MB)

//                DWORD   SizeOfHeapCommit;                        //在EXE文件中,每次指派给堆的内存大小(默认4KB)

//                DWORD   LoaderFlags;                                //与调试有关,默认为0

//                DWORD   NumberOfRvaAndSizes;                //数据目录成员的数量,一般为0x00000010(16个)

//数据目录表

//                IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

//} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

数据目录表

//数据目录表

//typedef struct _IMAGE_DATA_DIRECTORY {

//                DWORD   VirtualAddress;                        // 数据起始块的RVA地址

//                DWORD   Size;                                        // 数据块的长度

//} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

区段表

//区段表

//typedef struct _IMAGE_SECTION_HEADER {

//                BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];                //区段名,一般情况下以.开头

//                union {

//                        DWORD   PhysicalAddress;                                //

//                        DWORD   VirtualSize;                                        //

//                } Misc;                                                                                //实际被使用的区段大小

//                DWORD   VirtualAddress;                                                //此区段载入内存后的RAV

//                DWORD   SizeOfRawData;                                                //此区段在磁盘中的体积,这个地址是按照文件页对齐

//的(恒为PE头结构中FileAlignment字段的整数倍)

//                DWORD   PointerToRawData;                                        //此区段在文件中的偏移

//                DWORD   PointerToRelocations;                                //此区段重定位表的偏移地址,它指向IMAGE_RELOCATION结构数组

//                DWORD   PointerToLinenumbers;                                //行号表在文件中的偏移

//                WORD    NumberOfRelocations;                                //此区段重定位表项的数量

//                WORD    NumberOfLinenumbers;                                //行号表项的数量

//                DWORD   Characteristics;                                        //区段属性,用以描述此区段的读写情况、状态等属性

//IMAGE_SCN_MEM_READ(可读)

//} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值