如何在windbg中识别托管dll的版本?

Nim*_*oth 4 debugging dll unmanaged windbg

我有一个客户的minidump.我想找出加载的.NET dll的汇编版本.我已经在互联网上搜索了好几个小时了,但找不到有用的方法.我有windbg并加载了SOS扩展,并且需要clr.dll和mscordacwks.

使用lm -v只显示非托管的dll.我相信我忽略了一些非常简单的事情.

Nim*_*oth 7

好的,经过一些更多的研究后我得出的结论是,这种信息在小型转储中不适用于那些dll.无论如何,我至少能够获得有关这些文件的更多信息,这可能对将来的其他人有用.

你至少可以获得dll的metata信息,也许你可以在那里找到有用的东西.以下是如何做到这一点:

首先得到域名:

!dumpdomain
Run Code Online (Sandbox Code Playgroud)

最终可能会出现大量列出的程序集.现在,您可以使用以下方法手动查找:

!dumpassembly ADDRESS
Run Code Online (Sandbox Code Playgroud)

或者你可以使用懒惰的方式:安装windbg的python扩展(http://pykd.codeplex.com/)并使用以下脚本快速忽略(它可能不是最好的脚本,但它正在工作,我没有我想投入更多时间):

import pykd

def dump_assemblies():
    assemblies = 0

    addrs = pykd.dbgCommand("!dumpdomain").splitlines()
    for x in addrs:
        if x[:8] == "Assembly":
            assemblies = assemblies + 1
            print "### retrieving assembly " + x[-8:]
            print pykd.dbgCommand("!dumpassembly " + x[-8:])
    print "### found " + str(assemblies) + " assemblies."

dump_assemblies()
Run Code Online (Sandbox Code Playgroud)

您现在可以为dll进行文本搜索(CTRL + F).找到后,您可以找到模块名称旁边的偏移量(看起来像12327C8 C:\ Program Files\MyApp\MyDLL.dll).

您现在可以使用以下方式转储模块:

!dumpmodule 12327C8
Run Code Online (Sandbox Code Playgroud)

这将引导您:

Name:       C:\Program Files\MyApp\MyDLL.dll
Attributes: PEFile 
Assembly:   131a22e2
LoaderHeap:              00000000
TypeDefToMethodTableMap: 19220010
TypeRefToMethodTableMap: 134303e0
MethodDefToDescMap:      13430740
FieldDefToDescMap:       13433964
MemberRefToDescMap:      134350c8
FileReferencesMap:       13435918
AssemblyReferencesMap:   1343591c
MetaData start address:  1c1aaa4c (4248 bytes)
Run Code Online (Sandbox Code Playgroud)

现在,您只需使用以下命令检查dll的元数据:

dc 1c1aaa4c 1c1aaa4c + 4248
Run Code Online (Sandbox Code Playgroud)

这是我可以获得有关DLL的更多信息的最接近的.不幸的是,文件版本没有写在那里,只是其他一些更通用的信息.无论如何,我会尝试再次与客户取得联系.无论如何,谢谢你的答案.


Tho*_*ler 5

WinDbg lm v显示所有DLL,托管和非托管.在那个级别上,程序集只是一个DLL,只是一个模块.

使用WinDbg 6.3.9600,lm v甚至可以显示模块是否具有CLR标头的信息:

0:008> lmv m MyApp
start    end        module name
10310000 10574000   MyApp(deferred)             
    Image path: C:\...\MyApp.exe
    Image name: MyApp.exe
    Has CLR image header, track-debug-data flag not set
    Timestamp:        Wed May 21 16:34:02 2014 (537CB95A)
...
    ProductVersion:   1.8.0.44
    FileVersion:      1.8.0.44
...
Run Code Online (Sandbox Code Playgroud)

但是,FileVersion和ProductVersion仍然是编译到DLL的本机资源部分的非托管信息.

我建议您使用!SaveModule <start address> <filename>将文件保存在磁盘上,然后使用像dotPeek这样的反射工具打开它并从那里获取汇编信息,这将为您提供名称,版本,文化和公钥令牌.

要保存所有模块,纳文已经写了一个脚本是这样的:

!for_each_module .if ($spat ("${@#ImageName}","*.exe")) { !SaveModule ${@#Base} c:\temp\${@#ModuleName}.exe } .else { !SaveModule ${@#Base} c:\temp\${@#ModuleName}.dll }
Run Code Online (Sandbox Code Playgroud)