使用.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系列軟件太流行了,可以很輕松的找到可用的版本。很少會被他的許可難住,不過這種產生許可的方式,值得學習和研究。