以下地址的文章可能错误很多,请您找出错误指正给分!
对文章有补充给分http://www.langwan.com/article.php?Action=ArticleList&SID=VCNET_编程理论&RowCount=2&AID=1042514303

解决方案 »

  1.   

    谢谢呀 尤其IMAGE_DOS_HEADER 因为这个结构 MSDN里没写
    只是一跳而过,实际上微软对PE文件就是一笔带过!IMAGE_DOS_HEADER这里我有些字段拿不准,谁拿的准给看看我给分
      

  2.   

    PE文件格式
    前言
    总体结构
    DOS-STUB
    IMAGE_NT_HEADER
    IMAGE_FILE_HEADER
    IMAGE_OPTIONAL_HEADER
    Section Header
        
    前言
    PE("portable executable")文件格式是windows NT, windows 95和win32使用的可执行二进制格式。在windows NT下,驱动程序也使用这种格式。它也能被用在对象文件和库文件中。
    这个格式是Microsoft设计的,并且在1993年由TIS(tool interface standard)组织(Microsoft, Intel, Borland, Watcom, IBM和其他公司)标准化。这个格式是在一些UNIX和VMS系统中对象文件和可执行文件所使用的COFF(common object file format)的基础上发展而来的。
    Win32 SDK包含头文件<winnt.h>,其中包含了一些PE格式所用到的宏定义。这些将在下面使用到。
        
    总体结构
    在PE文件的开头是一个MS-DOS可执行文件(DOS-STUB),这使得每个PE文件都是一个有效的MS-DOS可执行文件。这也就是为什么在MS-DOS方式下运行PE文件会显示“This program cannot run in DOS mode”,这都是这个MS-DOS可执行文件的功劳。
    在这个STUB后面是一个32位标记,数值为0x00004550(“PE  ”),表示这是一个PE文件。
    然后是一个COFF格式的文件头,包含的信息有支持的处理器、包含的节数、链接的时间、是可执行文件还是DLL等。
    再后面是一个COFF格式的可选的文件头(它总存在但仍是可选的),告诉我们更多装载这个文件的信息,包括起始地址、保留的堆栈大小、数据段的大小等。
    在这个文件头后面就是各个段(Section)。这些段由段表来引入。事实上段中才是真正要执行的代码,所有的头和表结构只是帮你来找到它。
    每个段都有一些标志来标识这个段包含的是什么类型的数据、是否能共享等。
        
    DOS-STUB
    DOS-STUB实际上就是一个可执行的MS-DOS程序,它只输出一个错误信息比如“This program cannot run in DOS mode”。
    DOS-STUB的头两个字节一定是“MZ”,Mark Zbikowski的缩写。Mark Zbikowski是MS-DOS的早期工程师,在当时这种大师级的人物用自己的名字来作为标记是很正常的。我们在判断一个文件是否是PE文件时,可以首先判断头两个字节是不是“MZ”,在winnt.h中IMAGE_DOS_SIGNATURE宏已经被定义为这个值了。
    而是否真的是PE文件,就要看DOS-STUB的成员变量e_lfanew(偏移量为60的32位值)指向的是不是PE Header。如果是PE Header,e_lfanew指向的32位值一定是0x00004550(“PE  ”)。在winnt.h中IMAGE_NT_SIGNATURE宏已经被定义为这个值了。
    看到这里,基本上就可以断定这是一个PE文件了。再往下就是具体的文件信息。
        
    IMAGE_NT_HEADER
    IMAGE_NT_HEADER是一个结构,第一个成员是Signature,也就是上面所说的IMAGE_NT_SIGNATURE。下面的成员是两个结构IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER。
        
    IMAGE_FILE_HEADER
    这个结构的各个成员为:
    名    称 大 小 含    义
    Machine 16位 表示这个文件运行时要求所在的CPU。0x0000h 未知的类型0x014Ch 80386 处理器0x014Dh 80486 处理器0x014Eh PentiumTM 处理器0x0160h R3000 (MIPS) 处理器0x0162h R3000 (MIPS) 处理器0x0166h R4000 (MIPS) 处理器0x0168h R10000 (MIPS) 处理器0x0184h DEC Alpha AXP 处理器0x01F0h IBM Power PC处理器
    NumberOfSections 16位 文件头之后段的数量。
    TimeDateStamp 32位 时间戳,表示文件建立的时间。格式为从1970年1月1日00:00:00起的秒数。
    PointerToSymbolTable 32位 调试用,通常为0。
    NumberOfSymbols 32位 调试用,通常为0。
    SizeOfOptionalHeader 16位 IMAGE_OPTIONAL_HEADER的大小。
    Characteristics 16位 文件特征的标记。一般可执行文件为0x010Eh,DLL为0x210Eh。
        
    IMAGE_OPTIONAL_HEADER
    这个结构的各个成员为:
    名    称 大 小 含    义
    Magic 16位 总是0x010Bh,表示32位的PE文件。
    MajorLinkerVersion 8位 链接器版本号高位。
    MinorLinkerVersion 8位 链接器版本号低位。
    SizeOfCode 32位 代码段的大小,必须为FileAlignment的整数倍。
    SizeOfInitializedData 32位 初始化的数据段的大小。
    SizeOfUninitializedData 32位 未初始化的数据段的大小。
    AddressOfEntryPoint 32位 程序进入点,这是相对地址,要加上ImageBase才是内存地址。
    BaseOfCode 32位 代码段的地址,是相对地址,要加上ImageBase才是内存地址。
    BaseOfData 32位 数据段的地址,是相对地址,要加上ImageBase才是内存地址。
    ImageBase 32位 文件被装载的地址。如果这个地址被占用,文件将被定位到其他地址,相应地需要做一些重定位地修补工作。
    SectionAlignment 32位 内存中段的对齐粒度,必须是内存页面大小(4096)的整数倍和FileAlignment的整数倍。
    FileAlignment 32位 磁盘文件中段的对齐粒度,必须是磁盘扇区大小(512)的整数倍,可以为512、1024、2048、4096、8192。
    MajorOperatingSystemVersion 16位 期望的操作系统版本号高位,装载器通常不使用。
    MinorOperatingSystemVersion 16位 期望的操作系统版本号低位,装载器通常不使用。
    MajorImageVersion 16位 文件版本号高位,通常不使用。
    MinorImageVersion 16位 文件版本号低位,通常不使用。
    MajorSubsystemVersion 16位 期望的子系统版本号高位,Win32程序应该为0x0004h。
    MinorSubsystemVersion 16位 期望的子系统版本号高位,Win32程序应该为0x0000h。
    Win32VersionValue 32位 通常为0。
    SizeOfImage 32位 文件被加载到内存中的大小。
    SizeOfHeaders 32位 所有头的大小,同时也是第一个段的偏移量。
    CheckSum 32位 在NT Driver中使用,这里为0。
    Subsystem 16位 在哪个子系统下运行。0x0000h 未知0x0001h Driver使用0x0002h Windows GUI0x0003h Windows 控制台0x0005h OS/2 控制台0x0007h POSIX 控制台
    DllCharacteristics 16位 废弃,置0。
    SizeOfStackReserve 32位 堆栈的保留空间。
    SizeOfStackCommit 32位 堆栈的初始大小,同时也是增大的提交量。
    SizeOfHeapReserve 32位 堆的保留空间。
    SizeOfHeapCommit 32位 堆的初始大小,同时也是增大的提交量。
    LoaderFlags 32位 废弃,置0。
    NumberOfRvaAndSizes 32位 IMAGE_DATA_DIRECTORY数组的大小,通常为16。
    DataDirectory[16] 128Byte 定义了特定信息块的虚地址和大小。(0) IMAGE_DIRECTORY_ENTRY_EXPORT 输出符号,通常在DLL中使用。(1) IMAGE_DIRECTORY_ENTRY_IMPORT输入符号。(2) IMAGE_DIRECTORY_ENTRY_RESOURCE    资源。(3) IMAGE_DIRECTORY_ENTRY_EXCEPTION    异常。结构和目的不明。(4) IMAGE_DIRECTORY_ENTRY_SECURITY    安全。(5) IMAGE_DIRECTORY_ENTRY_BASERELOC    重定位表。(6) IMAGE_DIRECTORY_ENTRY_DEBUG     调试信息。内容和编译器有关。(7) IMAGE_DIRECTORY_ENTRY_COPYRIGHT    描述字符串。    (8) IMAGE_DIRECTORY_ENTRY_GLOBALPTR    机器值。结构和目的不明。(9) IMAGE_DIRECTORY_ENTRY_TLS    线程本地存储。结构不明。(10)IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    装载设置。结构和目的不明。(11)IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT     Bound import。(12)IMAGE_DIRECTORY_ENTRY_IAT Import Address。(13)Delay Import Descriptor。(14)CLR Header。(15)保留。
      

  3.   

    =============
    PE文件格式
    前言
    总体结构
    DOS-STUB
    IMAGE_NT_HEADER
    IMAGE_FILE_HEADER
    IMAGE_OPTIONAL_HEADER
    Section Header
    ==============
    DOS-STUB前面那个结构呢!其它结构我都写了
    前面那个结构!
    IMAGE_DOS_HEADER
    WORD   e_cblp; 
    WORD   e_cp;
    这两个谁知道!!应该是/512,谁除512,SizeOfImage吗?   
    这个结构虽然在整个PE分析中没有什么重要作用
    可作为一篇完整的PE资料我必须弄清楚!
    这也是弥补别人那些文件不知不探的后果!
    几乎所有关于pe的资料都是一笔带过,原因嘻嘻!MSDN里查不到!
    qukai(天才贝利) 贴了一堆!一分不给!嘻嘻··没参考价值!
    ==============
    贴关键的不要重复已经有的!嘻嘻!
      

  4.   

    给个对的你自己看吧,icelion的经典教程。
    搞堆那么长的垃圾给大家看,谁受得了