首先先了解一下PE文件:
PE(Protable Executable),即可移植的执行体。在Windows操作系统平台下,所有的可执行文件如EXE文件、DLL文件、SYS文件、OCX文件、COM文件等均使用PE结构。
PE文件结构包含的结构体有DOS头、PE标识、文件头、可选头、目录结构、节表等。
这篇文章主要是对DOS头的一些想法,DOS头主要分为两部分即“MZ头部”和“DOS存根”。MZ头部是真正的DOS头,而DOS存根则是一段简单的DOS程序,主要用来输出类似“This program cannot be run in DOS mode.”的提示语句,由于DOS存根里的内容无关紧要,所以可以把这部分用来存储其他数据而不改变程序原本的功能。
下面是笔者对DOS存根写入数据的想法:
首先,写一个简单的看起来似乎没有什么用处的小程序:
找到编译后生成的exe文件后,用C32Asm打开该exe文件:
这里选择16进制模式打开,在开始处我们可以看到MZ头:
向下溯源,发现PE头的首地址,即00 00 00 0F(这里的十六进制地址是以小尾方式存储的):
通过PE头的首地址,我们找到PE头的具体位置,这里也看得到PE头:
找到PE头得位置后,那么PE头与MZ头之间的那一部分就是我们需要找的DOS存根部分了:
在DOS存根部分,我们也能够看到“This program cannot be run in DOS mode”的提示字符串,接下来需要做的就是通过修改DOS存根的内容来将自己想加入的东西写入程序,而不影响程序的正常使用。笔者在这里用到的内容是:“这是我的博客:https://blog.csdn.net/song_10,欢迎关注!”,不过我并不想别人用反汇编工具载入这个exe文件就可以看到我修改的信息,所以在这里用base64对这一字符串进行简单的加密,得到:“6L+Z5piv5oiR55qE5Y2a5a6i77yaaHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NvbmdfMTDvvIzmrKLov47lhbPms6jvvIE=”,下面进入C32Asm来将我的信息写入到DOS存根当中:
修改后保存程序,然后打开EXE文件,发现可以成功打开,但程序并没有显示之前所添加的信息:
接着将修改的程序重新载入C32Asm中,能够在DOS存根的部分看到自己加入的信息:
说明已经成功将我们想加入的内容写入一个EXE的可执行文件当中了,这时又想误导一下别人这个exe可以执行文件损坏不能打开,进而对自己加入的信息进一步“加密”,那么我们就可以对PE头动一些手脚。
首先需要了解一下PE头的作用:用来装载PE文件。
如果对PE头进行修改,那么系统就不能正常装载PE文文件,进而就营造处该文件已损坏的假象,达到目的。
同样是在C32Asm中,对PE头随意修改一个字符(修改太多的话不容易恢复,那就真正成了损坏的PE文件了):
这里,笔者将E修改为e,保存后,找到EXE文件双击打开,出现以下提示,说明目的达到:
如果想要程序正常打开,那么只需将修改PE头的内容改回原来的内容就可以了。这里除了可以修改PE头的内容来达到目的之外
还可以对MZ头进行修改,同样能够达到相同的目的(MZ头:EXE文件标志)