步骤 1 -- 使用反汇编程序
.NET Framework SDK 附带了一个称为 ildasm 的反汇编程序实用工具,它允许您将 .NET 程序集反汇编为 IL 程序集语言语句。若要启动 ildasm,请确保 .NET Framework SDK 已经安装并列在您的路径中,然后在命令行上键入 ildasm。
注意:如果这不起作用,并且您已安装了 Visual Studio,则说明 ildasm 的路径可能有误。若要打开 Visual Studio 命令提示符,请从“开始”菜单选择“Visual Studio [版本]”|“Visual Studio Tools”|“Visual Studio [版本] 命令提示符”。键入 ildasm。
- 选择“文件”|“打开”菜单并浏览至:
C:\Program Files\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\bin\Debug
- 然后选择 GettingStarted.exe。单击“打开”。将出现被反汇编的程序集的视图:
.jpg)
- 若要将当前所示的未模糊处理的 HelloWorld 应用程序与经模糊处理的版本进行比较,请启动 ildasm 的另一副本。这次浏览至
C:\Program Files\PreEmptive Solutions\Dotfuscator Professional Edition 4.0\samples\GettingStarted\Dotfuscated
- 然后选择 GettingStarted.exe。单击“打开”。
.jpg)
将每个 ildasm 窗口并排放置。比较两个视图有何差异。
可以看到,未模糊处理的反汇编版本包含相当容易理解的方法名。例如,基本上可以认定在单击 Converse 按钮时调用的是 ConverseButton_Click: void (object, class [mscorlib]System.EventArgs) 方法。现在看一下模糊处理的版本。单击 Converse 按钮时调用哪个方法?很难判断。另请注意,SaySomething 方法不见了。该方法被移除了,因为代码中的任何地方都未用到该方法。
从原始程序集中双击 SayHello:string() 方法,并从模糊处理的程序集中双击 a:string()。这两个方法实际是相同的;但是,如果进一步检查反汇编的 IL 代码,您将注意到这些字符串在模糊处理的版本中已经过加密,使得代码更难阅读。例如,请在未模糊处理的版本中找到下面一行:
IL_0000: ldstr "Hello, my name is "
现在查看模糊处理的版本,并尝试查找上面的字符串。如果找不到该字符串,那是因为它已被加密并且可能显示如下:
IL_0000: ldstr bytearray (09 42 26 44 29 46 2B 48 26 4A 67 4C 6D 4E 22 50
28 52 73 54 3B 56 36 58 34 5A 3E 5C 7D 5E 36 60
12 62 43 64 )
您可以想像,对于试图对代码进行反向工程处理的人而言,这是多么令人费解,尤其是对于更加复杂的应用程序更是如此。
步骤 2 -- 反编译
如果您现在认为您的源代码将只能由少数实际懂得 IL 汇编语言的技术人员访问,那么请再考虑一下。您可以做进一步的试验,使用 Reflector 和 Anakrino 之类的反编译器从我们的应用程序重新创建源代码。这些实用工具可将 .NET 程序集直接反编译为 C#、VB .NET 或 C++ 之类的高级语言。
本节我们将使用两个可免费获得的反编译器:
- Reflector for .NET,http://www.aisto.com/roeder/dotnet/
- Anakrino(GUI 版本)/ Exemplar(命令行版本),http://www.saurik.com/net/exemplar/
对经过 Dotfuscator 处理的 GettingStarted.exe 文件运行 Anakrino/Exemplar 将产生以下错误:
Exemplar.exe 遇到了问题,需要关闭。我们对由此给您带来的不便深表歉意。
对经过 Dotfuscator 处理的 GettingStarted.exe 文件运行 .NET Reflector 并尝试检查 a() 之类的方法将引发以下异常:
此项可能已进行模糊处理,无法转换。 System.NotSupportedException: 无法在以下位置解析局部变量“Label_0047”。 Reflector.CodeModel.Memory.GotoStatement.Resolve() _12.VisitBlockStatement(IBlockStatement statement) _111.VisitStatement(IStatement value) _119.VisitMethodDeclaration(IMethodDeclaration value) _125.VisitMethodDeclaration(IMethodDeclaration value) _126.VisitMethodDeclaration(IMethodDeclaration value) _123.VisitMethodDeclaration(IMethodDeclaration value) _146._1(Boolean)
因此,Dotfuscator Professional 能够成功阻止两种主要的反编译器对经过 Dotfuscator 模糊处理的代码进行反向工程。
© 2002-2007 PreEmptive Solutions. 保留所有权利。