最近在一直努力学习破解,但是发现我的基础太差了,就想学习一下PE结构。可是PE结构里的结构关系太复杂,看这老罗的WiN32汇编最后一章

翻两页又合上了。。把自己的信心都搞没了。感觉自己的理解能力不行,实践一下也许会好一点,可是怎么实践,进看雪搜一下发现了不

少帖子的手写PE 太牛了 。。,心想咱们手写不行 看总没问题吧。于是找了个MASM编写的5K小软(麻雀虽小五脏具全),丢

进PEID里看看有啥,这些资料怎么来的当然是PE格式告诉它的,我们要学会用WinHex得到这些数据。

学PE格式要什么基础呢?
1.对16进制有些了解
2.对于BTYE , WORD ,DWORD单位深入了解
3.对于Win32的结构组成熟悉
4.没有兴趣的就别浪费时间了。。
个人看法勿骂(看雪氛气还不错。)
这里用的的工具是著名的 16进制工具 WINHEX(不认识的朋友了解一下在看吧)
我们不能一口吃下一个胖子,所以这篇文章里我只讲了PE格式里的头部分,不包含节表和节。
首先看这篇文章的核心WinHex 的内容

图片有些模糊放大看或下载看效果比较好

这里使用标号X.X.X 助于理解其关系

1.水蓝色的线条包围起来的结构   IMAGE_DOS_HEADER
IMAGE_DOS_HEADER STRUCT

e_magic             WORD      ?      ;DOS可执行文件标记,为“MZ”

e_cblp              WORD      ?

e_cp                WORD      ?

e_crlc              WORD      ?

e_cparhdr           WORD      ?

e_minalloc          WORD      ?

e_maxalloc          WORD      ?

e_ss                WORD      ?      ;DOS代码的初始化堆栈段

e_sp                WORD      ?      ;DOS代码的初始化堆栈指针

e_csum              WORD      ?

e_ip                WORD      ?      ;DOS代码的入口IP

e_cs                WORD      ?      ;DOS代码的入口CS

e_lfarlc            WORD      ?

e_ovno              WORD      ?

e_res               WORD   4 dup(?)

e_oemid             WORD      ?

e_oeminfo           WORD      ?

e_res2              WORD  10 dup(?)

e_lfanew            DWORD      ? ;指向PE文件头  (重点)

IMAGE_DOS_HEADER ENDS
这个结构是DOS文件头用以兼容DOS 一般不理会 不过要注意的是结构的头和尾
头 固定是"MZ"  0x4D5A
尾 指向PE文件头 DWORD类型 这里是C0 00 00 00(箭头指向)
中间部分是DOS文件块 “This program cannot be run in DOS mode.”退出
不管 呵呵 貌似牛人手写PE也都是0填充
2.黑色的线包围起来未结束结构 IMAGE_NT_HEADERS 
这个结构比较复杂
IMAGE_NT_HEADERS STRUCT

Signature          DWORD                       ?       ;PE文件标识

FileHeader         IMAGE_FILE_HEADER        <>

OptionalHeader    IMAGE_OPTIONAL_HEADER32 <>

IMAGE_NT_HEADERS ENDS

2.1 Signature          固定是"PE" 即  50 45 00 00
2.2 FileHeader         IMAGE_FILE_HEADER (镶嵌的一个结构)
IMAGE_FILE_HEADER STRUCT

Machine                  WORD    ?    ;0004h - 运行平台

NumberOfSections      WORD    ?    ;0006h - 文件的节数目

TimeDateStamp           DWORD   ?   ;0008h - 文件创建日期和时间

PointerToSymbolTable  DWORD   ?   ;000ch - 指向符号表(用于调试)

NumberOfSymbols       DWORD   ?   ;0010h - 符号表中的符号数量(用于调试)

SizeOfOptionalHeader  WORD    ?      ;0014h - IMAGE_OPTIONAL_HEADER32结构的长度

Characteristics       WORD    ?    ;0016h - 文件属性

IMAGE_FILE_HEADER ENDS

这里的字段我都用紫色包围起来7个部分
2.2.1 4C 01  Inter 平台
2.2.2  04 00 4个节区 和PEID节查看器比对一下确实是4个。
2.2.3  74 20 AB 38  好大的书啊  得到文件的创建时间日期 算法很简单加上固定的数
2.2.4 调试使用
2.2.5 同上
2.2.6   IMAGE_OPTIONAL_HEADER32结构长度及 2.3 的长度
2.2.7  文件属性  可执行文件一般是 0F 01

2.3  IMAGE_OPTIONAL_HEADER32结构 
         2.2.6就是定义它的长度
IMAGE_OPTIONAL_HEADER32 STRUCT

Magic                                 WORD  ? ;0018h 107h=ROM Image,10Bh=exe Image

MajorLinkerVersion              BYTE  ? ;001ah 链接器版本号

MinorLinkerVersion              BYTE  ? ;001bh

SizeOfCode                           DWORD ? ;001ch 所有含代码的节的总大小

SizeOfInitializedData           DWORD? ;0020h所有含已初始化数据的节的总大小

SizeOfUninitializedData       DWORD ? ;0024h 所有含未初始化数据的节的大小

AddressOfEntryPoint             DWORD ? ;0028h 程序执行入口RVA

BaseOfCode                           DWORD ? ;002ch 代码的节的起始RVA

BaseOfData                           DWORD ? ;0030h 数据的节的起始RVA

ImageBase                            DWORD ? ;0034h 程序的建议装载地址

SectionAlignment                DWORD ? ;0038h 内存中的节的对齐粒度

FileAlignment                    DWORD ? ;003ch 文件中的节的对齐粒度

MajorOperatingSystemVersion   WORD  ? ;0040h 操作系统主版本号

MinorOperatingSystemVersion   WORD  ? ;0042h 操作系统副版本号

MajorImageVersion               WORD  ? ;0044h可运行于操作系统的最小版本号

MinorImageVersion               WORD  ? ;0046h

MajorSubsystemVersion           WORD ?;0048h 可运行于操作系统的最小子版本号

MinorSubsystemVersion           WORD  ? ;004ah

Win32VersionValue               DWORD ? ;004ch 未用

SizeOfImage                      DWORD ? ;0050h 内存中整个PE映像尺寸

SizeOfHeaders                    DWORD ? ;0054h 所有头+节表的大小

CheckSum                              DWORD ? ;0058h

Subsystem                            WORD  ? ;005ch 文件的子系统

DllCharacteristics              WORD  ? ;005eh

SizeOfStackReserve             DWORD ? ;0060h 初始化时的堆栈大小

SizeOfStackCommit              DWORD ? ;0064h 初始化时实际提交的堆栈大小

SizeOfHeapReserve              DWORD ? ;0068h 初始化时保留的堆大小

SizeOfHeapCommit                DWORD ? ;006ch 初始化时实际提交的堆大小

LoaderFlags                      DWORD ? ;0070h 未用

NumberOfRvaAndSizes             DWORD ? ;0074h 下面的数据目录结构的数量

DataDirectory                    IMAGE_DATA_DIRECTORY 16 dup(<>) ;0078h

IMAGE_OPTIONAL_HEADER32 ENDSs

这个结构有点夸张有31个字段 PEID的的主窗体里显示信息大部分来自这里
这里用紫色分格成31个部分 最后一个部分没有全部显示出来
2.3.1 EXE程序固定 0B 01

2.3.2-3 连接器版本 PEID里显示 5.12  这里显示 05 0C 没 就是这来的
这里是  是BTYE 类型的 8位2个 
2.3.4 
2.3.

2.3.7 程序执行入口  00 10 00 00  和PEID 入口点 00010000 相同不理解的朋友(注意高低位问题)

2.3.8  代码起始虚拟地址VA(比较复杂-需要高手点评)  可执行代码的开始位置(重点)
2.3.9  数据起始虚拟地址VA(比较复杂)  数据的开始位置(重点)
2.3.10 程序的建议装载地址 一般是00 40 00 00
2.3.11 根据Window内存分页特点 所以一般是 00 10 00 00
2.3.12 文件中节对齐的粒度 即使节的值远远小于这个值节的大小也会按照这个处理
 既节大小必是这个值的整数倍 这里是 00 02 00 00
2.3.13 操作系统主版本号  04 00  (不用理会)
2.3.14 操作系统副版本号 00 00  (同上)
2.3.15 可运行于操作系统的最小版本号  00 00
2.3.16     00 00
2.3.17 子系统主版本号  04 Window系统PE格式的都是这个值4.0
2.3.18  子系统副版本号 值4.0  既副为 00
2.3.19  未使用   00 00 00 00
2.3.20 调入后占用内存大小 这里可以通过计算得到  4个节+PE头 对齐后得到的 00 50 00 00 
2.3.21 所有头+节表的大小 和对齐粒度 200 对齐是 00 04 00 00  PEID中显示的文件偏移就是这个值
2.3.22 它仅用在驱动程序中
2.3.23  文件的子系统 
  IMAGE_SUBSYSTEM_NATIVE (1) 不需要子系统。用在驱动程序中。
        IMAGE_SUBSYSTEM_WINDOWS_GUI(2) WIN32 graphical程序
        IMAGE_SUBSYSTEM_WINDOWS_CUI(3) WIN32 console程序(它可以一开始自动建立)。
        IMAGE_SUBSYSTEM_OS2_CUI(5) OS/2 console程序(因为程序是OS/2格式,所以它很少用在PE)。
        IMAGE_SUBSYSTEM_POSIX_CUI(7) POSIX console程序。
  一般程序这里的值都是 02 00
  PEID 里显示的子系统  Win32 GUI  就是这里来的,把这儿改成3 就PEID就显示Win32 console
  运行看看 后面出来个命令行窗口 有趣 呵呵
2.3.24 未使用  零填充
2.3.25  保留堆栈大小 00 00 10 00
2.3.26  启动后实际申请的堆栈数 00 10 00 00
2.3.27  保留堆栈大小 00 00 10 00
2.3.28  实际堆大小  00 10 00 00 (?)
2.3.29  装载标志(不用理会0填充)
2.3.30  表示 2.3. 31的数组大小  默认16 既 10 00 00 00
2.3.31

16个_IMAGE_DATA_DIRECTORY 数组
  typedef struct _IMAGE_DATA_DIRECTORY {
      DWORD   VirtualAddress;
      DWORD   Size;
  } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
2.3.31.1.1 目录地址
2.3.31.1.2 目录大小
  .
  .
  .
2.3.31.16 共16个目录 意义如下

分别是(图片上显示的不完整)
      IMAGE_DIRECTORY_ENTRY_EXPORT (0)导出目录用于DLL    
      IMAGE_DIRECTORY_ENTRY_IMPORT (1)导入目录    
      IMAGE_DIRECTORY_ENTRY_RESOURCE (2)资源目录    
      IMAGE_DIRECTORY_ENTRY_EXCEPTION (3)异常目录    
      IMAGE_DIRECTORY_ENTRY_SECURITY (4)安全目录    
      IMAGE_DIRECTORY_ENTRY_BASERELOC (5)重定位表    
      IMAGE_DIRECTORY_ENTRY_DEBUG (6)调试目录
      IMAGE_DIRECTORY_ENTRY_COPYRIGHT (7)描述版权串    
      IMAGE_DIRECTORY_ENTRY_GLOBALPTR (8)机器值    
      IMAGE_DIRECTORY_ENTRY_TLS (9)Thread local storage目录
      IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG (10)Load configuration 目录    
      IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (11)Bound import directory目录    
      IMAGE_DIRECTORY_ENTRY_IAT (12)Import Address Table输入地址表目录
      IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors
      IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor、
  ??           15  //未使用

这次就写到这里吧。
感觉学起来也不会很难,一直是自己吓自己。
接下来是各段(节)的头部等我自己理解透彻了再给大家写一篇吧。

参考
1.老罗Win32汇编最后一章 
2. http://bbs.pediy.com/showthread.php?t=48590

WinHex分析PE格式(1)的更多相关文章

  1. WinHex分析PE格式(2)&& 如何手动添加区段并运行区段

    由于这次文章内容比较多 所以写成DOC文档 为了复习所学的知识,我在原本的软件里试者手动加入区段 ,并写给大家分享,还试试者用LordPE加区段发现竟然失败了, 还是自己动手比较实在,完美运行. 利用 ...

  2. PE格式第六讲,导出表

    PE格式第六讲,导出表 请注意,下方字数比较多,其实结构挺简单,但是你如果把博客内容弄明白了,对你受益匪浅,千万不要看到字数多就懵了,其实字数多代表它重要.特别是第五步, 各种表中之间的关系. 作者: ...

  3. PE格式第七讲,重定位表

    PE格式第七讲,重定位表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首先, ...

  4. 分析PE

    PE文件是Windows平台下可执行文件标准格式,浓缩了微软工程师的设计精华,历经40年依旧保持着原有的设计.分析PE文件对于研究Windows操作系统有着重要的实践意义,对于逆向分析有着重要的指导作 ...

  5. 基础篇-初步认识PE格式

    1 PE(Portable Executable)格式,是Win32环境可移植可执行文件(如exe.dll.vxd.sys和vdm等)的标准文件格式.PE格式衍生于早期建立在VAX(R)VMS(R)上 ...

  6. PE格式第四讲,数据目录表之导入表,以及IAT表

    PE格式第四讲,数据目录表之导入表,以及IAT表 一丶IAT(地址表) 首先我们思考一个问题,程序加载的时候会调用API,比如我们以前写的标准PE 那么他到底是怎么去调用的? 他会Call 下边的Jm ...

  7. PE格式第五讲,手工添加节表

    PE格式第五讲,手工添加节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 首先我们要用汇编编写一段汇编代码,用来生成 ...

  8. PE格式第八讲,TLS表(线程局部存储)

    PE格式第八讲,TLS表(线程局部存储) 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶复习线程相关知识 首先讲解 ...

  9. PE格式第九讲,资源表解析

    PE格式第九讲,资源表解析 一丶熟悉Windows管理文件的方法 首先,为什么标题是这个,主要是为了下边讲解资源方便,因为资源结构体很乱.如果直接拿出来讲解,那么就会很晕. 1.windows管理文件 ...

随机推荐

  1. PHP实现的一分页工具类代码

    总的页数是一个长度一定的木块,这把尺子在这个木块上滑动,前提,尺子的两端不能超出木块:D.发现这么一来要做的事情就是去找这个尺子在木块上的起始点,根据用户给传进来的page变量.哈哈,关键代码下面: ...

  2. java8新特性笔记

    1.forEach(),遍历数据结构中的元素,括号内可以带一个闭包的方法 2.双冒号用法:forEach(this::doSchedule),如果运行环境是闭包,java允许使用双冒号的写法来直接调用 ...

  3. 第六节:宿主如何使用AppDomain

    前面已经讨论了宿主以及宿主加载CLR的方式.同时还讨论了宿主如何告诉CLR创建和卸载AppDomain.为了使这些讨论更加具体,下面将描述一些常见的宿主和AppDomain使用情形.特别地,我要解释不 ...

  4. WebService到底是什么?(转)

    一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...

  5. bzoj 3196/tyvj p1730 二逼平衡树

    原题链接:http://www.tyvj.cn/p/1730 树套树... 如下: #include<cstdio> #include<cstdlib> #include< ...

  6. mac下的ssh自动登陆

    终端的ssh是标准的OpenSSH client 如果需要克隆会话功能,可以通过配置打开. $ cat .ssh/config Host * ControlMaster auto ControlPat ...

  7. 30.DDR2问题2_local_init_done为什么没拉高?

    按照初始化时序,在200us时,mem_clk时钟稳定,开始初始化设置,设置完后,会产生一个初始化完成标志,local_init_done会拉高,没有拉高,可能有以下几个原因: 1.确认DDR2 IP ...

  8. Labview实现幅度信号调制(AM)

    Labview实现幅度信号调制(AM) 时域上的表达式: 其中,m(t)是交流信号分量,均值为0,需要被调制的信号,此处选择一个正弦信号,正好满足要求. A0是一个直流分量,表示叠加的直流分量,用加法 ...

  9. verilog实现的16位CPU单周期设计

    verilog实现的16位CPU单周期设计 这个工程完成了16位CPU的单周期设计,模块化设计,包含对于关键指令的仿真与设计,有包含必要的分析说明. 单周期CPU结构图 单周期CPU设计真值表与结构图 ...

  10. windows+nginx+fcgi配置

    最近项目要求要学习一下nginx的知识,由于自己学疏才浅,搞了一天多终于基本搭建出来了,怕日后忘记,所以在此记录一下 nginx的历史,应用和种种就不记录了,自行百度.....Fcgi 相比cgi的好 ...