11

我有一个我经常使用的程序,它是用 .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的文件夹,其中存储了所有设置。我的新可执行文件创建了一个像这样的新文件夹,最后带有不同的随机字母并使用默认设置。要复制您之前使用的设置,只需将旧文件夹的所有内容复制到新文件夹即可。

4

6 回答 6

8

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

于 2009-10-05T09:13:21.940 回答
2

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

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

于 2009-10-05T08:57:54.607 回答
2

您可以使用 ILDASM 和 ILASM 进行往返。虽然这对于大的变化是不切实际的,但我认为它应该在你的情况下起到作用。

于 2009-10-05T08:58:45.010 回答
1

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

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

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

祝你好运。

如果你让它工作,发回并让我知道,我会对你是如何做到这一点很感兴趣的。

于 2009-10-05T08:59:54.800 回答
1

试试这个 .NET Reflector插件

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

于 2009-10-05T09:01:25.190 回答
0

telerik Just Decompile (free) 然后 reflexil 插件

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

于 2012-11-27T13:06:46.887 回答