是否可以通过x86汇编语言调用COM对象?如果是这样,怎么样?
为什么我要这样做?假设我有两个我没有源代码的程序 - 我所有的都是二进制文件。其中一个实现了COM接口,另一个没有。我想在第一个程序中注入代码,使用这个COM接口调用第二个程序,这需要我使用x86程序集。
答案 0 :(得分:5)
当然有可能 - 实际上是C / C ++编译器所做的。
但为什么以上帝的名义你想要这样做?如果它是为了教育价值,那么肯定用直接C手工做COM的东西就可以了。
鉴于更新的问题,我建议您在DLL中编写COM内容并将该DLL注入要修补的程序中,然后将简单的x86代码修补到程序中以调用您的DLL吊装。我不记得将DLL注入进程的地址空间的技术,但至少有一对。 AppInit注册表设置(或类似的东西)是一个。
但是,我认为将代码注入流程的大多数途径都被认为是安全漏洞(并且经常被恶意软件使用),所以我怀疑微软可能已经删除了很多(如果不是全部)更多最近的服务包或操作系统版本。
答案 1 :(得分:1)
执行所需操作的最简单方法可能是创建一个执行COM通信的DLL,然后注入将强制其他应用程序加载DLL的代码。您可以使用DLL injectino技术,也可以只编辑应用程序本身的程序集来调用LoadLibrary / GetProcAddress等。
编辑:BTW,我发现OllyDbg是编辑现有应用程序程序集的一个很好的工具。
答案 2 :(得分:1)
我必须同意Mike B.这听起来像你不想做的事,但是......
为了扩展Mike B所说的可能性,在最低级别COM是ABI(应用程序二进制接口);也就是说,它定义了内存中COM对象的布局,并且所有COM对象都需要遵循此布局。 COM对象(在x86平台上)碰巧在内存中布局,就像Visual C ++编译器(和大多数其他编译器)在内存中布局对象一样。这使得C ++(和C,需要额外的努力)成为使用COM的便捷选择。也就是说,我从来没有见过任何人在汇编中尝试这个,但有一个关于在CodeProject上使用C进行COM的教程。那里的概念应该很容易转化为汇编:
答案 3 :(得分:0)
是的 - COM主要是作为二进制API 而设计的,虽然它可以很容易地从C / C ++实现。但是,规范不是C或C ++。
你可以参考原始的COM规范,有一个副本here,它也必须隐藏在微软网站的某个地方。
更新:您的用例似乎不需要直接使用程序集,可以使用任何代码注入技术。如何编译要注入的代码与注入代码的方式不同。
答案 4 :(得分:0)
您可以查看hard way,也可以寻找tested and true解决方案 它们都不需要汇编语言。