gpt4 book ai didi

delphi - 识别/列出来自第三方软件的 COM 对象和属性

转载 作者:行者123 更新时间:2023-12-03 14:44:04 26 4
gpt4 key购买 nike

我正在尝试设计一个可以识别任何不同应用程序上的 COM 对象及其属性的应用程序。这是我第一次尝试这样做,我什至不知道从哪里开始。理想情况下,它是使用 Delphi XE2 制作的,但我愿意接受建议。

如果我有 CLSID,有什么方法可以“扫描”正在运行的应用程序以查找基于它的对象吗?或者,换句话说,是否有更好的方法在任何正在运行的应用程序中列出/查找事件对象?

我们非常感谢任何帮助,以及有关该主题的良好文档的任何指示。

编辑:问题实际上是在任何其他应用程序中查找 COM 对象、列出属性以及我需要的任何其他内容已经在其他问题中得到了解答。

最佳答案

无法扫描正在运行的 COM 对象。一旦它们被实例化,它们就只是被其他东西(成员接口(interface)指针变量等)引用的内存片段。

有时,对象会放在运行对象表 (ROT) 上,您可以从那里检索它们,正如评论中已经建议的那样。比方说,此属性适用于 <1% 的 COM 对象实例,但也许您足够幸运能够准确地追求这些实例。

我能想到的唯一方法是 Hook COM 对象实例化,以便拦截创建,然后能够跟踪您自己的现有实例列表。但这也不是一个简单的方法(而且很可能是不安全的)。

要实现此目的,您需要在运行进程的上下文中为您感兴趣的 CLSID 注册您的类对象,并让您的类工厂接收实例化调用。或者, Hook CoCreateInstance API,例如使用 Detours

一旦你 Hook 实例化,你就会在对象创建时获得指针,并且你再次需要对它们做一些事情。您可能希望将这些实例化调用转发到原始 API,然后跟踪实例的生命周期 - 如果您对对象添加额外的引用,则可能会改变应用程序的原始行为。否则,你无法控制拦截COM对象的释放。有时,可以聚合创建 COM 类,并且您可以或多或少地干净地将原始实例嵌入到 COM 对象中。

总而言之,总的来说,这项任务似乎不太可行。拥有特定的感兴趣的CLSID,如果运气好并且付出一定的努力,您可能会成功地做到这一点。

关于delphi - 识别/列出来自第三方软件的 COM 对象和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9925953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com