可能吗?修改加载的c# DLL

本文关键字:DLL 加载 修改 | 更新日期: 2023-09-27 18:01:49

我只是想知道在我开始工作之前这是可能的。我可以将c#代码注入并运行到一个正在运行的进程中,也可以枚举所有加载的。net模块。另外,我可以编辑。net DLL的指令来添加我的方法调用。显然,当DLL加载时,我无法编辑DLL,但是当我尝试时,系统消息告诉我无法编辑它,因为它加载在另一个进程中。这使我相信,如果我在相同的进程中(因为,比如说,我的注入代码),我可以编辑加载的DLL。我怀疑这是不对的。

如果没有,你认为可能有可能卸载目标DLL,编辑它,并重新加载目标DLL?系统是否会正确地重新映射所有的值(因为新的DLL会大一些指令)?我有一种感觉,如果可以卸载DLL,编辑它,然后重新加载到进程中,那么操作系统应该负责其余的工作。

感谢您的意见和反馈。

可能吗?修改加载的c# DLL

这是可能的。

"用你自己的委托替换任何。net方法!"

见:http://research.microsoft.com/en-us/projects/moles/

视频:http://channel9.msdn.com/blogs/peli/moles-replace-any-net-method-with-a-delegate

这是在"代码注入"类别。非常有趣的东西。

这在技术上是否覆盖了MSIL?不确定。然而,这种技术会给你相同的最终结果。这就是我们关心的,对吧?

一旦。net DLL被CLR加载到进程中,删除它的唯一方法就是卸载所有使用DLL的AppDomain实例。所以我猜这是可能的编辑加载的DLL通过执行以下

  1. 卸载包含DLL的所有AppDomain实例,从而删除对DLL的持有
  2. 在磁盘上编辑DLL或者只是将修改后的DLL放在不同的位置
  3. 创建一个新的AppDomain并加载修改后的DLL

我认为在不重启应用程序的情况下做到这一点的唯一方法可能是击中JIT推出的机器代码;但是之后你将会有很多乐趣找到你想要的东西,更不用说处理改变的类型以及所有发生的各种JIT优化。然后,您必须考虑如何处理动态代码生成(比您想象的要多)和可能被垃圾收集的动态方法。

你还不如自己写。net主机+ JIT;但我怀疑你会说服任何人在知情的情况下运行

你当然不能修改已加载程序集的IL,因为. net一旦它被加载就会保护它。我想可能有一些讨厌的(强调讨厌的那里)低级应用程序完全绕过。net 可能能够破解内存中的IL;但是我怀疑加载执行时的内存表示与在磁盘上的表示相同;即使是在你"黑"它的时候,它可能已经被jit了,所以你的任何改变都不会有什么不同。

最终,. net是专门设计来防止你正在谈论的事情的。你可以将(静态)动态方法附加到现有的类型等上,以受益于可见性(如果你有权限的话)——但是修改加载的代码呢?没有。

正如其他几个答案所提到的,您通常使用磁盘上的程序集来完成此操作,并且有许多工具可以完成此操作。

但是对于强命名的程序集你要怎么做呢?您必须能够使用最初使用的相同强名称密钥来辞去它们;而且我怀疑你是否有这个权限

我可以编辑。net DLL的指令来添加我的方法调用。

你真棒!我不知道你是怎么做到的。

你认为是否有可能卸载目标DLL,编辑它,重新加载目标DLL?

。已加载的DLL无法卸载或重新加载。时期。

<标题>编辑

我被提醒,DLL可以卸载,如果你卸载整个AppDomain。但我相信这不是你想要做的。