Decyphering未记录的COM接口

时间:2010-08-20 00:51:06

标签: com interface

我有一个指向COM对象的指针,该对象实现了一个未记录的接口。我真的,真的喜欢能够使用所述界面。我所拥有的只是IID。主软件分析师Geoff Chappell在他的网站上记录了大量这些未记录的COM接口;例如,请参阅IListView。不知何故,他甚至设法获得了函数名称和签名。这样的事情怎么可能呢?他们猜对了吗?

有人能指出我正确的方向,我会怎么做这样的事情?我知道使用任何无证件的风险。

详细说明,我感兴趣的对象是ExplorerFrame.dll的臭名昭着的未记录的ItemsView。通过在CoCreateInstance上设置API挂钩,我可以看到该对象是使用某个未记录的IID作为其主接口创建的。我假设这是操纵控件的界面,因此我有兴趣找出它的成员。

3 个答案:

答案 0 :(得分:5)

你知道,你可以写信告诉我!曾经有一段时间我会明确地写出名称和原型来自微软的公共符号文件,但我很久以前就把它作为措辞。如果我总是在解释如何获取我的信息,那么我将成为什么样的逆向工程师!我会侮辱那些作为逆向工程师的读者而且我会冒险让那些只想要这些信息的人感到烦恼(我们面对它,通常并不惹人注目)。

如果你没有公共符号文件,那么typelibs是下一个最好的东西。但是,当然,并非所有接口都出现在类型库中 - 甚至不是所有实现IDispatch的接口。

鉴于您有可执行文件及其公共符号文件,获取IID并列出方法几乎是最简单的逆向工程。对于可靠的自动化而言,这可能有点过于复杂 - 尽管我很乐意被证明是错误的。

您可能知道接口,因为您有一个实现的虚函数表。最有可能的是,您发现这是因为您正在对一个类进行逆向工程,在这种情况下,您可以通过构造函数或析构函数来查找其所有接口的虚函数表。虚函数表是指向函数的指针数组。公共符号文件为您提供这些函数的修饰名称。一个称职的逆向工程师可以通过视觉来解开这些符号,而且Visual C ++提供了一个UNDNAME工具(你的调试器或反汇编程序可能无论如何都可以为你工作)。查找IID通常需要检查QueryInterface方法,以匹配接口的虚函数表与类的开头的已知偏移量。

对于一个简单的界面,比方说,有六种方法,整个练习只需要一个基本的IID,偏移和原型列表,在一个美好的一天可能需要10分钟,如果你是的话,不超过30分钟懒惰。当然,对于很多这些未记录的接口,您可能需要检查多个版本中的实现和IID是否相同 - 这可以很快将好日子变成坏日子。

顺便说一句,如果我猜到某些事情或假设,我会尽力说出来。例如,在文档的末尾,你引用了其他没有文档的IListView界面,我说的是一个窗口消息:你可以知道我给的名字是由我组成的,因为我说“也许就像这样命名”。

答案 1 :(得分:2)

PDB文件的权威解释器是MSPDBxx.DLL。解释PDB文件的主要工具是调试器,现在还扩展为Microsoft Visual C ++链接器,作为DUMPBIN反汇编程序。这些不显示PDB文件中的所有内容,但它们执行所有基本操作,例如列出所有符号,标记代码和数据,以及汇总文件中的任何类型信息(在公共符号文件中通常没有) 。

像往常一样,一位称职的,有成就的逆向工程师可以通过视觉读取这些文件,以获取标准工具未显示的信息。最值得注意的例子是部分贡献信息,它与公共符号文件一样接近匹配代码到源文件。

如何将符号文件中的调试器指向文档。我使用DUMPBIN创建列表的做法只是将二进制文件和相应的PDB文件复制到当前目录。只要PDB文件的文件名与二进制文件的调试目录中的文件名匹配,DUMPBIN就会自动使用PDB文件。这真的不容易。

我认为非Microsoft反汇编程序和反编译程序至少能够使用目标二进制文件可用的任何PDB文件。

答案 2 :(得分:0)

如果您的指针触及IDispatch(很可能),您可以使用QueryInterface,然后使用GetIDsOfNames。您可能最终会猜测它可能使用的接口,并调用QI只是为了看看它有效:)