【问题标题】:Editing IL of C# assembly without source not reflecting changes upon execution在没有源的情况下编辑 C# 程序集的 IL 不反映执行时的更改
【发布时间】:2017-07-21 11:07:03
【问题描述】:

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

我过去曾这样做过,唯一的区别是这是使用 4.5 和最新 C# 编译器等的新版本。

这是场景:

我可以打开应用程序,正确阅读并编辑 IL。事实上,我可以在反射桌面(最新)、Telerik(我通常的首选)中使用 reflexil 毫无问题地编辑它,也可以使用更新的 reflexil,然后我还尝试了 dnSpy 最新的每晚 3.0.1。

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

我唯一能确定的可能再次不同的是更新的目标 dotnet 版本,它是在更新的 C# 编译器/版本中编译的。

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

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

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

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

【问题讨论】:

  • 这些程序集是否驻留在 GAC 中?
  • 您不必共享机密代码,但您可以随时共享您为此问题制作的代码。还有……你的问题是什么?如果您不想添加可以轻松解释您要达到的目标的代码,您可以添加粗体文本来分隔这堵文本墙。
  • 我想这是一个最简单的例子:将 IL 代码添加到 void main 中,除了弹出一个显示“TEST”的消息框外,什么也不做。一旦我编辑了所有 exe 应该做的事情,但它忽略了编辑,就好像在某处有所有旧代码的备份,它只是一个不在 GAC 中的 EXE。同样,如果我将编辑后的 ​​exe 拖回所有可以编辑 IL 的四个工具之一,它会显示用于消息框调用的新 C# 反编译指令及其 IL,并且没有实际运行的组织代码。
  • 我什至见过的最奇怪的事情,这就是为什么我认为这一定是根本错误的原因,也许新的 Rosylyn C# 编译的程序集根本不执行 IL 更改或类似的东西等。我部分希望我的理智有人会告诉我所有这些工具还不能编辑最新编译的程序集,但听起来情况并非如此。

标签: c# reverse-engineering decompiling


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    相关资源
    最近更新 更多