各位编程小伙伴,你是否遇到过这样的问题:辛辛苦苦编写的代码,一旦开源,就容易被不法分子盗用?今天,我们就来聊聊.NET商业软件源码保护那些事儿。
在.NET开发中,保护源码是一项非常重要的工作。下面,我将从几个方面为大家介绍一些常见的代码保护技术,帮助大家更好地保护自己的劳动成果。
程序集混淆
CLR代码的运行是即时编译执行的,.NET编译器只是将源代码文件编译成中间语言,中间语言包含丰富的元数据。使用.NET Reflector/ILSpy/JustCode等反编译器几乎可以还原整个源代码,所以用.NET开发软件第一个要做的任务是混淆编译后的中间语言代码。
注册表保护
虽然.NET时代强调XCOPY部署,但很多程序依然依赖于注册表来做保护技术的基础。可以将自己想要隐藏的信息放到很深的注册表键中,通过字符串处理等方式,使得信息难以被轻易读取。
RSA签名
RSA签名技术可以生成两个密钥,私钥用于生成许可文件,公钥用于验证许可。私钥只存在于自己的电脑中,不会发布到程序中,只要私钥不泄露出去,这种加密方法是相当安全的。
参数保护
基于RSA签名技术,签名之后产生的字符串是只读的,在它的基础上我们可以增加许多控制点,比如可使用的用户数,过期时间,最大账套数等。
机器硬件识别
为了控制软件不会被客户随意拷贝分发,可以通过法律合同条文明确禁止,但通常这没有什么卵用,另一方面则必须做硬件识别。在生成许可文件之前,要依赖于客户的机器配置,将客户的机器硬件信息完整的保存到许可文件中,运行时逐条检测,发现有不一致的地方立刻退出应用程序。
序列号/注册码
相当多的软件还是采取这一传统的序列号保护方法,比如Windows Server 2012的注册码。一组看似无序的数字与字母的组合,对软件保护起了很重要的作用。
强名称
强名称不是一种代码保护技术,而是程序集标识技术。每个经过strong name签名后的程序集都是唯一的,在运行时可以验证这个文件的签名是否被改动过。
内存保护
Delphi XE采取了这种方法,运行时会生成一段验证代码,验证结束后代码销毁,因为验证在内存中进行,不会在硬盘上留下痕迹,破解的难度相对困难了很多。
源代码混淆
经过编译混淆后的.NET程序集,在运行时依旧可以被调试器附加调试。如果将源代码中的敏感字符串替换成乱七八糟的字符串,减少明文的出现,虽然降低了性能,但这样可以增加安全性。
本机代码
即将发布的Visual Studio 2015提供.NET Native功能,可将.NET代码编译为本机代码。这种保护方法的核心是许可验证逻辑放在本机代码中,直接编译成机器码,增加破解难度。
以上就是一些常见的.NET商业软件源码保护技术,希望能对大家有所帮助。更多精彩内容,请关注新派编程网(www.xjpbg.com)。
—— 新派编程网资深编辑 林译川 敬上
