在没有源代码的情况下编辑 C# 程序集的 IL 不会反映执行时的更改

问题描述 投票:0回答:2

好吧,我有一个应用程序,我的任务是编辑该源代码不可用,并且由于保密性,我无法共享该应用程序/代码 - 我意识到这使得此类问题具有挑战性,但因为我在相信它之前已经做到了这一点成为我忽略的简单事物。

我过去曾执行过此操作,唯一的区别是这是使用 4.5 和最新的 C# 编译器等的新版本。

场景如下:

我可以打开应用程序,正确阅读并编辑 IL。事实上,我可以在 Reflection 桌面(最新)、Telerik(我常用的)中使用 reflexil 编辑它,也可以使用更新的 reflexil,然后我还尝试了 dnSpy 最新的 nightly 3.0.1。

哎呀,以为我失去了理智,我什至使用旧的 GreyDragon 打开它,还编辑了一些 IL,保存了 exe 程序集,甚至直接在入口点 main 中的 IL 仍然不会按更改后的方式执行,而是按照之前未更改的原始方式执行,但是在所有这些工具中,如果我重新打开之前编辑和保存的程序集 exe,它在所有情况下都会正确显示更改,无论是在反编译的 C# 中还是在相应的 IL 指令中。

我能指出的唯一可能再次不同的是较新的目标 dotnet 版本,并且它是在较新的 C# 编译器/版本中编译的。

那么,最新版本的 C# Rosylyn 等是否有任何原因会阻止以前工作的 IL 编辑方法(以及几乎所有可以进行 IL 编辑的工具)现在工作,几乎就像辅助指令备份表等那样持有将要执行的未经编辑的原始副本?

或者,程序集再生的特定“设置”是否会导致此行为?

在开始尝试描述更详细的细节之前,让我们先了解一下我可能缺少的一些基本障碍。

再次抱歉没有实际的代码可以分享,但希望真正的大师会知道发生了什么并有想法。谢谢!

c# reverse-engineering decompiling
2个回答
1
投票

发布我自己的答案简直不敢相信我错过了这个。

答案是,即使它没有作为 GAC 中的程序集安装,此应用程序的行为也发生了变化,我错过了一个进程以某种方式对其运行 NGEN.EXE 以将 NI 本机映像编译为本机映像并安装它 - 然后包含有问题的该死的机器代码的缓存版本 - 正是我的直觉所说的正在发生的事情,我只需要找到“备份副本”。


0
投票

根据科林如何回答他的问题,你会怎么做?

© www.soinside.com 2019 - 2024. All rights reserved.