将CLR主机注入正在运行的进程 - 可能吗?

时间:2009-04-24 20:00:29

标签: .net x86 code-injection clr-hosting

这种方式是疯狂,我知道。

我有一个可执行文件(我无法访问的源代码),我想通过.NET扩展。它是一个本机可执行文件,所以我需要注入一个CLR主机才能执行此操作。我的基本想法是通过.NET语言(例如C#)提供类似脚本的功能,并在目标可执行文件中提供钩子来操作脚本,反之亦然。

我知道我需要使用各种技术来实现这一点 - DLL注入,一些运行时ASM注入等,但我想知道的是:我正在谈论的可能性是什么?更好的是 - 有没有人之前做过这样的事情?

2 个答案:

答案 0 :(得分:2)

如果您的本机可执行文件能够使用COM对象,则可以使用COM互操作执行此操作。如果您为interop注册.NET程序集,那么您的本机可执行文件可以像“普通”COM对象一样使用您的.NET类,并且当创建第一个时,它将在本机进程内启动CLR。如果您可以从本机可执行文件中公开COM对象,那么如果您创建一个互操作程序集(或者即使没有类型库,如果您只使用IDispatch),也可以从.NET代码中使用它们。

基础知识很简单,但我只是表面上看 - 对于像这样的严肃项目,你需要一个认真的参考。我强烈推荐Adam Nathan的.NET and COM, The Complete Interoperability Guide。这本书是一本不遗余力的大书,它还有很多关于设计.NET和COM类以便干净利落的信息。它还解释了如何直接在本机应用程序中托管CLR,但如果不访问源代码,该选项可能不实用。我肯定会从COM互操作路径开始,如果你没有其他选择,只能本地托管CLR。

答案 1 :(得分:1)

我们实际上为自动化框架做了类似的事情。您可能想看看CodePlex上的EasyHook项目。它有很多不错的功能,包括用于跨进程通信的内置IPC Communicator。它需要一些腿部工作,但应该完全符合您的要求。