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

时间:2009-10-05 08:50:29

标签: .net reflection reverse-engineering recompile

我有一个经常使用.NET程序。 这个程序有一个非常烦人的小错误,应用程序的开发人员无处可寻。

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

最简单的方法是什么?

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

更新:解决此问题:

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

  1. 使用C#-view查找反射器中的错误。然后切换到IL-view以查看在步骤5中应该查找的内容。
  2. 使用ildasm
  3. 打开要更改的程序
  4. 按转储并选择一个空文件夹,默认设置适用于我。
  5. 找到此文件夹中的.il文件,并使用任何texteditor打开
  6. 查找步骤1中的代码。
  7. 用新代码替换它,在我的情况下,我只需用简单的返回(IL_0000:ret)替换函数的所有内容。我认为所有修复都不会那么容易。
  8. 在步骤3的文件夹中打开命令窗口
  9. 运行ilasm,我还必须包含原始exe中的一些资源。这些是使用ildasm自动输出的。我使用这个ilasm像这样“C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ ilasm.exe”test.il /resource=test.res /output=FixedProgram.exe
  10. 完成!我现在只使用固定程序几分钟但它似乎像以前一样工作除了错误:))

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

6 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:2)

我认为没有比你刚才提到的更简单的方法。我实际上用ILDASM反编译了一个类似的程序,并且需要进行大量的修改。

如果有一种更简单的方法,我也想知道它。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

或者您可以尝试使用ILDasm之类的工具,它可以让您提取IL,进行更改(在MSIL中),然后重新组合(使用ILAsm)。显然,要做到这一点,你必须弄清楚如何在IL中编写你的变化,所以你可能不得不做一些实验来看看if语句是如何编译的。

我怀疑两者都会花费很多时间来重新编译才能运行。

祝你好运。

如果你让它发挥作用,回复并让我知道,我会对你是如何做到这一点非常感兴趣。

答案 4 :(得分:1)

试试这个.NET Reflector addin

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

答案 5 :(得分:0)

telerik Just Decompile(免费) 然后反射插入

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