【问题标题】:COM from x86 assembly?来自 x86 程序集的 COM?
【发布时间】:2008-10-10 00:16:16
【问题描述】:

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

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

【问题讨论】:

    标签: com x86 assembly


    【解决方案1】:

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

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


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

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

    【讨论】:

    • OpenProcess/WriteProcessMemory 仍然有效。由于加载器是在用户空间中实现的,因此它们必须这样做。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      CodeProject: COM in Plain C

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 对于我需要添加的极其简单的功能来说,这两个都是矫枉过正的。不过谢谢 - 我使用过 DLL 注入,也玩过 Detours,虽然不是很广泛。
          猜你喜欢
          • 1970-01-01
          • 2012-06-30
          • 2013-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-11
          • 2011-05-26
          • 2014-08-07
          相关资源
          最近更新 更多