深入理解PE结构各个字段含义 -----手工自己生成1个PE格式的文件

.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc

includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\windows.lib
.const
	lpHello db "Hello",0
      lpTitle db "Test",0
.code
start:
	invoke MessageBox,0,addr lpTitle,addr lpHello,0
	invoke ExitProcess,0
end start

操作系统环境XP,因为win7以上系统对PE结构检查的比较严格,无法生成最小的PE结构。

 先利用汇编生成1个样本,然后对PE文件的各个字段进行构造。

  我们先手动生成1个可以较小的PE文件,

    然后慢慢减小。

先把各个字段中,能随便修改的属性标记出来:

 然后开始拼接:

     拼接之后,遇到的第一个问题,无法识别为exe文件

 经过2天,发现是因为节表再映射的时候,从节区的第一个映射到内存的时候,把PE结构的头部覆盖掉了,因为这样不行。

 从文件中0x160映射到内存偏移0x0(0x00400000)的位置,这样映射,.text节就把文件的头部直接覆盖掉了,有些重要字段覆盖,导致不是PE结构。

因此注意映射关系。

 这样就不会覆盖头部。

遇到的第二个问题:

  od中调试的时候

这个是因为OD参考了,PE头部中的SizeofCode字段分配内存,因此会出错,我这个字段目前是0xCCCCCCC,可以设置为0x00000010反调试,让OD分配大内存,延迟加载。

 然后编写代码

 把代码的硬编码填入winhex中:

目前是512字节,程序能正常运行。

 现准备减小空间:

  如果把NT头放在MZ后边,正好文件对齐的位置是NT头的偏移,这样放的话,文件对齐为,

 因为可以继续在MZ的位置后移2位

 

posted @ 2023-08-21 10:12  一日学一日功  阅读(17)  评论(0编辑  收藏  举报