这个头文件包含了所有PE相关的结构

第一课 PE的介绍与手写DOS头

首先创建一个小的可执行程序

第一课 PE的介绍与手写DOS头

选择一个小的应用程序

第一课 PE的介绍与手写DOS头

编译好之后,我们看一下他的区段(text是放代码的,rdata段是放导入表的,data用来放全局函数的)

第一课 PE的介绍与手写DOS头

把头文件放到编译的目录下可以精简我们的程序

第一课 PE的介绍与手写DOS头

只要在源码中包含一下这个头文件即可

第一课 PE的介绍与手写DOS头

右键查看头文件

第一课 PE的介绍与手写DOS头

合并区段的部分被注释掉了

第一课 PE的介绍与手写DOS头

加上合并区段的代码

第一课 PE的介绍与手写DOS头

编译出来会发现应用程序更小了,查看一下区段,会发现区段被合并了

第一课 PE的介绍与手写DOS头

进入正题

第一课 PE的介绍与手写DOS头

 

 

这是PE的整体架构

第一课 PE的介绍与手写DOS头

我们一个一个分开看

第一课 PE的介绍与手写DOS头

为什么要将MZ当做DOS签名呢?

第一课 PE的介绍与手写DOS头

这个是我手写PE程序的DOS头,有64字节(PE只是个参考,有些结构体成员可有可无)

第一课 PE的介绍与手写DOS头计算一下大小,验证一下

第一课 PE的介绍与手写DOS头

DOS存根的概念

第一课 PE的介绍与手写DOS头

40到4D是16位的汇编指令,在DOS环境下才会执行这些代码,32为的Windows中不会运行。

第一课 PE的介绍与手写DOS头

这是手写PE的DOS存根,总共112字节 我将它的位置留出来方便讲解,也可以不留(DOS存根大小一般为112字节,大小不固定)

第一课 PE的介绍与手写DOS头

 

 

NT头(包含了文件头和可选头)

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

NT头有4个字节的标识,前面空出的8字节是为了内存对其需要,必须得填充NULL

第一课 PE的介绍与手写DOS头

文件头

文件头是表现文件大致属性的结构体

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

注意一个特殊的例子:.obj和resource DLL的characteristics值不是0002h,他们都不可执行

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

 

第一课 PE的介绍与手写DOS头

手写PE的NT头

第一课 PE的介绍与手写DOS头

 

可选头(PE头中最大的结构体)

第一课 PE的介绍与手写DOS头

必须有的成员:否则可执行文件会出错

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

手写PE的可选头

第一课 PE的介绍与手写DOS头

 

节区头的概念

第一课 PE的介绍与手写DOS头

 

 

 

 

 

节区头结构体

第一课 PE的介绍与手写DOS头

重要成员

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

Characterisitics是由下面这些值组合起来的(相加)

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

手写PE的节区头(区段头)

第一课 PE的介绍与手写DOS头

RVA和RAW之间的转换

第一课 PE的介绍与手写DOS头

文件偏移-文件中节区的起始位置=内存偏移-内存中节区的起始位置

文件偏移=内存偏移-内存中节区的起始位置+文件中节区的起始位置

 

创建一个文件,用C32打开

第一课 PE的介绍与手写DOS头第一课 PE的介绍与手写DOS头

认识数据的存储方式

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

写好PE签名,然后剩下成员用58个00填充

第一课 PE的介绍与手写DOS头第一课 PE的介绍与手写DOS头

写好了

第一课 PE的介绍与手写DOS头

 

 

 

 

 

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

参考编译器生成的程序

第一课 PE的介绍与手写DOS头

把存根的位置留出来

第一课 PE的介绍与手写DOS头

第一课 PE的介绍与手写DOS头

把NT头的PE标识写在后面

第一课 PE的介绍与手写DOS头

 

相关文章:

  • 2021-05-19
  • 2021-12-29
  • 2021-09-21
  • 2021-06-21
  • 2021-09-25
  • 2021-04-03
  • 2021-09-08
猜你喜欢
  • 2021-09-21
  • 2021-07-30
  • 2021-04-25
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-16
相关资源
相似解决方案