如何从COM dll中的序号获取函数名称

时间:2009-03-16 08:38:20

标签: com dll ordinals

我试图从COM dll的序数中获取实际的函数名称。我尝试使用dumpbin.exe,但每个序号只返回[NONAME](前几个除外)。

    ordinal hint RVA      name

         21    0 00002439 DllCanUnloadNow
         25    1 00007F41 DllGetClassObject
        116    2 0000539C DllMain
        138    3 00008633 DllRegisterServer
        176    4 00008640 DllUnregisterServer
          1      0009152E [NONAME]
          2      00154CA7 [NONAME]
          3      00154C0B [NONAME]
          4      000140C9 [NONAME]
        ...

包含.dll文件的目录不包含任何其他文件(* .tlb,* .lib,* .def)。

有人能告诉我如何获取这些清单吗? 或者至少使用注册表或某些特定序号的名称?

[编辑:其他信息] 我找不到COM dll的.def文件,所以我不能用它来获取名称。我对实例化COM类不感兴趣,我只想知道哪个函数与指定的序数有关。

我最初的问题是我使用WinDbg发现了一个例外,它发生在 ChartFXClientServerCore!Ordinal5507(+ 0x97b7),所以我想看看特定功能试图找出问题。

2 个答案:

答案 0 :(得分:2)

您可以使用OleView工具(OLE / COM对象查看器),它随Windows SDK http://www.microsoft.com/downloads/details.aspx?FamilyId=F26B1AA4-741A-433A-9BE5-FA919850BDBF&displaylang=en一起提供(以及其他)。在该工具中,转到File-> View TypeLib,然后浏览到您的DLL。

编辑:回答关于类型库暴露的DLL序号和方法名称之间关系的问题:通过COM暴露的方法也不常见,也可以通过DEF文件公开或通过__declspec(dllimport)。通常,在通过CoCreateInstance()或类似方法创建相应的类之后,通过其IUnknown派生的接口访问COM方法。

DLL的程序员也可以 选择公开DEF文件中的一些COM方法,但是AFAIK找出映射的唯一方法就是查看dumpbin / exports的输出,取消装饰返回的名称(使用undname.exe),并在类型库中直观地找到对应关系。

答案 1 :(得分:1)

如果你的COM组件没有被标记为安全的脚本,那么OLEView可能没有任何真实的信息(也就是说它不是从脚本调用的,所以编译它的所有信息(typelib)都被编译通过idl)。

mIDA之类的东西可以获得大部分信息。您也可以在openrce上搜索woodmann,NDR RPC IDL,尝试使用symbolviewer。 (RIP fravia)。