2008-10-10 97 views
0

是否可以通过x86汇编语言调用COM对象?如果是这样,怎么样?来自x86程序集的COM?

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

回答

5

当然这是可能的 - 实际上这就是C/C++编译器的功能。

但是为什么在上帝的名下你想要这样做?如果它是为了教育价值,那么肯定用直接C来手动完成COM的东西就可以做到。


鉴于更新的问题,我建议你写的东西COM DLL中并注入该DLL到要修补,然后用简单的x86代码的补丁到程序中调用您的DLL程序这是繁重的举动。我不记得将DLL注入进程的地址空间的技术,但至少有一对。 AppInit注册表设置(或类似的)是一个。然而,我认为大多数将代码注入进程的途径都被认为是安全漏洞(并且经常被恶意软件所使用),所以我怀疑微软可能已经删除了很多(如果不是大多数)(或全部)更新的Service Pack或OS版本。

+0

OpenProcess/WriteProcessMemory仍然有效。它们必须像加载器在用户空间中实现一样。 – Joshua 2009-01-10 04:52:07

0

是的 - COM主要设计为二进制API,虽然它有一个非常容易从C/C++实现。但是,该规范不是以C或C++的形式出现的。

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

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

1

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

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

1

我与麦克B.这听起来像是你不想做的事情达成一致,但是...

要在迈克乙说这件事是可能的,在最低水平COM是扩大一个ABI(应用程序二进制接口);也就是说,它定义了内存中COM对象的布局,并且所有的COM对象都需要遵循这个布局。 COM对象(在x86平台上)正好像Visual C++编译器(和大多数其他编译器)在内存中放置对象的方式一样布置在内存中。这使得C++(和C语言,还有一些额外的努力)成为使用COM的一个方便的选择。也就是说,我从来没有见过任何人在汇编中尝试这个,但是有一个关于在CodeProject上使用C中的COM的教程。的概念应该是很容易转化为装配:

​​

0

你可以去通过hard way或者你可以找一个tested and true解决方案。
它们都不需要汇编语言。

+0

这两个都是我需要添加的非常简单的功能的矫枉过正。不过谢谢 - 我已经使用DLL注入,并且我已经和Detours一起玩过,尽管不是很广泛。 – 2008-10-21 03:07:18