.NET程序员应该理解的几种软件保护方法 辛苦开发的程序需要建立有效的保护机制
使用.NET开发程序,因为元数据存在于程序集中,可以轻易的被反编译成源代码。在分发给客户之间,会应用加密软件混淆程序集,这样让程序集被反编译时,
理解起来困难一些,增加一点破解难度。以下列举我常见到的几种保护方法,可应用于实际的产品保护。
方法一 以Red Gate的SQL Toolbet为代表的 需要连接到服务器端进行验证
Red Gate开发的SQL系列工具非常有名气,比如著名的SQL Prompt,可以在SQL Server Management Studio实现智能提示功能。每当有新的可用的版本
出现(希望你可以理解我说的意思),它成为必收藏的工具之一。它的保护机制比较典型,客户下载并安装试用版软件,超过试用期限后,需要连接到
服务器进行激活验证,否则退出程序。
这种情况下网络连接必须可用。然而由于种种原因,有些机器是不能连接到互联网上的,或是因为开发服务器,资料和数据比较宝贵,或是因为开发人员
不允许上网,没有网络防问权限。这种情况下,它也提供了一种验证机制,可以将验证信息打包,通过邮件或是即时通讯软件发送到官方,
获取一个类似于注册码的字符串,如下图所示
这两种方式配合起来,这种类型的验证保护机制就做的相对完善,也比较人性化。
方法二 企业管理软件类 ERP 许可授权文件
在企业管理软件中,经常要涉及软件许可(license)。无论是按站点收费(用友),还是按功能收费(金蝶),或是按用户用量收费, 这种方法的灵活性高。
用户从官方网站或是CD盘中得到的是正式的安装程序文件,需要一个license文件才能激活进入系统。根据用户的实际购买情况,产生不同的license文件,
在系统运行时,会检测文件是否有效,是否有授权,全部的秘密都在生成的这个license文件,以下面的license文件所示
<?xml version="1.0" encoding="utf-16"?> <SolutionLicense xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <RegistrationName>Enterprise Solution Limited</RegistrationName> <Version>2.2</Version> <MaxUser>100</MaxUser> <MaxViewer>100</MaxViewer> <MaxDatabase>4</MaxDatabase> <WithHaspKey>false</WithHaspKey> <AllowInstallOnVirtualMachine>true</AllowInstallOnVirtualMachine> <IssuedDate>2013-05-27T15:55:15.3440758+08:00</IssuedDate> <ExpiryDate>2013-06-26T23:59:59.997</ExpiryDate> <LicenseType>Internal</LicenseType> <HardwareFingerprint>+MV/ImkUxQV3RWDrD4rso4dplxmr5WHDDJ37WdwE09ogGhACKWjp+tWmDB5RVqfu/
tqx5i1p15g7t5ChynBwR0UKxNaSb1WyG4kdt5etndm7wg45DWzDpIryKLCYVQ4SuE3ykmXTR8NgTsYriI0CCP1DC5YrCiGfbAjNJ8zwC5A=wfUHYiIpI2DQ/kSXyM6TMx
0pCUWqa9V/UGukBPcAhafmeseTEBKeJ1Fdqwoie8QuV3Zy8GzGz9DX9d43QXYKMKpHzdLG6CL848a4MzRw1nmQ9s7i+kB/+AjPM+yaJGFp8EpxYROfjJoDgat+ES1KSimh
t5VNB5AL2FY1QLwqoiOjk6q/ClCzsEB6ieLMHsS0HLmc=GQQTPgTgRuI4NsVLZ803HhUP+Lf/cG9OqtOreEWdMSRbuYIJKCyp8SDBygH7B+Omt1k3nEvpt3FUyMR+yyDNRql
qhAH7/KtVcJwvrs9Ye7LywpwcGKSJcJot/jTKKagSFn20fYXjZROIpxfc8tsnxBXpkchYSrTMJb+93EnLOUg=ACvXKe/WfGEvjyrUIm+BVZty0NfxemFLeQDZtdQnsLnfjDcK
FP3fhLY3dcYvDMJJmJx4cnYtp+8kabxxPr1M5i6qosEUULyIGb6kjyWjGQJ7M1/JEO8J5oZv/3PRLs307FO69WpIZ36O4Y=</HardwareFingerprint> <AdditionalInformations /> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC
-xml-c14n-20010315" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI=""><Transforms><T
ransform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /></Transforms><DigestMethod Algorithm="http://ww
w.w3.org/2000/09/xmldsig#sha1" /><DigestValue>RUdHeihpzCcTda4kH9VPm/n7aBE=</DigestValue></Reference></SignedInfo><Sig
natureValue>OHBWoz1WjG2D2Pfno9mSOuHg9oFRaSTYjw7w9oJh0NTtBYbMhb5CLwZz5WXXpfYsghnax4RfqoUt3edvYU2b1vu3//0YaQHkY+qbczrBiX
3svfKB+DSSm+WZvyruucnTsTp39RKutcim+fhAt/wDA2Iarwdm1/ztPAhoOi+zzbA=</SignatureValue></Signature></SolutionLicense>
license文件的格式是文本文件,以方便查看。上面的许可文件中,我给了100个用户,4 个帐套的权限。再运用SignedXml对文件内容进行签名,
阻止篡改。此外,如果想限定用户,还可以加上机器标识(hardware fingerprint),如果检测到被收取的license文件,不在被授权的机器上运行,
也会抛出异常,终止程序。
还有一个许可生成工具,它的原型看起来像这样
再来说明一下,如何破解这种加密。首先,如果程序集有强签名(strong name),需要找一个工具,把它的签名去掉,其次,找到算法验证license.xml文件的地方,把它的public key替换成自己生成的public key,再写一个以private key生成的licnese生成工具,生成license文件,同时替换自己修改过的验证程序集文件,即可让程序验证成功
上面所说的破解过程,是比较理想的情况。如果程序集有strong name,而且在程序集中有验证strong name是否存在,strong name是否匹配作者生成的public token,这种情况下,要生成一个strong name,替换作者生成的和已经写入到程序集中的public token。其次,要可以反编译程序集,著名的工具Red Gate Reflector, ILSpy,dotPeek,都可以做到反编译程序集。如果程序集有加壳,还应该去壳。
方法三 序列号注册码
经典的源代码编辑软件UltraEdit至今还保持这种保护方法。在首次运行时,需要输入注册码
一个用户名和注册码,可以让多台机器的试用版软件变成正式版。这个问题,在我们国家是普遍存在的。许可一般是Single PC 许可,而我们常常是只要来自于官方下载,又有官方的许可文件或是序列号,即把它当成正版,其实这种情况下,也非正版。仅仅是输入注册码,不需要连接到网络验证服务器,如果想进一步连接到服务器做验证,还需要网络连接。
关于网络连接的额外话。Windows 自Windows 7开始,为了激活它,就必须要有网络连接可用。对于新买的机器,想装旧的Windows Server 2003,死活都找不到网卡驱动,无法连接到网络上去,无法激活,只好装最新的系统。有个小小的建议,如果你的机器是Windows 7以下的,可以考虑备份一下你手头的驱动程序,网卡,显卡,主板芯片组。这些驱动以后会越来越难找,厂家也直接拒绝提供旧系统的驱动(Windows 2003,XP),让你被迫无奈只能用Windows 7或是更新的系统。硬件制造设备厂商也是有预谋的逼迫你对旧机器改朝换代啊。
方法四 license to license2 双重许可验证
以著名的.NET加密软件.NET Reactor为代表,要通过它的许可验证需要两次许可文件。
购买正版软件后,软件供应商会给出一个license.license 文件。打开dotNET_Reactor.exe,菜单->Help-》 Registeration ,在线获取另外一个License文件, 点击超链接进入官方网站:查收邮件,下载真正的License
打开dotNET_Reactor.exe,菜单->Help-Registeration ,注册,软件才成为正式用户。
回想一下这个注册过程,它会产生一个本机的硬件标识,把这个复制到网页中去才能激活软件,从而得知这个软件需要配合硬件,即使有序列号,许可文件,但是硬件标识不相同,也是无效的license文件。
硬件标识通常会写到license许可文件中,这是唯一可以动手脚,但又不会出问题的地方。硬件标识写注册表,可以被用户导出,再导入到其它机器上,硬件表示可以写到系统隐藏文件中,用户误删除会导致出错。
方法五 微软批量激活工具
以Office 2010为代表,它的批量激活工具主界面如下,控制台界面风格,小巧强悍
再比如杀毒软件卡巴斯基,对企业批量授权。也是实现批量生成许可的方式。
这种授权方法的好处是,可以被命令行调用。在域管理的企业基础架构中,只需要域管理员修改一下域策略,在每台客户端登录域时,执行一个脚本文件即刻激活企业内所有的软件许可。
我理解的这种加密方法,也是生成一个许可文件。因为Office系列软件太流行了,可以很轻松的找到可用的版本。很少会被他的许可难住,不过这种产生许可的方式,值得学习和研究。