-2

如果是这样,我怎样才能保护我的代码不被反编译?
还是被反映?如果实际上两者是非常不同的。
.Net 框架的 Dotfuscator 之类的工具,它们是否可以帮助您的代码免于被反编译?这是否意味着我仍然可以反思它并看到它的内容??

4

2 回答 2

4

你也不能停下来。您可以使反编译程序返回难以理解和令人困惑的代码,但它仍然是有效代码,导致程序的功能与您的程序相同。做出细微的改变会更难,但并非不可能。这样做被称为混淆,这就是那些工具。

混淆器到处做一些事情,比如将所有变量名更改为无意义的字母数字值,执行各种代码重构,这些代码不会改变代码的工作方式,但只是以不同的方式做同样事情的事情(并且在某种程度上更难人类可以理解,但计算机无法理解)。他们还可以添加不做任何事情的代码,只是为了迷惑人等。不同的混淆器会做各种各样的事情,并且它们可能会有一些差异,例如,它们是否会意外引入错误,它们的作用是什么是关于已编译程序的大小,以及已编译程序与原始源的接近程度(当然,这有点主观)。

它对反射的作用是一样的,虽然反射和反编译是完全不同的。

于 2012-12-07T17:04:39.453 回答
4

首先,让我们回顾一下这两个术语之间的区别。

反射提供了在运行时发现程序集中类型信息的能力。这是框架的一部分,使诸如 IDE 中的代码完成、程序集之间的引用等功能成为可能。它也用于框架,例如 ASP.NET(您基本上可以在标记中引用类或 Web 控件并且实例将在运行时使用反射动态创建)。这也用于序列化,这是 Web 服务、WCF、Web 部件框架、会话状态、AJAX 等的核心。

反编译是将机器代码转换为更高级别的人类可读代码的术语。.NET 框架使用中间语言 (IL),它是一种与机器无关的低级语言,有点类似于汇编,减去 CPU 特定的东西,如寄存器。运行时本身实际上是获取此 IL 并通过称为 JIT'ing 的过程将其编译为实际特定于本地计算机的代码。显然,您的代码必须在 IL 中才能让运行时理解它(尽管有预编译或预 JIT IL 代码的过程)。

两者之间没有重叠。反射使用存储在程序集清单中的元数据,它不查看编译器生成的实际 IL 代码。您永远无法使用反射来推断方法的实际实现方式

话虽如此,有各种工具可以混淆 IL 代码,使其更难理解。一种流行的一种工具Dotfuscator

于 2012-12-07T17:12:46.470 回答