2017-06-03 28 views
2

已知Visual Studio库* .lib文件是包含COFF格式对象模块的Unix“ar”存档文件。但我发现用于导入DLL的库是不是COFF对象的小块(或存根)的存档。一个例子是库VS15 \ lib \ ucrt \ ucrt.lib。这些块包含函数的名称和对定义此函数的DLL库的引用。下面是一个例子存根(十六进制转储)的“看跌期权”功能:Microsoft Visual Studio导入库的格式

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对象(尽管它包含386具体到COFF架构签名0x14C)。我无法找到这些导入对象格式的任何文档。有人知道这种格式吗?

可能是非官方的规格?

可能是一些可以处理这种格式的源代码?

+0

帮助:https://blogs.msdn.microsoft.com/ronpih/2006/10/28/new-version-of-the- microsoft-pecoff-spec /? –

+0

我很了解这个文档,这是我的手册。唉,它只描述了传统的COFF目标模块,但没有导入存根。 –

+0

请注意,ucrt导入库比普通导入库更加特殊:它们可能包含特殊的逻辑来加载特定的版本化dll。见例如https://mingwpy.github.io/ucrt.html为什么只是为ucrt dll生成一个import lib会做错误的事情。 – rubenvb

回答

1

这就是所谓的微软“短进口”对象。基本上,它由20个字节的头部(与普通的COFF头部大小相同)组成,后面跟着两个零终止的字符串:分别是导入符号名称和DLL名称。

“短导入”标题与前四个签名字节中的常规COFF标题不同:0x00 0x00 0xFF 0xFF(没有常规COFF可以以此开始,因为它会读作“未知机器,65535节”,这是无意义的)。

“短导入”标题的格式在此处完整描述:MSDN PE Format

所以在上面的例子中,我们有:

为0x00为0x00 0xFF的0xFF的 - > “短进口” 签名
为0x00为0x00 - >版本0(未使用)
0x4C 0×01 - >机I386
0x39 0x80的0xE9将0x55 - >时间/日期戳(2015年6月17日,六时27分53秒UTC)
0×26 0×00 0×00 0×00 - >大小的报头之后的字符串(38个字节)
0x93为0x00 - >序数/提示(147)
0x08 0x00 - > b它字段(“代码”,由“名称”导入)

相关问题