我有一个指向实现未记录的接口的COM对象的指针.我真的非常希望能够使用所述界面.我所拥有的只是IID.主软件分析师Geoff Chappell在他的网站上记录了大量这些未记录的COM接口; 以IListView为例.不知何故,他甚至设法获得了函数名称和签名.这样的事情怎么可能呢?他们猜对了吗?
有人能指出我正确的方向,我会怎么做这样的事情?我知道使用任何无证件的风险.
详细说明,我感兴趣的对象是ExplorerFrame.dll的臭名昭着的未记录的ItemsView.通过在CoCreateInstance上设置API挂钩,我可以看到该对象是使用某个未记录的IID作为其主接口创建的.我假设这是操纵控件的界面,因此我有兴趣找出它的成员.
小智 5
你知道,你可以写信告诉我!曾经有一段时间我会明确地写出名称和原型来自微软的公共符号文件,但我很久以前就把它作为措辞.如果我总是在解释如何获取我的信息,那么我将成为什么样的逆向工程师!我会侮辱那些作为逆向工程师的读者而且我会冒险让那些只想要这些信息的人感到烦恼(我们面对它,通常并不惹人注目).
如果你没有公共符号文件,那么typelibs是下一个最好的东西.但是,当然,并非所有接口都出现在类型库中 - 甚至不是所有实现IDispatch的接口.
鉴于您有可执行文件及其公共符号文件,获取IID并列出方法几乎是最简单的逆向工程.对于可靠的自动化而言,这可能有点过于复杂 - 尽管我很乐意被证明是错误的.
您可能知道接口,因为您有一个实现的虚函数表.最有可能的是,您发现这是因为您正在对一个类进行逆向工程,在这种情况下,您可以通过构造函数或析构函数来查找其所有接口的虚函数表.虚函数表是指向函数的指针数组.公共符号文件为您提供这些函数的修饰名称.一个称职的逆向工程师可以通过视觉来解开这些符号,而且Visual C++提供了一个UNDNAME工具(你的调试器或反汇编程序可以为你完成工作).查找IID通常需要检查QueryInterface方法,以匹配接口的虚函数表与类的开头的已知偏移量.
对于一个简单的界面,比如说,有六种方法,整个练习只写一个基本的IID,偏移和原型列表,在一个美好的一天可能需要10分钟,如果你是懒惰则不超过30分钟.当然,对于很多这些未记录的接口,您可能需要检查多个版本中的实现和IID是否相同 - 这可以很快将好日子变成坏日子.
顺便说一句,如果我猜到某些事情或假设,我会尽力说出来.例如,在文档的末尾,你引用了其他没有文档的IListView界面,我说的是一个窗口消息:你可以知道我给的名字是由我组成的,因为我说"或许名字就像".