0

是否可以通过 x86 汇编语言调用 COM 对象?如果是这样,怎么做?

我为什么要这样做?假设我有两个没有源代码的程序——我只有二进制文件。其中一个实现了 COM 接口,另一个没有。我想将代码注入第一个程序以使用此 COM 接口调用第二个程序,这需要我使用 x86 程序集。

4

5 回答 5

5

当然这是可能的——实际上这就是 C/C++ 编译器所做的。

但是,看在上帝的份上,你为什么要这样做呢?如果它是为了教育价值,那么在直接 C 中手工完成 COM 的东西肯定会奏效。


鉴于更新的问题,我建议您将 COM 内容写入 DLL 并将该 DLL 注入您要修补的程序中,然后将简单的 x86 代码修补到程序中以调用执行繁重工作的 DLL。我不记得将 DLL 注入进程地址空间的技术,但至少有几个。AppInit 注册表设置(或类似的设置)就是其中之一。

但是,我认为将代码注入进程的大多数途径都被认为是安全漏洞(并且经常被恶意软件使用),因此我怀疑微软可能已经从更新的服务包中删除了许多(如果不是大部分(或全部))或操作系统版本。

于 2008-10-10T00:18:05.837 回答
1

做你想做的最简单的方法可能是创建一个执行 COM 通信的 DLL,然后注入将强制其他应用程序加载 DLL 的代码。您可以使用 DLL 注入技术,也可以只编辑应用程序本身的程序集以调用 LoadLibrary/GetProcAddress 等。

编辑:顺便说一句,我发现OllyDbg是编辑现有应用程序程序集的好工具。

于 2008-10-10T00:31:34.750 回答
1

我必须同意 Mike B 的观点。这听起来像是你不想做的事情,但是......

为了扩展 Mike B 所说的可能,最低级别的 COM 是 ABI(应用程序二进制接口);即它定义了COM对象在内存中的布局,所有的COM对象都必须遵循这个布局。COM 对象(在 x86 平台上)碰巧在内存中布局,就像 Visual C++ 编译器(和大多数其他编译器)在内存中布局对象一样。这使得 C++(以及 C,需要付出一些额外的努力)成为使用 COM 的便捷选择。也就是说,我从未见过有人在汇编中尝试过这个,但是 CodeProject 上有一个关于在 C 中做 COM 的教程。那里的概念应该很容易转化为汇编:

CodeProject:普通 C 语言中的 COM

于 2008-10-10T00:31:46.467 回答
0

是的——COM 主要被设计为二进制 API,尽管它可以通过 C/C++ 轻松实现。但是,该规范不是针对 C 或 C++ 的。

你可以参考原始的 COM 规范,这里有一份副本它也必须埋在微软网站的某个地方。

更新:您的用例似乎不需要直接使用程序集,可以使用任何代码注入技术。如何编译要注入的代码与注入它的方式不同。

于 2008-10-10T00:23:51.863 回答
0

您可以经历艰难的道路,也可以寻找经过测试的真实解决方案。
它们都不需要汇编语言。

于 2008-10-10T00:53:51.243 回答