第55章 编译器产生的文件特征

55.1 Microsoft Visual C++

MSVC的版本和其DLL的对应关系如下所示。

市场发行的版本

内部版本

命令行版本

能导入的DLL的版本

发行日期

6

6.0

12.00

msvcrt.dll, msvcp60.dll

June 1998

.NET (2002)

7.0

13.00

msvcr70.dll, msvcp70.dll

February 13, 2002

.NET 2003

7.1

13.10

msvcr71.dll, msvcp71.dll

April 24, 2003

2005

8.0

14.00

msvcr80.dll, msvcp80.dll

November 7, 2005

2008

9.0

15.00

msvcr90.dll, msvcp90.dll

November 19, 2007

2010

10.0

16.00

msvcr100.dll, msvcp100.dll

April 12, 2010

2012

11.0

17.00

msvcr110.dll, msvcp110.dll

September 12, 2012

2013

12.0

18.00

msvcr120.dll, msvcp120.dll

October 17, 2013

msvcp*.dll含有C++相关函数,因此导入这些DLL文件的可执行程序很可能是C++程序。

55.1.1 命名规则

名字通常都是以“?”开始的。

有关MSVC命名规则的详细介绍,请参考本书51.1.1节。

55.2 GCC编译器

GCC不仅可以编译*NIX平台的应用程序,在Cygwin和MinGW环境下它同样可以编译面向Win32平台的应用程序。

55.2.1 命名规则

命名通常以符号“_Z”开始。

有关GCC命名规则的详细介绍,请参考本书51.1.1节。

55.2.2 Cygwin

GCC在Cygwin环境下编译的应用程序,通常会导入cygwin1.dll文件。

55.2.3 MinGW

GCC在Cygwin环境下编译的应用程序,可能会导入msvcrt.dll文件。

55.3 Intel FORTRAN

由Intel Fortran编译的应用程序,可能会导入以下3个文件:

① Libifcoremd.dll。

② Libifportmd.dll。

③ Libiomp5.dll(支持OpenMP)。

库文件libifcoremd.dll定义了很多以字符串“for_”开头的函数。它就是FORTRAN的代表性前缀。

55.4 Watcom以及OpenWatcom

55.4.1 命名规则

由Watcom编译出来的程序,其符号名称通常以“W”字母开头。

以W?method$_class$n__v为例:大写字母W开头代表它是Watcom编译出来的程序,方法的名称为method,类的名称为class,没有参数且无返回值的void方法会命名为:

W?method$_class$n__v

55.5 Borland编译器

下面所示的是Borland Delphi编译器以及C++ Builder的命名规范:

@TApplication@IdleAction$qv
@TApplication@ProcessMDIAccels$qp6tagMSG
@TModule@$bctr$qpcpvt1
@TModule@$bdtr$qv
@TModule@ValidWindow$qp14TWindowsObject
@TrueColorTo8BitN$qpviiiiiit1iiiiii
@TrueColorTo16BitN$qpviiiiiit1iiiiii
@DIB24BitTo8BitBitmap$qpviiiiiit1iiiii
@TrueBitmap@$bctr$qpcl
@TrueBitmap@$bctr$qpvl
@TrueBitmap@$bctr$qiilll

由Borland编译出来的程序,其符号名称必定以字符“@”开头,后面几个字母分别代表:类名称、方法名称以及方法的参数类型。

这些符号名称可能出现在exe文件的输入表、dll文件的输出表以及调试数据等地方。

VCL的全称是Borland Visual Component Libraries,意思是Borland的可视化组件库。它们保存在bpl文件中,而不是保存在dll文件中。比如说文件vcl50.dll和rtl60.dll。

由Borland编译出来的程序还可能会导入BORLNDMM.DLL文件。

55.5.1 Delphi编程语言

通过观察我们不难看出,几乎所有的Delphi可执行文件在代码段的起始部分都有一个“Boolean”字符串,后面还跟着其他数据类型的类型名称。

这里列出一个非常典型的Delphi程序的代码段片段,它就位于Win32程序的PE头之后。

00000400  04 10 40 00 03 07 42 6f 6f 6c 65 61 6e 01 00 00  |..@...Boolean...|
00000410  00 00 01 00 00 00 00 10 40 00 05 46 61 6c 73 65  |........@..False|
00000420  04 54 72 75 65 8d 40 00 2c 10 40 00 09 08 57 69  |.True.@.,.@...Wi|
00000430  64 65 43 68 61 72 03 00 00 00 00 ff ff 00 00 90  |deChar..........|
00000440  44 10 40 00 02 04 43 68 61 72 01 00 00 00 00 ff  |D.@...Char......|
00000450  00 00 00 90 58 10 40 00 01 08 53 6d 61 6c 6c 69  |....X.@...Smalli|
00000460  6e 74 02 00 80 ff ff ff 7f 00 00 90 70 10 40 00  |nt..........p.@.|
00000470  01 07 49 6e 74 65 67 65 72 04 00 00 00 80 ff ff  |..Integer.......|
00000480  ff 7f 8b c0 88 10 40 00 01 04 42 79 74 65 01 00  |......@...Byte..|
00000490  00 00 00 ff 00 00 00 90 9c 10 40 00 01 04 57 6f  |..........@...Wo|
000004a0  72 64 03 00 00 00 00 ff ff 00 00 90 b0 10 40 00  |rd............@.|
000004b0  01 08 43 61 72 64 69 6e 61 6c 05 00 00 00 00 ff  |..Cardinal......|
000004c0  ff ff ff 90 c8 10 40 00 10 05 49 6e 74 36 34 00  |......@...Int64.|
000004d0  00 00 00 00 00 00 80 ff ff ff ff ff ff ff 7f 90  |................|
000004e0  e4 10 40 00 04 08 45 78 74 65 6e 64 65 64 02 90  |..@...Extended..|
000004f0  f4 10 40 00 04 06 44 6f 75 62 6c 65 01 8d 40 00  |..@...Double..@.|
00000500  04 11 40 00 04 08 43 75 72 72 65 6e 63 79 04 90  |..@...Currency..|
00000510  14 11 40 00 0a 06 73 74 72 69 6e 67 20 11 40 00  |..@...string .@.|
00000520  0b 0a 57 69 64 65 53 74 72 69 6e 67 30 11 40 00  |..WideString0.@.|
00000530  0c 07 56 61 72 69 61 6e 74 8d 40 00 40 11 40 00  |..Variant.@.@.@.|
00000540  0c 0a 4f 6c 65 56 61 72 69 61 6e 74 98 11 40 00  |..OleVariant..@.|
00000550  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
00000560  00 00 00 00 00 00 00 00 00 00 00 00 98 11 40 00  |..............@.|
00000570  04 00 00 00 00 00 00 00 18 4d 40 00 24 4d 40 00  |.........M@.$M@.|
00000580  28 4d 40 00 2c 4d 40 00 20 4d 40 00 68 4a 40 00  |(M@.,M@. M@.hJ@.|
00000590  84 4a 40 00 c0 4a 40 00 07 54 4f 62 6a 65 63 74  |.J@..J@..TObject|
000005a0  a4 11 40 00 07 07 54 4f 62 6a 65 63 74 98 11 40  |..@...TObject..@|
000005b0  00 00 00 00 00 00 00 06 53 79 73 74 65 6d 00 00  |........System..|
000005c0  c4 11 40 00 0f 0a 49 49 6e 74 65 72 66 61 63 65  |..@...IInterface|
000005d0  00 00 00 00 01 00 00 00 00 00 00 00 00 c0 00 00  |................|
000005e0  00 00 00 00 46 06 53 79 73 74 65 6d 03 00 ff ff  |....F.System....|
000005f0  f4 11 40 00 0f 09 49 44 69 73 70 61 74 63 68 c0  |..@...IDispatch.|
00000600  11 40 00 01 00 04 02 00 00 00 00 00 c0 00 00 00  |.@..............|
00000610  00 00 00 46 06 53 79 73 74 65 6d 04 00 ff ff 90  |...F.System.....|
00000620  cc 83 44 24 04 f8 e9 51 6c 00 00 83 44 24 04 f8  |..D$...Ql...D$..|
00000630  e9 6f 6c 00 00 83 44 24 04 f8 e9 79 6c 00 00 cc  |.ol...D$...yl...|
00000640  cc 21 12 40 00 2b 12 40 00 35 12 40 00 01 00 00  |.!.@.+.@.5.@....|
00000650  00 00 00 00 00 00 00 00 00 c0 00 00 00 00 00 00  |................|
00000660  46 41 12 40 00 08 00 00 00 00 00 00 00 8d 40 00  |FA.@..........@.|
00000670  bc 12 40 00 4d 12 40 00 00 00 00 00 00 00 00 00  |..@.M.@.........|
00000680  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
00000690  bc 12 40 00 0c 00 00 00 4c 11 40 00 18 4d 40 00  |..@.....L.@..M@.|
000006a0  50 7e 40 00 5c 7e 40 00 2c 4d 40 00 20 4d 40 00  |P~@.\~@.,M@. M@.|
000006b0  6c 7e 40 00 84 4a 40 00 c0 4a 40 00 11 54 49 6e  |l~@..J@..J@..TIn|
000006c0  74 65 72 66 61 63 65 64 4f 62 6a 65 63 74 8b c0  |terfacedObject..|
000006d0  d4 12 40 00 07 11 54 49 6e 74 65 72 66 61 63 65  |..@...TInterface|
000006e0  64 4f 62 6a 65 63 74 bc 12 40 00 a0 11 40 00 00  |dObject..@...@..|
000006f0  00 06 53 79 73 74 65 6d 00 00 8b c0 00 13 40 00  |..System......@.|
00000700  11 0b 54 42 6f 75 6e 64 41 72 72 61 79 04 00 00  |..TBoundArray...|
00000710  00 00 00 00 00 03 00 00 00 6c 10 40 00 06 53 79  |.........l.@..Sy|
00000720  73 74 65 6d 28 13 40 00 04 09 54 44 61 74 65 54  |stem(.@...TDateT|
00000730  69 6d 65 01 ff 25 48 e0 c4 00 8b c0 ff 25 44 e0  |ime..%H......%D.|

数据段(DATA)的头四个字节通常是以下三个组合中的一个任意一个:00 00 00 00、32 13 8B C0或者FF FF FF FF。在处理被压缩或者被加密的Dephi可执行文件时,这组常数就会具有指标性意义。

55.6 其他的已知DLL文件