您能否使用反编译工具Reflector获取应用程序的源代码,然后使用该源代码进行调试?

10

看起来你可以使用Reflector和Debugger的混合体,即使完全没有源代码也能够调试任何.NET应用程序。这可能吗?有人见过这种情况吗?

7个回答

5

Deblector插件是Reflector的一个扩展,可以让你直接从Reflector进行调试。


4

我很久以前尝试过这个,但没有成功。由于反射器现在已经有了很大的改进,所以我想今天可能是可能的。

如果你想一想,这实际上有点可怕。有人可以反编译你的应用程序并获得全部代码,然后修改它并分发他们自己的版本。所有这些都不需要开源。但另一方面,“他们”创造混淆器就是为了防止这种事情的发生。


6
这也是他们创建最终用户许可协议的原因。 - TraumaPony

3
Reflector Pro可以帮助您实现这一点!

3
我找不到链接,但有人使用反编译器源代码编译了一个可以进行调试的1.1框架版本。我尝试了2.0框架,发现错误太多,不值得花费时间。
如果你想尝试这个方法,请从像FileDisassembler这样的插件开始。在我的简短经验中,我发现有一些需要修复的错误,但并不是很严重。
对于一个小到中等规模的库来说,这种方法应该是可行的。

考虑到.NET Framework中有相当多的本地C实现,我认为这是非常不可能的。 - stephbu
我并不是在建议你可以进入C实现,但如果你重新编译.NET源代码,就没有理由不能进入调用本地代码的代码。 - Brownie

1

不,你需要属于你要调试的应用程序的符号文件(.PDB)。

Reflector允许你从IL转换为可读的.NET代码,但它仅保持意义而不是开发人员编写的确切代码。因此,即使你有来自Reflector的PDB和源代码,也无法进行匹配调试。

我想你可以使用Reflector的源代码输出创建一个.NET项目并生成自己的版本进行调试。不过那通常会非常麻烦,在.NET Framework的情况下,Microsoft发布了调试信息供任何感兴趣的人使用。

我记得曾经有一个用于在Reflector中进行调试的插件,但我无法使其正常工作。

配置Visual Studio以调试.NET Framework源代码
MSDN:PDB文件


1

我以前见过并做过这件事。我用它来向我的老板展示我们的应用程序并没有他想象中那么安全。拿了一个DLL,得到了源代码,然后嘭——他几乎心脏病发作了。

有些情况下,.Net Reflector会出现故障,但很难做到这一点——我知道,因为我已经积极尝试过了。好的混淆器会使代码变得如此难以管理/阅读(例如通过重载“a”函数来执行基于参数的大量不同操作),以至于查看源代码对你没有任何帮助,但你仍然可以进行调试——祝你好运弄清楚发生了什么。


0

在较大、更复杂的应用程序中,特别是在使用了许多最近的结构(如lambda和初始化器)时,这是可能的,但不是非常实用的(你会得到一堆包含美元符号的变量名,如CS$4$0000,必须手动修复)。即使是简单的switch语句也会导致一些非常丑陋的代码,其中充满了Reflector中的goto语句。

我在将代码反编译为MSIL并在调试模式下重新编译方面取得了更多的成功。然后,您可以在IL文件中放置断点,并在VS中使用所有常规调试器功能。MSIL一开始看起来有点吓人,但您很快就能掌握它。

这篇优秀的文章解释了如何做到这一点: http://www.codeproject.com/KB/dotnet/Debug_Framework_Classes.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接