在平时的分析当中,经常会碰到PE结构的文件,虽然 010 Editor 等工具会提供一个模板,把各个部分都详细的标记出来,但是在调试的时候,经常会需要在 VS 等程序框中进行调试,所以,就需要对PE结构有一定的了解,才能够快速定位到自己想要的地方。
为了更好的了解PE结构中的每一位的作用,最好的办法就是自己手写一个PE文件,这样对每一个部分的理解,都会清晰很多。
目录
0x00 准备工作
0x01 构造DOS头
0x02 构造File头
0x03 构造Optional头
0x04 构造节表
0x05 构造导入表
0x06 执行代码
0x00 准备工作
在开始之前,有一些细节是需要提前思考好的,这些细节对于整个PE结构来说是非常重要的。
因为只需要完成一个弹窗的效果,代码量是非常少的,所以在程序的设计上,一个节表就完全足够了,同时,我们希望保证文件尽可能小,所以将文件对齐设置为200,将内存对齐设置为1000。
再加上头部和对齐的考虑,文件就需要占用400个字节了,到内存展开以后就占用2000字节。
注:PE格式中,所有可以被覆盖掉,而不影响程序运行的位置,我都会用CC来填充,这些位置可以写入字节的shellcode等。
0x01 构造DOS头
DOS头部在编辑器中占用了4行,其中的多数数据都是在16位的DOS环境下运行时所必备的,在现在看来,已经是可以占用的内容,只有两个参数是必须的:e_magic和e_lfanew。
e_magic
这个位是识别性的头部(MZ),这个位置是会被作为一个合法PE文件的检测位。
e_lfanew
用来指向一个新的结构,这个也就是我们现在来说,最重要的结构,所有的参数信息都是在这个结构中定义的。
在DOS头部后面还有一个Stub数据区,是16位程序的残留数据,是可以去掉的,所以就直接将e_lfanew指向了0x40,在这个位置开始新的结构。
0x02 构造File头
PE标识、File头以及Optional头统称为NT头,这里就不提NT的概念了,PE标识有4字节。
File头有1.4行,有4个重要的参数。
Machine
这是一组宏,表示在什么硬件下运行,一定要根据实际的情况来进行更改,当前是Intel386,