深入理解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位