我试图从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),所以我想看看特定功能试图找出问题。
答案 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)。