刚工作的时候,我听说某某大牛在做病毒分析时,只是用notepad打开病毒文件,就能大致猜到病毒的工作原理。当时我是佩服的很啊,同时我也在心中埋下了一个种子:我也得有这天。随着后来的工作进行,一些任务的和这个理想有了交集,这得以让我有足够的时间和精力去细细研究PE文件和COFF文件格式。(转载请指明出处)
如果有一定的英语基础的朋友,可以查看微软原稿(http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx)。如果没什么耐性去读,可以去读我即将编写的《PE文件和COFF文件格式分析》系列博文,同时我用VC去解析一些文件。这儿补充说明下,微软原稿中有一页是一些免责声明,大概就是说微软可能会在之后修改这些文件结构,而不会通知到你。我对PE和COFF文件格式的研究是基于原稿8.2版本的,可能若干年后,我这儿写的东西就存在不对的地方了。之后我们切入正题。
PE的全称是Portable Executable,用中文就是“可移植、可执行的”。从这个名字可以看出PE文件格式是一种文件格式标准,该标准并不局限于Windows某个平台,因为它是“可移植”的。比如我们在xp下编写的程序,一般可以没有问题的放在Win7的系统上跑。这个特性非常重要,它让windows平台软件提供了延续性的可能,否则软件厂商要为不同系统编写或者生成不同的程序,这无疑增加了软件提供商的负担,同时这也大大降低了软件传播的速度。“可执行性”是说这个文件是中承载着可以被CPU执行的指令,而不是像TXT这样的只是承载着数据。
COFF的全称是Common Object File Format,用中文描述是“通用对象文件结构”。此处特别注意“对象”这个用词,如果研读过PECOFF原稿的朋友,可以发现,文中介绍一些属性时,区分了Image和Object两种文件的情况。对编译链接有一定了解的朋友应该知道,我们编写的C++对象文件,先会被编译成为一个和文件同名且格式为obj的文件,然后链接器会将这些obj文件链接成Exe或者DLL这样的PE文件。这里的obj文件就是COFF格式的。
如之前介绍的,我们编写的PE文件很可能是由COFF文件链接而成,那么PE和COFF之间有什么关系呢?PE文件中包含COFF格式头,这个头的信息非常重要,我会在之后介绍。
以上是经典的PE文件格式
以上是经典的COFF文件格式
之后我们会讨论更详细的信息。