模糊:让你的代码远离易做图之眼
我们知道,Java编译源程序得到的是字节码,VS.NET编译源程序得到的是MSIL(Microsoft中间语言),这种编译方式称为“不完全编译”,特别容易被反编译或实施反向工程。与本机代码不同,不完全编译得到的中间代码完整地保留了变量、过程名称,从而使反编译得到的程序几乎与原始程序完全一样,只缺少原始程序的注释,其余内容差不多可以原封不动地还原出来。对于商品软件的开发者,高质量的反编译代码带来了很大的风险:算法可能被窃取和改造,程序代码可能被复制和更改。(即使单位内部使用的非商品软件,由于反编译造成的源代码泄漏也带来很大的威胁。例如,用户将很容易看到访问数据库的密码或程序嵌入的SQL命令。同样地,使用外单位托管服务器的网站也面临风险,一旦上载了ASP.NET应用的代码,托管单位的人就可能随意查看和更改程序代码)。
更让人担心的是,现在黑客或好奇的用户能够方便地得到各种反向工程工具。Microsoft本身就免费提供了一个MSIL反汇编器,称为ILDASM;这里有一个源代码开放的.NET反编译工具Anakrino;当然,还有其他许多厂商提供了商品化的反向工程工具。
一、修改变量名称
为防止这类反向工程的威胁,最有效的办法是模糊。(据《美国传统辞典》,“模糊”的意思是“使混乱,使糊涂迷惑,使过于混乱或模糊,使得难于感觉或理解”)。模糊工具运用各种手段达到这一目标,但主要的途径是让变量名字不再具有指示其作用的能力、加密字符串和文字、插入各种欺骗指令使反编译得到的代码不可再编译。
一个即将发布的Visual Studio版本(称为VS.NET 2003,代码名称Everett)将集成一个模糊工具,Microsoft建议用这个工具对.NET中间代码进行最后的处理。这个模糊器是另一个工具Dotfuscator的所谓Lite版。由Preemptive Solutions公司出品的Dotfuscator功能更强大,这家位于美国俄亥俄州东北部克利夫兰的公司最初开发Java代码的模糊技术。Dotfuscator模糊器利用一系列卓越的技术使反向工程徒劳无功,或者至少说使得反向工程很难进行。
Preemptive Solutions公司给它修改中间代码中变量名称的专利技术取了一个叫“超载感应”(Overload induction)的名称,VS.NET 2003带来的Lite版只有这种模糊功能。(模糊器永远不会改动原始的源代码,甚至根本不需要用源代码作为参考。)这种技术充分运用了VS.NET代码的特点:同一个标识符可同时运用于具有不同特征的类和方法;在不同的名称空间中,变量可以有相同的名字而不会冲突。
补充:asp教程,技巧与性能优化