如果是这样,我如何保护我的代码不被反编译? 还是被反映?实际上两者是非常不同的 像.Net框架的Dotfuscator这样的工具,它们是否有助于您的代码被反编译?这是否意味着我仍然可以反思并看到它的内容??
答案 0 :(得分:4)
你也不能停止。你可以这样做,以便反编译程序返回难以理解和令人困惑的代码,但它仍然是有效的代码,导致程序的功能与你的相同。做出微妙的改变将是更难,但并非不可能。这样做称为混淆,这就是那些工具。
混淆器会做一些事情,例如将所有变量名称更改为无意义的字母数字值,执行各种不会改变代码工作方式的代码重构,但只是以不同方式执行相同操作的事物(并且是某种程度上人类难以理解,但不是计算机)。他们还可以添加不做任何事情的代码,只是为了让人混淆等等。不同的混淆器会做各种不同的事情,他们可能会有一些差异,比如,他们是否意外地引入了bug,它们的影响是什么是编译程序的大小,以及编译程序与原始源的接近程度(授予的,有点主观)。
它对反射具有相同的效果,尽管反射和反编译完全不同。
答案 1 :(得分:3)
首先,我们来看看两个术语之间的区别。
Reflection 提供了在运行时发现程序集中的类型信息的功能。这是框架的一部分,并且可以实现诸如IDE中的代码完成,程序集之间的引用等功能。它也可以在框架中使用,例如ASP.NET(您可以在标记中基本引用类或Web控件)并且将使用反射在运行时动态创建实例。这也用于序列化,它是Web服务,WCF,Web部件框架,会话状态,AJAX等的核心。
反编译是将机器代码转换为更高级别的人类可读代码的术语。 .NET框架使用中间语言(IL),这是一种与机器无关的低级语言与汇编有点类似,减去CPU特定的事情,如寄存器。运行时本身实际上是通过一个名为JIT的过程将IL编译成实际特定于本地机器的代码。显然,您的代码必须在IL中,以便运行时理解它(尽管有预编译或预JIT IL代码的过程)。
两者之间没有重叠。 Reflection 仅使用存储在程序集清单中的元数据,它不会查看编译器生成的实际IL代码。您永远无法使用反射来推断方法的实际实现方式
据说,有各种工具来混淆IL代码,使其更难理解。一种流行的工具Dotfuscator。