一直以来都在学习PE文件结构,从不敢轻视,但是即使如此还是发现自己在这方面有所不足,于是便想到了用纯手工方式打造一个完整的可执行的PE文件。在这期间我也查了大量资料,但是这些资料都有一个通病就是不完整,看雪得那个只翻译了一部分,加解密技术内幕介绍的更是笼统,而且是打造一个只有180字节的PE文件,是高手们茶余饭后的怡情小游戏。

鉴于此,心想为什么不自己摸索着手工打造一个完整些的呢?一是加强一下自己对于PE文件的了解,二是写出一篇参考性比较强的文章,给有志于在此发展的朋友们铺一铺路,也算是干了一件利国利民的好事。

对于手工打造PE文件,我个人认为至少要分为三篇文章来阐述,每篇相对独立,合起来形成一个相对的体系。第一篇文章(也就是本文)用来介绍怎样用手工打造一个最典型、最简单的PE文件,而后两篇文章的问世还要引用潘爱民先生的一句话“还需要时日与机缘”。

本文介绍的PE文件手工编辑方式,是本着以下三个原则所写的,望读者注意:
1、完整性:对于手工打造PE文件所不需注意的字段也进行了必要的介绍,因此整文可能显得非常臃肿。
2、典型性:完全按照典型的PE文件结构构造,因此对于某些不常见的PE文件结构有一定差距。
3、易学性:对于字段之间的逻辑关系进行了比较细致的介绍,因此对于一部分底子比较好的读者来说可能显得有些啰嗦。

为了方便各位阅读与查阅,我将文章分成了三各部分,以便各位读者各取所需,不用把宝贵的精力浪费在查找上。
1、PE文件整体信息,提供了一个剖析PE文件的图表,以便于读者对于PE文件有一个整体的了解,并监督自己的工作进度。
2、对于重点字段的介绍,以及字段之间的逻辑关系,建议首先从这里开始看。
3、手工构造PE文件字段清单,此清单包含构造一个完整PE文件的每一个字节,跟着这个清单走就可以构造一个PE文件。

对于第一次手工打造PE文件的朋友们来说,你们可以以“一、整体性息”为大纲,并参考第三部分一块一块的慢慢打造,如果有不懂的地方就去看第二部分。

选读:为什么要手工打造PE文件?

我们知道,往往从一个系统可执行文件结构上,就可以看整个操作系统的一些特性。也就是说PE里有Windows操作系统结构与运行机理的影子。由此可见,PE文件必然是一个非常庞杂且逻辑复杂的结构,那么为什么我们还要“自取其辱”来手工制造一个PE文件呢?这就要从PE文件的重要性说起了。
    
        我们现今组成Windows大家庭的主要成员就是PE文件了,里面包括EXE、DLL、OCX、SYS等一切最有价值的文件都是PE文件格式,出于对版权的考虑或对某种技术的渴求,任何一种与Windows系统相关的行为最终都要归集到这里--PE文件。

特别是对于想学习加壳、破解、搞虚拟机的朋友们来说,熟知PE文件结构更是必不可少的基本功!

但也正是由于PE文件的复杂性,我们才要采取一些特别的办法来攻克它,其中手工打造PE文件就是一条捷径。

你可以想像一下,如果你都可以手工打造PE文件的话,那么对于PE文件的了解更是可见一斑了。但是我还想提醒一下各位读者,即便是如此,我们所了解的也仅仅是一部分,不过一般情况下已经足够了。

一、整体性息

这部分以图表的形式表示PE文件的整体结构。

-------------*-------------------------------------------------*
                 | DOS Header(IMAGE_DOS_HEADER)         | -->64 Byte
DOS头部  --------------------------------------------------
                 | DOS Stub                                                      | -->112 Byte
-------------*-------------------------------------------------*
                 | "PE"00 (Signature)                                        | -->4 Byte
                  -------------------------------------------------
                 | IMAGE_FILE_HEADER                                | -->20 Byte
PE文件头 --------------------------------------------------
                 | IMAGE_OPTIONAL_HEADER32                 | -->96 Byte
                 ---------------------------------------------------
                 | 数据目录表                                                    | -->128 Byte
-------------*--------------------------------------------------*
                 | IMAGE_SECTION_HEADER                        | -->40 Byte
                 ---------------------------------------------------
   块表       | IMAGE_SECTION_HEADER                        | -->40 Byte
                  --------------------------------------------------
                 | IMAGE_SECTION_HEADER                         | -->40 Byte  
-------------*--------------------------------------------------*
                 |.text                                                                  | -->512 Byte
                 ---------------------------------------------------
    块          |.rdata                                                               | -->512 Byte
                 ---------------------------------------------------
                 |.data                                                                 | -->512 Byte
-------------*-------------------------------------------------*
                 | COFF行号                                                       | -->NULL
                 ---------------------------------------------------
调试信息 | COFF符号表                                                     | -->NULL
                 ---------------------------------------------------
                 | Code View 调试信息                                        | -->NULL
-------------*--------------------------------------------------*

这部分内容的意义有二:
1、对于PE文件有一个整体的认识。
2、方便审查自己的构造进度。

这里我们重点介绍怎样用其审查自己的构造进度,首先希望各位读者明白我们将要手工构造的一个体积为2560字节的这个小家伙,对于初次上手的读者们来说并不是一件小的工程,因此有必要知道自己现在正做什么,以及做到哪里了。

记得我少年学画时老师教我们构图就要从整体到局部,后来自学编程仍然是先实现大的框架再去解决每一个细节问题。OK,现在到了这里,很显然我们仍然需要本着从整体到局部的思想来构造我们的PE文件。

那好,我们先搞明白第一个问题“我们的文件体积是怎么计算出来的呢”。

首先我们要知道,PE文件自始至终都是以一种节的思想来构造的,那么我们就要从节开始。

对于本文所讲述的PE文件来讲总共有三个区块(节),他们分别用来存放可执行代码、输入表信息以及全局变量,接触过PE文件的朋友对于区块的概念应该不陌生,我们知道Windows下的很多应用程序的文件对齐粒度,也就是大名鼎鼎的FileAlignment字段的值多为200h Byte,也就是十进制的512 Byte。我们同样应该知道,对于不足512字节的区段,余下部分要用00h填充到512字节大小,对与超过部分(例如513字节的区段)我们就要在多分配给他512字节个空间。

当然,这些基础知识我想有一部分读者应该比较熟悉,那么对于PE文件头部分呢?也是如此吗?例如本例中的PE头就占用了544个字节,但是很显然这要使其填充到1024(400h)字节处才能开始第一个区段.text段。

正是如此,我们整个文件的体积就是PE头+3个区段的体积之和,也就是PE头(512*2)+3个区段(512*3)=2560,这也就是我们所构造的PE文件的最终大小了。

其次我们提前搞清楚一些字段与区段的偏移量也是比较重要的,这里对于计算方式不再多说,请大家直接看下面的表:
1、PE头开始处 000000B0h
2、IMAGE_OPTIONAL_HEADER32开始处 000000C8h
3、数据目录表开始处 00000128h
4、块表开始处 000001A8h
5、.text块开始处 00000400h
6、.rdata块开始处 00000600h
7、.data块开始处 00000800h

当然,上面的那些Offset只是针对本文件而言,并不绝对,具体情况还要具体分析。

到此,本段就告一段落了,剩下的两段为了提高效率我并没有加以润色,全都是干货,希望各位读者能吃下这两块营养丰富的压缩饼干……

二、重点字段介绍

这里只对需手工构造的字段进行着重介绍,详细的PE文件结构字段清单请见第三部分。

1、DOS头部
  1-1  DOS Header
    1-1-1   e_magic  [WORD]  -->4D 5A (* DOS可执行文件头标记)
    注释:此处值总是为MZ的16进制码。

1-1-19  e_lfanew  [DWORD]  -->B0 00 00 00 (* 指向PE文件头的偏移量。0xB0=64+112)
    注释:此处的值正好为为DOS头部的大小,因为DOS头部后面就是PE文件头部分了。

2  PE文件头
  2-1  "PE"00
    2-1-1  Signature  [DWORD] -->50450000h (* PE文件头标记)
    注释:此处的值总是为PE的16进制值加0000h。

2-2  IMAGE_FILE_HEADER
    2-2-1  Machine  [WORD]  -->4C 01 (* 可执行文件的目标CPU类型)
    注释:此PE文件可以运行于哪个CPU下,其标志就为相应的值。
    *------------------------------*
    |     机器            |  标志   |
    -------------------------------
    | Intel i386         | 14Ch   |
    -------------------------------
    | MIPS R3000    | 162h   |
    -------------------------------
    | MIPS R4000    | 166h   |
    -------------------------------
    | Alpha AXP       | 184h   |
    -------------------------------
    | Power PC        | 1F0h   |
    *-----------------------------*

2-2-2  NumberOfSections  [WORD]  -->03 00 (* 区块数目)
    注释:此值决定此PE文件的区块数目,本文件为3个区块。

2-2-6  SizeOfOptionalHeadr  [WORD]  -->E0 00 (* PE头(IMAGE_OPTIONAL_HEADER32)大小)
    注释:此值表示PE文件头的大小。

2-2-7  Characteristics  [WORD]  -->0F 01 (* 文件属性)
    注释:此值为文件的执行属性。EXE文件此值一般为010Fh,DLL文件此值一般为0210h。

2-3  IMAGE_OPTIONAL_HEADER32
    2-3-1   Magic  [WORD]  -->0B 01 (* 标记字)
    注释:此处是一个标记字,用于描述次PE文件的映像类型。ROM映像为0107h;普通可执行映像010Bh;PE32+则是020Bh。

2-3-7   AddressOfEntryPoint  [DWORD] -->00 10 00 00 (* 程序执行入口RAV)
    注释:通俗的说就是指向可执行代码区块(例如.text)的首地址。

2-3-10  ImageBase  [DWORD] -->00 00 40 00 (* 程序默认装入基地址)
    注释:是指文件在内存中首选的装入地址。

2-3-11  SectionAlignment  [DWORD] -->00 10 00 00 (* 内存中区块对齐值)
    注释:PE文件被装入内存中时的块对齐大小,也叫做块粒度。其默认的对其尺寸是CPU的页尺寸。

2-3-12  FileAlignment  [DWORD] -->00 02 00 00 (* 文件中区块对齐值)
    注释:磁盘上PE文件的区块对齐大小。这个值必须是2的幂,并且最小为200h。

2-3-17  MajorSubsystemVersion  [WORD]  -->04 00 (* 运行所需最低子系统主版本号)
    注释:要求最低的子系统主版本号,一般情况下都为4。

2-3-18  MinorSubsystemVersion  [WORD]  -->00 00 (* 运行所需最低子系统次版本号)
    注释:要求最低的子系统次版本号,一般情况下都为0。

2-3-20  SizeOfImage  [DWORD] -->00 40 00 00 (* 映像装入内存后的总尺寸)
    注释:指的是装入文件从Image Base到最后一个区块的总大小。

2-3-21  SizeOfHeaders  [DWORD] -->00 04 00 00 (* DOS头、PE头、区块表的总大小)
    注释:指的是DOS头、PE头与区块表的总大小,并且所有这些项目都出现在PE文件中任何代码或数据块之前。此值遵守文件对齐粒度。

2-3-23  Subsystem [WORD]  -->03 00 (* 文件子系统)
    注释:标明可执行文件所期望的子系统(用户界面类型)。
          *----*-------------------------------------*
          | 值 |          子系统                          |
          *----*-------------------------------------*
          | 0  | 未知                                        |
          --------------------------------------------
          | 1  | 不需要子系统(如驱动程序) |
          ---------------------------------------------
          | 2  | 图形接口子系统(GUI)          |
          ---------------------------------------------
          | 3  | 字符子系统(CUI)                 |
          ---------------------------------------------
          | 5  | OS/2字符子系统                      |
          ---------------------------------------------
          | 7  | POSIX字符子系统                    |
          ---------------------------------------------
          | 8  | 保留                                         |
          ---------------------------------------------
          | 9  | Windows CE图形界面              |
          *----*--------------------------------------*

2-3-30  NumberOfRvaAndSizes  [DWORD] -->10 00 00 00 (* 数据目录标的项数,默认总为16)
    注释:数据目录的项数。这个字段字NT系统发布以来就一直是16。

详细的手工构造PE文件教程相关推荐

  1. 实验五——手工编写PE文件

    [实验名称] 手工编写PE文件 [实验目的] 1.了解PE文件的概念.结构 2.熟悉PE编辑查看工具,详细了解PE文件格式 3.重点分析PE文件文件头.引入表.引出表,以及资源表 [实验原理] 1.P ...

  2. PE文件详解(教程1-7)

    PE文件详解(教程1-7) ========================================= PE教程1: PE文件格式一览 PE 的意思就是 Portable Executable ...

  3. 超详细的实现上传文件功能教程,文件上传实现。

    重要声明:本文章仅仅代表了作者个人对此观点的理解和表述.读者请查阅时持自己的意见进行讨论. 本文更新不及时,请到原文地址浏览:<超详细的实现上传文件功能教程,文件上传实现.>. 一.文件上 ...

  4. [网络安全自学篇] 六十一.PE文件逆向之数字签名详细解析及Signcode、PEView、010Editor、Asn1View等工具用法(二)

    本系列虽然叫"网络安全自学篇",但由于系统安全.软件安全与网络安全息息相关,作者同样会分享一些系统安全案例及基础工具用法,也是记录自己的成长史,希望大家喜欢,一起进步.前文 &qu ...

  5. python如何将图片打包进exe里_史上最详细的Python打包成exe文件教程

    打包成exe文件可以让python代码在没有python环境的条件下,依然能够运行,实在是码农们写追女朋友表白.情人节浪漫的必需品! 1.使用豆瓣镜像源下载: pyinstaller 有需要了解如何使 ...

  6. PE文件-手工修改重定位表-WinHex-CFF Explorer

    文章目录 1.CFF Explorer 2.计算添加后的重定位大小 3.作者答疑 1.CFF Explorer   如果需要修改exe,dll等的二进制代码,遇到添加绝对地址时,需要将绝对地址的位置添 ...

  7. 小甲鱼 OllyDbg 教程系列 (二) :从一个简单的实例来了解PE文件

    小甲鱼视频讲解: https://www.bilibili.com/video/av6889190?p=6 https://www.bilibili.com/video/av6889190?p=7 从 ...

  8. PE文件和COFF文件格式分析——导出表

    在之前的<PE可选文件头>相关博文中我们介绍了可选文件头中很多重要的属性,而其中一个非常重要的属性是(转载请指明来源于breaksoftware的CSDN博客) IMAGE_DATA_DI ...

  9. [系统安全] 四十一.APT系列(6)Python解析PE文件并获取时间戳判断来源区域

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  10. 【黑客免杀攻防】读书笔记6 - PE文件知识在免杀中的应用

    0x1 PE文件与免杀思路 基于PE文件结构知识的免杀技术主要用于对抗启发式扫描. 通过修改PE文件中的一些关键点来达到欺骗反病毒软件的目的. 修改区段名 1.1 移动PE文件头位置免杀 工具:PeC ...

最新文章

  1. 图片路径上传的配置问题
  2. 应用层的AIDL用法(原)
  3. JVM调优:使用G1垃圾回收器
  4. 笔记——数据可视化02
  5. Window phone用手机来控制电脑的多媒体播放
  6. 使用TensorFlow进行鬼写
  7. go语言api源码中文版_Go语言学习——sync.map源码剖析
  8. linux vim文本编辑器
  9. python mock接口怎么用_python接口自动化测试 - mock模块基本使用介绍
  10. 初学者python笔记(map()函数、reduce()函数、filter()函数、匿名函数)
  11. NYOJ-背包问题(贪心)
  12. 算法问题的解决 —— 预测答案结构(限制答案的形式)
  13. echarts折线图y轴根据数值自动_Python matplotlib 绘制双Y轴曲线图的示例代码
  14. 让DB2跑得更快——DB2内部解析与性能优化
  15. 日本最后一刻阻拦鸿海收购夏普:质疑董事私心
  16. 显微镜C接口_显微分析设备聚焦离子束扫描电子显微镜
  17. java突然无法加载主类_java错误:找不到或无法加载主类的原因与解决方法
  18. 如何科学地利用A/B测试快速迭代产品?
  19. VC-应用程序正常初始化失败-0xc0150002
  20. 解决VMware下Win10主机和win7虚拟机实现文件共享问题

热门文章

  1. 阿里云部署 nodejs+mongoDB 傻瓜教程
  2. 十年嵌入式arm-linux总结
  3. Java离线人脸识别SDK 支持arcface 2.0 最新版
  4. python程序的基本元素
  5. Flink运行时之TaskManager执行Task
  6. 五.树莓派4B-安装常用软件
  7. 某微型计算机广告中标有四核,某微型计算机广告中标有“四核 i5-3330 4G 1TB GT640 1G 独显 DVD Win8...
  8. 工作常用英语单词整理2
  9. 计算机毕业设计Node.js+Vue化妆品销售购物系统(程序+源码+LW+部署)
  10. 卫星导航算法 --geo 库函数的学习