解密未记录的COM接口

解密未记录的COM接口,com,interface,Com,Interface,我有一个指向COM对象的指针,该对象实现了一个未记录的接口。我真的非常希望能够使用这个界面。不过我只有身份证。主软件分析师Geoff Chappell在其网站上记录了大量未记录的COM接口;例如,见。不知何故,他甚至设法得到了函数名和签名。这样的事情怎么可能发生?他们是猜测吗 有人能给我指出正确的方向,告诉我怎么做这样的事情吗?我知道使用任何未经证明的东西都有风险 更详细地说,我感兴趣的对象是ExplorerFrame.dll的臭名昭著的未记录ItemsView。通过在CoCreateInsta

我有一个指向COM对象的指针,该对象实现了一个未记录的接口。我真的非常希望能够使用这个界面。不过我只有身份证。主软件分析师Geoff Chappell在其网站上记录了大量未记录的COM接口;例如,见。不知何故,他甚至设法得到了函数名和签名。这样的事情怎么可能发生?他们是猜测吗

有人能给我指出正确的方向,告诉我怎么做这样的事情吗?我知道使用任何未经证明的东西都有风险


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

如果您的指针包含IDispatch(很可能),您可以查询接口,然后获取IDsofNames。你可能会猜到它可能会使用什么接口,然后打电话给QI只是为了看看什么是有效的:)

你知道,你可以写信给我,然后问我!曾经有一段时间,我会明确指出名称和原型来自微软的公共符号文件,但我很久以前就放弃了这一说法。如果我总是解释我是如何获得信息的,我会是一个什么样的逆向工程!我会侮辱我的读者,他们是逆向工程师,我会冒着让那些只想要信息的人感到厌烦的风险(让我们面对现实,这些信息通常不引人入胜)

如果没有公共符号文件,那么typelibs是次好的选择。但是,当然,并不是所有接口都出现在typelibs中,甚至不是所有实现IDispatch的接口

考虑到您有一个可执行文件及其公共符号文件,获取IID并列出方法几乎是最简单的反向工程。对于可靠的自动化来说,这可能有点太复杂了——尽管我希望在这方面被证明是错误的

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

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


顺便说一句,如果我猜测某事或假设,我会尽量确保这样说。例如,在您引用的关于未记录的IListView界面的文档末尾,我谈到了一条窗口消息:您可以知道我给出的名称是由我虚构的,因为我说“可能命名为类似的名称”

PDB文件的最终解释器是MSPDBxx.DLL。解释PDB文件的主要工具是调试器,现在还扩展了微软Visual C++链接器作为垃圾箱反汇编程序的伪装。它们并没有显示PDB文件中的所有内容,但它们完成了所有基本工作,例如列出所有符号、标记代码和数据,并根据文件中的任何类型信息进行汇总(在公共符号文件中通常没有)

像往常一样,一个称职的、有造诣的逆向工程师可以通过目测来读取这些文件,以获取标准工具未显示的信息。最显著的例子是节贡献信息,它与公共符号文件将代码与源文件匹配的程度相当

您如何将调试器指向符号文件是有很好的文档记录的。我使用DUMPBIN制作列表的做法是将二进制文件和相应的PDB文件复制到当前目录。只要PDB文件的文件名与二进制文件的调试目录中的文件名匹配,DUMPBIN就会自动与PDB文件一起工作。这真是再容易不过了


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

如果它是无证件的,你怎么知道你喜欢它?找到类型库,使用OleView.exe编辑问题;看起来ExplorerFrame.dll没有类型库。在OleView中查看Itemsview并没有显示任何有用的内容。遗憾的是,它没有实现IDispatch。呃,这听起来也是一个非常有用的函数……你可能需要反复尝试;如果你猜到了它可能是什么,就去看它是否说是。QueryInterface(IID_IDispatch)返回E_NOINTERFACE。但是,我已经知道接口是什么;我不知道它定义了什么方法,或者它们的参数是什么。我想我可以开始用随机参数给他们打电话,看看什么会崩溃,什么不会,但我希望有一种更文明的方式……祝你好运。是的,你可以试着打电话到不同的可变位置,看看会发生什么。使用调试器,您应该能够看到函数清理堆栈,这将帮助您推断参数计数。我曾经