.net - 修复 .NET 程序中的错误,无需访问源代码

标签 .net reflection reverse-engineering recompile

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

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

什么是最简单的方法来做到这一点?

我曾尝试在反射器中使用导出功能,但它似乎工作不完美。例如,缺少许多 using 指令,并且来回转换为整数的枚举也没有正确导出。我相信我可以通过一些工作来解决这个问题,但我想知道是否有更简单的方法来做到这一点。

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

该程序是单个文件可执行文件

  • 使用 C#-view 查找反射器中的错误。然后切换到 IL-view 以查看您应该在步骤 5 中查找的内容。
  • 用ildasm打开你要改的程序
  • 按转储并选择一个空文件夹,默认设置对我有用。
  • 在此文件夹中找到 .il 文件并使用任何文本编辑器打开
  • 找到步骤 1 中的代码。
  • 用新代码替换它,在我的情况下,我只需要用简单的返回值(IL_0000:ret)替换函数的所有内容。我不认为所有的修复都会这么容易。
  • 在第 3 步的文件夹中打开命令窗口
  • 运行 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 之类的文件夹,其中存储了所有设置。我的新可执行文件创建了一个像这样的新文件夹,末尾有不同的随机字母和默认设置。要复制您之前使用的设置,只需将旧文件夹的所有内容复制到新文件夹即可。

    最佳答案

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

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

    我怀疑两者都需要相当多的困惑才能使重新编译工作。

    祝你好运。

    如果你让它起作用,请回帖并告诉我,我会对你是如何做到的很感兴趣。

    关于.net - 修复 .NET 程序中的错误,无需访问源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1518891/

    相关文章:

    .net - 丢失的 VB6 源代码;是否可以覆盖另一个对象中的方法?

    .net - NEST 7:如何获取每个文档的出现编号?

    c# - MVC2 C# TextAreaFor 包含 ', ,'

    c# - 如何获取 Array.IndexOf<string>(string[], string) 方法信息?

    java - 反射如何影响 Perm 大小?

    c - 汇编指令阅读,leaq

    java - Hibernate 逆向工程未生成正确的域代码 STS

    c# - XSD 数据集与 Oracle 数据库

    c# - 当只有一个参数c#时,我可以通过反射创建一个实例并指定重载的 "params"构造函数吗?

    javascript - 检查 javascript 钩子(Hook)和调用