C# 可能的修改加载的C DLL?

C# 可能的修改加载的C DLL?,c#,dll,portable-executable,C#,Dll,Portable Executable,在我开始工作之前,我只是想知道这是否可行。我可以将C代码注入并运行到正在运行的进程中,还可以枚举所有加载的.NET模块。另外,我可以编辑.NET DLL的指令来添加我的方法调用。显然,加载DLL时我无法编辑DLL,但当我尝试时,系统消息告诉我无法编辑它,因为它是在另一个进程中加载的。这让我相信,如果因为注入代码而处于相同的过程中,我可以编辑加载的DLL。我怀疑这是不对的 如果没有,您认为可以卸载目标DLL、编辑它并重新加载目标DLL吗?由于新的DLL将比原来大几个指令,系统是否会正确地重新映射其

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

如果没有,您认为可以卸载目标DLL、编辑它并重新加载目标DLL吗?由于新的DLL将比原来大几个指令,系统是否会正确地重新映射其所有值?我有一种感觉,如果可以卸载DLL、编辑它并将其重新加载到进程中,那么操作系统应该负责其余的工作

感谢您提供的任何见解和反馈

我可以编辑.NET DLL的指令来添加我的方法 电话

对你有好处!我不知道你是怎么做到的

您认为是否可以卸载目标DLL,编辑它, 并重新加载目标DLL

否。无法卸载或重新加载加载的DLL。句号

编辑 有人提醒我,如果卸载整个AppDomain,则可以卸载DLL。但我相信这不是你想做的

我可以编辑.NET DLL的指令来添加我的方法 电话

对你有好处!我不知道你是怎么做到的

您认为是否可以卸载目标DLL,编辑它, 并重新加载目标DLL

否。无法卸载或重新加载加载的DLL。句号

编辑
有人提醒我,如果卸载整个AppDomain,则可以卸载DLL。但我相信这不是你想做的。

是的,这是可能的

用您自己的委托替换任何.NET方法

见:

以下是视频:

这属于代码注入类别。很有趣的东西


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

是的,这是可能的

用您自己的委托替换任何.NET方法

见:

以下是视频:

这属于代码注入类别。很有趣的东西


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

一旦CLR将.Net DLL加载到进程中,删除它的唯一方法就是卸载所有使用该DLL的AppDomain实例。因此,我想可以通过执行以下操作来编辑加载的DLL

卸载包含DLL的所有AppDomain实例,从而删除DLL上的保留 在磁盘上编辑DLL或将修改后的DLL放在其他位置 创建一个新的AppDomain并加载修改后的DLL
一旦CLR将.Net DLL加载到进程中,删除它的唯一方法是卸载所有使用该DLL的AppDomain实例。因此,我想可以通过执行以下操作来编辑加载的DLL

卸载包含DLL的所有AppDomain实例,从而删除DLL上的保留 在磁盘上编辑DLL或将修改后的DLL放在其他位置 创建一个新的AppDomain并加载修改后的DLL
我认为,在不重启应用程序的情况下,你能做到这一点的唯一方法可能是点击JIT推出的机器代码;但是接下来你会有很多乐趣,找到你想要的东西,更不用说处理更改的类型以及所有发生的各种JIT优化了。然后,您必须考虑如何处理动态代码生成—它比您想象的要多,而且动态方法可以被垃圾收集

您不妨编写自己的.Net主机+JIT;但我怀疑你是否能说服任何人在知情的情况下运行它

您肯定无法修改加载的程序集的IL,因为.Net会在加载后保护它。我想可能是一些讨厌的强调讨厌的低级应用程序,完全绕过.Net,可能能够破解内存中的IL;但我怀疑加载执行时的内存表示是否与磁盘上的相同;即使是在你“黑”它的时候,它也可能已经紧张了,所以你的任何改变都不会有什么不同

最终,.Net是专门设计用来阻止您所说的操作的。如果您有权限,您可以将静态-动态方法附加到现有类型等,以从可见性中获益-但是修改加载的代码?没有

正如其他两个答案所提到的,您通常使用磁盘上的程序集来执行此操作,并且有许多工具可用于执行此操作

但是,对于强名称的程序集,您要做什么呢?你有
能够使用与最初使用的相同的强名称密钥让他们辞职;不知何故,我怀疑你是否有权访问它。

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

您不妨编写自己的.Net主机+JIT;但我怀疑你是否能说服任何人在知情的情况下运行它

您肯定无法修改加载的程序集的IL,因为.Net会在加载后保护它。我想可能是一些讨厌的强调讨厌的低级应用程序,完全绕过.Net,可能能够破解内存中的IL;但我怀疑加载执行时的内存表示是否与磁盘上的相同;即使是在你“黑”它的时候,它也可能已经紧张了,所以你的任何改变都不会有什么不同

最终,.Net是专门设计用来阻止您所说的操作的。如果您有权限,您可以将静态-动态方法附加到现有类型等,以从可见性中获益-但是修改加载的代码?没有

正如其他两个答案所提到的,您通常使用磁盘上的程序集来执行此操作,并且有许多工具可用于执行此操作



但是,对于强名称的程序集,您要做什么呢?您必须能够使用与最初使用的相同的强名称密钥放弃它们;不知何故,我怀疑您是否有权访问它。

只要从进程中删除所有引用的AppDomain,就可以卸载DLL是的,我知道。但是你是对的我需要提到AppDomain.PERWAPI还是PEWRAPI?是我目前正在使用的。似乎没有更好的API可用。只要从进程中删除所有引用的AppDomain,就可以卸载DLL是的,我知道。但是你是对的我需要提到AppDomain.PERWAPI还是PEWRAPI?是我目前正在使用的。似乎没有更好的API了。@David,原因很多:病毒、间谍软件、根工具包。别这么闭门造车!它不需要太恶意;例如,为某些东西编写自定义插件,而不是出于滥用目的,是完全可以的此外,许多编译器使用与我使用的相同的PE API。基本上,我必须记录单个C函数调用。yolksamurai-为什么不使用VS工具?或者让某人添加一些性能计数器;或者甚至是他们可以在调试版本中调用的日志伙伴界面?问题是我们必须监视数百个C程序集,编辑此C代码意味着我们必须重新签入每个已编辑文件的源存储库。其中一些C程序集是多年前的。这个项目的基本前提是在不涉及当前进程的情况下添加这个新的日志功能。@David,原因很多:病毒、间谍软件、根工具包。别这么闭门造车!它不需要太恶意;例如,为某些东西编写自定义插件,而不是出于滥用目的,是完全可以的此外,许多编译器使用与我使用的相同的PE API。基本上,我必须记录单个C函数调用。yolksamurai-为什么不使用VS工具?或者让某人添加一些性能计数器;或者甚至是他们可以在调试版本中调用的日志伙伴界面?问题是我们必须监视数百个C程序集,编辑此C代码意味着我们必须重新签入每个已编辑文件的源存储库。其中一些C程序集是多年前的。这个项目的基本前提是在不涉及当前流程的情况下添加这个新的日志功能。我认为你是对的。我应该注意,这段代码当然不会在除我之外的任何用户机器上运行。它将在通过自动化测试套件的机器上运行。还有其他一些不太理想的方法来完成这个项目,这些方法不如其他方法有用,但看起来这是一条死胡同。谢谢你提供的所有信息@yolksamurai——不幸的是。我为你可能在这里做了一些可怕的事情而道歉。事实上,你的场景非常常见,无论你的思维有多敏捷,解决方案都是一样的——修改DLL文件。我认为你是对的。我应该注意,这段代码当然不会在除我之外的任何用户机器上运行。它将在通过自动化测试套件的机器上运行。还有其他不太理想的方法来完成这个不太理想的项目
就像在不太有用的地方一样,但这种方式似乎是一条死胡同。谢谢你提供的所有信息@yolksamurai——不幸的是。我为你可能在这里做了一些可怕的事情而道歉。事实上,您的场景是一个非常常见的场景,无论您的思维有多敏捷,解决方案始终是相同的—DLL文件修改。