代码之家  ›  专栏  ›  技术社区  ›  Erik Forbes

来自x86程序集的COM?

  •  0
  • Erik Forbes  · 技术社区  · 16 年前

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

    我为什么要这么做?比如说,我有两个程序没有源代码——我只有二进制文件。其中一个实现了一个COM接口,另一个不实现。我想在第一个程序中注入代码以使用此COM接口调用第二个程序,这要求我使用x86程序集。

    5 回复  |  直到 12 年前
        1
  •  5
  •   Michael Burr    16 年前

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

    但你为什么要以上帝的名义这么做?如果这是为了教育价值,那么用C语言直接手工做COM的东西肯定会有效果。


    考虑到更新后的问题,我建议您将COM内容写入一个dll,并将该dll注入要修补的程序中,然后将简单的x86代码修补到该程序中,以调用执行重量级提升的dll。我不记得将DLL注入进程地址空间的技术,但至少有两种。AppInit注册表设置(或类似的设置)是一个。

    但是,我认为大多数将代码注入进程的方法都被认为是安全缺陷(并且经常被恶意软件使用),因此我怀疑微软可能已经从最近的服务包或操作系统版本中删除了许多(或者全部)代码。

        2
  •  1
  •   Gerald    16 年前

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

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

        3
  •  1
  •   Mike Spross Alex Martelli    16 年前

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

    为了扩展Mike B所说的可能,在最低级别的COM是一个ABI(应用程序二进制接口);也就是说,它定义了内存中COM对象的布局,并且所有COM对象都需要遵循这个布局。COM对象(在x86平台上)以与VisualC++编译器(以及大多数其他编译器)在内存中设置对象的方式相同的方式部署在内存中。这使得C++(和C,还有一些额外的努力)成为与COM一起工作的一个方便的选择。也就是说,我从未见过有人在汇编中尝试过这种方法,但是有一个关于用C语言编写COM的教程可以在codeproject上找到。那里的概念应该很容易翻译成装配:

    CodeProject: COM in Plain C

        4
  •  0
  •   Rob Walker    16 年前

    是--COM主要设计为 二进制API 虽然有一个非常容易实现的C/C++。然而,规范不是C或C++的。

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

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

        5
  •  0
  •   Cyber Oliveira    16 年前

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