我知道,这条路很疯狂。
我有一个我想通过 .NET 扩展的可执行文件(我无权访问的源代码)。它是本机可执行文件,因此我需要注入 CLR 主机才能执行此操作。我的基本想法是通过 .NET 语言(例如 C#)提供类似脚本的功能,并在目标可执行文件中提供挂钩以供脚本操作,反之亦然。
我知道我需要使用各种技术来实现这一点 - DLL 注入、一些运行时 ASM 注入等,但我想知道的是:我所说的可能吗?更好的是 - 以前有人做过这样的事情吗?
我知道,这条路很疯狂。
我有一个我想通过 .NET 扩展的可执行文件(我无权访问的源代码)。它是本机可执行文件,因此我需要注入 CLR 主机才能执行此操作。我的基本想法是通过 .NET 语言(例如 C#)提供类似脚本的功能,并在目标可执行文件中提供挂钩以供脚本操作,反之亦然。
我知道我需要使用各种技术来实现这一点 - DLL 注入、一些运行时 ASM 注入等,但我想知道的是:我所说的可能吗?更好的是 - 以前有人做过这样的事情吗?
如果您的本机可执行文件能够使用 COM 对象,您可以使用 COM 互操作来执行此操作。如果您为互操作注册您的.NET 程序集,那么您的本机可执行文件可以使用您的.NET 类,就像“普通”COM 对象一样,当第一个对象被创建时,它将在本机进程中启动 CLR。同样,如果您可以从本机可执行文件中公开 COM 对象,那么如果您创建互操作程序集(或者甚至没有类型库,如果您只使用 IDispatch),您可以从您的 .NET 代码中使用它们。
基础很简单,但我只是触及表面 - 对于像这样的严肃项目,您需要认真的参考。我强烈推荐.NET 和 COM, Adam Nathan 的完整互操作性指南。这是一本大书,没有多少未说的内容,而且它还提供了很多关于设计 .NET 和 COM 类以实现干净互操作的重要信息。它还解释了如何在本机应用程序中直接托管 CLR,但如果不访问源代码,该选项可能不切实际。我肯定会从 COM 互操作路由开始,如果您没有其他选择,则仅在本机托管 CLR。
我们实际上为自动化框架做了一些非常相似的事情。您可能想查看 CodePlex 上的EasyHook项目。它有很多不错的功能,包括用于跨进程通信的内置 IPC Communicator。它需要一些腿部工作,但应该完全符合您的要求。