众所周知,VisualStudio库 *.lib文件是一个Unix“ar”归档文件,其中包含COFF格式的对象模块。但我发现用于导入DLL的库是一个小块归档文件(或存根)。例如,库VS15\lib\ucrt\ucrt.lib。这些块包含函数名和对定义此函数的DLL库的引用。以下是一个示例“puts”函数存根的(十六进制转储):
00-00-FF-FF-00-00-4C-01-39-E9-80-55-26-00-00-00 ......L.9..U&...
93-00-08-00-5F-70-75-74-73-00-61-70-69-2D-6D-73 “..._puts.api-ms
2D-77-69-6E-2D-63-72-74-2D-73-74-64-69-6F-2D-6C -win-crt-stdio-l
31-2D-31-2D-30-2E-64-6C-6C-00 1-1-0.dll.
它肯定不是COFF对象(尽管它包含COFF特有的386架构签名0x14C)。我找不到任何关于这些导入对象格式的文档。有人知道这种格式吗?
可能是非官方规格?
可能是一些源代码,可以处理这种格式?
1条答案
按热度按时间js81xvg61#
这就是所谓的Microsoft“短导入”对象,基本上由20字节的头(与常规COFF头的大小相同)和两个以零结尾的字符串组成:导入符号名称和DLL名称。
“短导入”标头与常规COFF标头的前四个签名字节不同:
0x00 0x00 0xFF 0xFF
(没有常规的COFF可以以此开头,因为它会读作“未知机器,65535节”,这是无稽之谈)。“短导入”表头格式详细说明如下:MSDN PE格式。
因此,在上面的示例中,我们有:
0x 00 0x 00 0xFF 0xFF --〉“短导入”签名
0x 00 0x 00--〉版本0(未使用)
0x 4C 0x 01--〉机器I386
0x 39 0xE 9 0x 80 0x 55--〉时间/日期戳(2015年6月17日,6:27:53 UTC)
0x 26 0x 00 0x 00 0x 00--〉报头后面的字符串大小(38字节)
0x 93 0x 00--〉序号/提示(147)
0x 08 0x 00--〉位字段(“代码”,按“名称”导入)