【发布时间】:2008-10-10 00:16:16
【问题描述】:
是否可以通过 x86 汇编语言调用 COM 对象?如果有,怎么做?
我为什么要这样做?假设我有两个没有源代码的程序——我只有二进制文件。其中一个实现了 COM 接口,另一个没有。我想将代码注入第一个程序以使用此 COM 接口调用第二个程序,这需要我使用 x86 程序集。
【问题讨论】:
是否可以通过 x86 汇编语言调用 COM 对象?如果有,怎么做?
我为什么要这样做?假设我有两个没有源代码的程序——我只有二进制文件。其中一个实现了 COM 接口,另一个没有。我想将代码注入第一个程序以使用此 COM 接口调用第二个程序,这需要我使用 x86 程序集。
【问题讨论】:
当然有可能——实际上这就是 C/C++ 编译器所做的。
但是看在上帝的份上,你为什么要这样做呢?如果它是为了教育价值,那么用纯 C 手工完成 COM 的东西肯定会成功。
鉴于更新后的问题,我建议您将 COM 内容写入 DLL 并将该 DLL 注入您要修补的程序中,然后将简单的 x86 代码修补到程序中以调用执行繁重的 DLL起重。我不记得将 DLL 注入进程地址空间的技术,但至少有几个。 AppInit 注册表设置(或类似的设置)就是其中之一。
但是,我认为将代码注入进程的大多数途径都被认为是安全漏洞(并且经常被恶意软件使用),因此我怀疑微软可能已经从最近的服务包或操作系统版本。
【讨论】:
最简单的方法可能是创建一个执行 COM 通信的 DLL,然后注入将强制其他应用程序加载 DLL 的代码。您可以使用 DLL 注入技术,也可以只编辑应用程序本身的程序集以调用 LoadLibrary/GetProcAddress 等。
编辑:顺便说一句,我发现OllyDbg 是编辑现有应用程序程序集的好工具。
【讨论】:
我必须同意 Mike B 的观点。这听起来像是你不想做的事情,但是......
为了扩展 Mike B 所说的它是可能的,在最低级别的 COM 是 ABI(应用程序二进制接口);即它定义了COM对象在内存中的布局,所有的COM对象都必须遵循这个布局。 COM 对象(在 x86 平台上)碰巧在内存中布局,就像 Visual C++ 编译器(和大多数其他编译器)在内存中布局对象一样。这使得 C++(和 C,需要付出一些额外的努力)成为使用 COM 的便捷选择。也就是说,我从未见过有人在汇编中尝试过这个,但是 CodeProject 上有一个关于在 C 中做 COM 的教程。那里的概念应该很容易转化为汇编:
【讨论】:
是的——COM 主要被设计为一个二进制 API,尽管它可以通过 C/C++ 轻松实现。但是,规范不是针对 C 或 C++ 的。
你可以参考原来的 COM 规范,有一个副本here,它也必须埋在微软网站的某个地方。
更新:您的用例似乎不需要直接使用汇编,可以使用任何代码注入技术。如何编译要注入的代码与注入的方式不同。
【讨论】:
您可以通过hard way 或寻找tested and true 解决方案。
它们都不需要汇编语言。
【讨论】: