来自x86程序集的COM?

来自x86程序集的COM?,com,x86,assembly,Com,X86,Assembly,是否可以通过x86汇编语言调用COM对象?如果是,怎么做 我为什么要这么做?假设我有两个没有源代码的程序——所有的都是二进制文件。其中一个实现了COM接口,另一个没有。我想使用这个COM接口将代码注入第一个程序,调用第二个程序,这要求我使用x86汇编。当然有可能——实际上,C/C++编译器就是这么做的 但你为什么要这样做?如果是为了教育的价值,那么用C语言手工制作COM肯定会奏效 考虑到更新后的问题,我建议您在DLL中编写COM内容,并将该DLL插入到要修补的程序中,然后在程序中插入简单的x8

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


我为什么要这么做?假设我有两个没有源代码的程序——所有的都是二进制文件。其中一个实现了COM接口,另一个没有。我想使用这个COM接口将代码注入第一个程序,调用第二个程序,这要求我使用x86汇编。

当然有可能——实际上,C/C++编译器就是这么做的

但你为什么要这样做?如果是为了教育的价值,那么用C语言手工制作COM肯定会奏效


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

然而,我认为将代码注入进程的大多数途径都被认为是安全缺陷(并且经常被恶意软件使用),因此我怀疑微软可能已经删除了很多(如果不是大部分的话)(或者全部的话)来自较新的service Pack或操作系统版本。

是的——COM主要设计为一个二进制API,尽管它可以很容易地从C/C++实现。但是,规范不是C或C++的。 您可以参考原始的COM规范,其中有一个副本,它必须埋在Microsoft站点的某个地方


更新:您的用例似乎不需要直接使用汇编,任何代码注入技术都可以使用。如何编译要注入的代码与如何注入代码是不同的。

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


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

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

为了扩展Mike B所说的可能性,最低级别的COM是ABI(应用程序二进制接口);也就是说,它定义了内存中COM对象的布局,所有COM对象都必须遵循此布局。COM对象(在x86平台上)恰好与VisualC++编译器(以及大多数其他编译器)在内存中设置对象的方式一样被放置在内存中。这使得C++(和C,还有一些额外的努力)成为与COM工作的一个方便选择。也就是说,我从未见过有人在汇编中尝试过这个,但CodeProject上有一个关于用C编写COM的教程。那里的概念应该很容易转化为组装:

您可以查看或寻找解决方案。

它们都不需要汇编语言。

对于我需要添加的极其简单的功能来说,这两种语言都是多余的。不过还是要感谢-我已经使用了DLL注入,并且我已经绕道而行了,虽然不是很广泛。OpenProcess/WriteProcessMemory仍然可以工作。它们必须在用户空间中实现加载程序。