我正在尝试在windbg中调试一些exe。现在它调用了一些暴露DLLGetClassObject函数的第三方com dll。
DLLGetClassObject签名是
HRESULT __stdcall DllGetClassObject(
__in REFCLSID rclsid,
__in REFIID riid,
__out LPVOID *ppv
);
查看堆栈跟踪和参数我可以使用命令
找出类ID和接口IDdt GUID [地址]
当我尝试在注册表中搜索这些guid时,我无法找到任何内容。
有什么问题吗?我应该能够在regsitry中看到com类和接口id。 有什么想法吗?
答案 0 :(得分:1)
可能......如果你遵循callstack,任何COM运行时函数(DllGetClassObject
,CoCreateInstance
)调用CoGetClassObject
?
如果是这样,您的CLSID应该在HKEY_CLASSES_ROOT / CLSID下找到。接口不一定是注册的。
请注意,没有什么可以阻止应用加载DLL并手动调用DllGetClassObject,只要它知道要创建的对象的线程模型要求。
答案 1 :(得分:1)
我有另一个不相关的理论 - 你有第三方DLL的符号吗?
如果没有,调用到所述模块的callstack中的条目通常显示为模块中第一个导出的偏移+一些大偏移。
如果DllGetClassObject被选为模块的“基本导出”,并且.exe调用模块中托管的COM方法,则callstack将显示如下内容:
DllGetClassObject + 0x112313
UseThirdPartyCOMThing + 0x20
其中0x112313大于您期望DllGetClassObject的代码大小。
所以,它可能是一个红色的鲱鱼 - 你可能只是看到一个在你的可用符号中不匹配的偏移量调用DLL,调试器使用它可用的任何信息显示它。