【问题标题】:Fix bugs in .NET program without access to source在不访问源代码的情况下修复 .NET 程序中的错误
【发布时间】:2010-12-03 21:12:32
【问题描述】:

我有一个我经常使用的程序,它是用 .NET 制作的。 该程序有一个非常烦人的小错误,并且找不到该应用程序的开发人员。

我在反射器中找到了问题的位置,只想在这里添加一个if语句,然后重新编译程序。

最简单的方法是什么?

我曾尝试在反射器中使用导出功能,但它似乎无法完美运行。例如,很多 using-directives 都丢失了,并且来回转换为 int 的枚举也没有正确导出。我相信我可以通过一些工作来解决这个问题,但我想知道是否有更简单的方法来做到这一点。

更新:通过这样做解决了它:

程序是一个可执行文件

  1. 使用 C#-view 查找反射器中的错误。然后切换到 IL-view 以查看您应该在第 5 步中查找的内容。
  2. 用 ildasm 打开要更改的程序
  3. 按转储并选择一个空文件夹,默认设置对我有用。
  4. 在此文件夹中找到 .il 文件并使用任何文本编辑器打开
  5. 找到步骤 1 中的代码。
  6. 用新代码替换它,在我的例子中,我只需用简单的返回 (IL_0000: ret) 替换函数的所有内容。我不认为所有的修复都会这么简单。
  7. 在步骤 3 的文件夹中打开命令窗口
  8. 运行 ilasm,我还必须包含原始 exe 中的一些资源。这些是使用 ildasm 自动输出的。我像这样使用这个 ilasm "C:\Windows\Microsoft.NET\Framework\v2.0.50727\ilasm.exe" test.il /resource=test.res /output=FixedProgram.exe

完成!我现在只使用了几分钟的固定程序,但它似乎像以前一样工作,除了错误:)

我在应用程序设置方面也遇到了一些问题。在 %appdata%\ProgramName 中有一个名为 ProgramName.exe_Url_qa5i3p42aomuvoxpuxuficvbmngksgjs 之类的文件夹,其中存储了所有设置。我的新可执行文件创建了一个像这样的新文件夹,最后带有不同的随机字母并使用默认设置。要复制您之前使用的设置,只需将旧文件夹的所有内容复制到新文件夹即可。

【问题讨论】:

    标签: .net reflection reverse-engineering recompile


    【解决方案1】:

    我认为没有比您已经提到的更简单的方法了。我实际上用 ILDASM 反编译了一个类似的程序,并且花了很多时间。

    如果有更简单的方法我也想知道。

    【讨论】:

      【解决方案2】:

      您可以使用 ILDASM 和 ILASM 进行往返。虽然这对于大的更改是不切实际的,但我认为它应该可以解决您的问题。

      【讨论】:

        【解决方案3】:

        如果程序很简单,理论上你可以使用反射器将整个程序反转回C#,进行更改并重新编译。

        或者,您可以尝试使用ILDasm 之类的工具,它应该允许您提取 IL、进行更改(在 MSIL 中)并重新组装(使用 ILAsm)。显然,要做到这一点,您必须弄清楚如何在 IL 中编写您的更改,因此您可能需要做一些实验来查看 if 语句是如何编译的。

        我怀疑两者都需要相当多的时间才能让重新编译工作。

        祝你好运。

        如果你让它工作,回帖告诉我,我会对你是如何做到这一点很感兴趣的。

        【讨论】:

        • 感谢您接受这个作为 Erik 的答案,听起来这对您有用,但对于阅读此内容的其他人,请务必查看 Reflexil (sebastien.lebreton.free.fr/reflexil)(如 Jb Evain 的回答中所述)为这将让您直接使用 C# 代码对程序集进行更改,而不必担心 IL,并保存程序集的修补版本,所有这些都来自反射器非常容易。我强烈建议检查一下,这是一个很棒的工具。
        【解决方案4】:

        试试这个 .NET 反射器addin

        这对我有用。它有时会创建无法编译的“编译器生成”标签。但是您可以轻松地手动解决此问题。

        【讨论】:

          【解决方案5】:

          我建议你使用Reflexil 插件来处理Reflector。它允许您轻松修改程序集,甚至可以用您自己的 C# 代码替换方法体。

          【讨论】:

          • 现在,如果它像网站上所说的那样有效,那就太棒了。 +1。塞西尔看起来棒极了。 “即时修改程序集”。哇!我还能说什么。继续出色的工作 Jb。
          • 谢谢西蒙。 Reflexil 的所有功劳都归功于我的朋友 Sébastien Lebreton,他在连接 Cecil 和 Reflector 方面做得非常出色。
          • 查看以下示例。实际上,我发现很难找到重新保存程序集的选项。 cumps.be/reverse-engineering-with-reflector-and-reflexil
          【解决方案6】:

          telerik Just Decompile (免费) 然后是 reflexil 插件

          2 分钟以上的工作(我已经尝试了所有其他方法!)

          【讨论】:

          • 你能添加更多关于如何使用两者的细节吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-09
          • 1970-01-01
          • 1970-01-01
          • 2020-09-22
          相关资源
          最近更新 更多