伊始
现如今windows可执行程序是基于PE结构的。如果我们了解了其中构造的方法,我们就可以实现手动打造可执行程序。也可以更好的防范DLL注入。
本文是DLL注入与安全延申。
主体
首先本文所用到的工具如下:
序号 | 软件名称 |
---|---|
1 | PE查看器 |
2 | 16j进制编辑器 |
那么我们开始吧!
首先我们要了解PE的组成。直接上图片!
整个exe由下面列表构成(重定位.reloc没有加入,.rsrc资源文件也没有加入。因为,对我们这篇文章影响不大)本程序,没有用那么多,不必要的已经删除,目的最小空间,完成我们的目标。
序号 | 名称 |
---|---|
1 | IMAGE_DOS_HEAD DOS头部 |
2 | MS-DOS Stub Program 汇编残余程序,省略了 |
3 | IMAGE_NT_HEADERS NT(PE)头 |
4 | Signature 签名 |
5 | IMAGE_FILE_HEADER 文件头 |
6 | IMAGE_OPTIONAL_HEADER 可选头 |
7 | IMAGE_SECTION_HEADER .text text节头 |
先我们先打开16进制编辑器
(注:一些头部可在winnt.h文件中看到)
- IMAGE_DOS_HEAD DOS头部 ,大小64与MS-DOS Stub Program大小,0-任意。
PS:数据类型 WORD 占 0x0000,也就是16进制编辑器图片中,2个00 的大小 LONG 占4个00的位置。根据系统采用大端或小端结构填充的数据也不同。我们这个环境是,低地址对应16进制低位,高地址对应16进制高位。
对于这个IMAGE_DOS_HEAD我只介绍重要的部分,不重要的部分均用0来填充,如果想知道其中含义及其使用方法,请自行百度。
在这个结构体中,最重要的是第一个变量e_magic和最后一个变量e_lfanew。第一个变量是固定值,0x5A4D 对应的ASCII 是MZ,为什么是这个是由历史意义的,请自行百度。对一个机器码填写4D5A.
最后一个变量是指向IMAGE_NT_HEADERS,下一个头的位置。所以这个位置与你sizeof(IMAGE_DOS_HEAD)+sizeof(MS-DOS Stub Program)的总和大小。
因为我们是win32程序,我们就不写残余程序了,直接sizeof(MS-DOS Stub Program)=0;所以就是sizeof(IMAGE_DOS_HEAD)=64,对应16进制0x00000040。所以IMAGE_NT_HEADERS起始点位地址00000040.
因为占了4位且由低位到高位,所以填写40 00 00 00.其他变量填写00,所以由如下结果。
上面就把IMAGE_DOS_HEAD头,与MS-DOS Stub Program构成完毕了。 - MAGE_NT_HEADERS包含3部分:
1) Signature:4位固定值:0x00004550 ASCII为PE,结果如下:
2) IMAGE_FILE_HEADER,大小sizeof(MAGE_NT_HEADERS)=20
Machine 所要运行的cpu,intel值是0x014C。所以