前言
本文將使用一個NuGet公開的組件技術來實現機器碼注冊碼功能開發,提供了一些簡單的API,來方便的實現。
在Visual Studio 中的NuGet管理器中可以下載安裝,也可以直接在NuGet控制台輸入下面的指令安裝:
Install-Package HslCommunication
NuGet安裝教程 http://www.cnblogs.com/dathlin/p/7705014.html
聯系作者及加群方式(激活碼在群里發放):http://www.hslcommunication.cn/Cooperation
Summary
在我開發完成一個軟件后,尤其是要發放給別人使用的軟件時,為了防止軟件被惡意使用,有時候會采用注冊機的機制來實現,比如我們會獲取一串唯一的機器碼,然后進行加密運算,程序在激活前就檢測注冊碼是否正確,正確就啟動程序,然后就啟動失敗,為了防止激活碼被破解,通常都需要對程序加一層殼,也即是混淆,這樣就能防止99%的開發者來破解注冊碼,要是真有大神願意破解你的程序,只能證明你的程序很值錢了,即使大神破解,也免不了查出來要承擔相應的法律責任。
Reference
CRC組件所有的功能類都在 HslCommunication.BasicFramework 命名空間,所以再使用之前先添加
using HslCommunication.BasicFramework
How to Use
情景一:程序啟動驗證注冊碼,如果注冊碼存在且正確,窗口繼續運行,否則彈出輸入注冊碼窗口,除非輸入了正確的注冊碼,否則窗體退出
那么我們就需要在Form的Load方法中進行驗證操作,先在Form下實例化授權類,然后需要提供一個你自己的從機器碼到注冊碼的生成規則,實質上就是一個加密方法,你也可以參照下面的例子:
private HslCommunication.BasicFramework.SoftAuthorize softAuthorize = null; private void FormRegisterTest_Load(object sender, EventArgs e) { softAuthorize = new HslCommunication.BasicFramework.SoftAuthorize(); softAuthorize.FileSavePath = Application.StartupPath + @"\Authorize.txt"; // 設置存儲激活碼的文件,該存儲是加密的 softAuthorize.LoadByFile(); // 檢測激活碼是否正確,沒有文件,或激活碼錯誤都算作激活失敗 if (!softAuthorize.IsAuthorizeSuccess(AuthorizeEncrypted)) { // 顯示注冊窗口 using (HslCommunication.BasicFramework.FormAuthorize form = new HslCommunication.BasicFramework.FormAuthorize( softAuthorize, "請聯系XXX獲取激活碼", AuthorizeEncrypted)) { if (form.ShowDialog() != DialogResult.OK) { // 授權失敗,退出 Close(); } } } textBox1.Text = softAuthorize.GetMachineCodeString(); // 顯示出機器碼,情景二用 } /// <summary> /// 一個自定義的加密方法,傳入一個原始數據,返回一個加密結果 /// </summary> /// <param name="origin"></param> /// <returns></returns> private string AuthorizeEncrypted(string origin) { // 此處使用了組件支持的DES對稱加密技術 return HslCommunication.BasicFramework.SoftSecurity.MD5Encrypt(origin, "12345678"); }
在沒有激活過的情況下,運行窗體就會顯示注冊窗口。
那么現在我們已經有機器碼了,那么注冊碼怎么來呢?還記得上面的代碼有個方法呢?就是AuthorizeEncrypted方法,只要吧這串機器碼當作參數傳入就可以獲取到注冊碼,就可以填進去激活軟件了。如果你填了錯誤的激活碼,或是關閉了注冊窗口,這個窗口就會退出。
在此處我的機器碼如上面所示,執行這個方法后的注冊碼為:B384A9552ACFABF3CF839FB8A7CEAB123A264457BA0C176AE13F412CDD76C338,如果你的窗口為主窗口,那么授權功能已經寫完了,假設你把軟件分發出去了,拷貝給別人了,別人運行后就會彈出輸入注冊碼,你就叫他把機器碼發給你,你在寫個窗口計算出注冊碼發給對方,對方就可以運行軟件了。
情景二:不提供手動申請注冊碼,直接在軟件里寫死。每次分發軟件都需要對方先提供機器碼(你可以做個超級簡單的exe,就只有顯示機器碼的功能),編譯號軟件再進行分發,這種更難破解。
但是也犧牲了一定的靈活度,在窗口載入中的代碼如下:
private HslCommunication.BasicFramework.SoftAuthorize softAuthorize = null; private void FormRegisterTest_Load(object sender, EventArgs e) { softAuthorize = new HslCommunication.BasicFramework.SoftAuthorize(); //softAuthorize.FileSavePath = Application.StartupPath + @"\Authorize.txt"; // 設置存儲激活碼的文件,該存儲是加密的 //softAuthorize.LoadByFile(); // 檢測激活碼是否正確,沒有文件,或激活碼錯誤都算作激活失敗 //if (!softAuthorize.IsAuthorizeSuccess(AuthorizeEncrypted)) //{ // // 顯示注冊窗口 // using (HslCommunication.BasicFramework.FormAuthorize form = // new HslCommunication.BasicFramework.FormAuthorize( // softAuthorize, // "請聯系XXX獲取激活碼", // AuthorizeEncrypted)) // { // if (form.ShowDialog() != DialogResult.OK) // { // // 授權失敗,退出 // Close(); // } // } //} // 此處示例程序的機器碼為:2E4C8EB0EBB8C4551C49AC277 // 直接進行判斷,允不允許運行 if (!softAuthorize.CheckAuthorize("B384A9552ACFABF3CF839FB8A7CEAB123A264457BA0C176AE13F412CDD76C338", AuthorizeEncrypted)) { // 檢測授權失敗 Close(); } textBox1.Text = softAuthorize.GetMachineCodeString(); } /// <summary> /// 一個自定義的加密方法,傳入一個原始數據,返回一個加密結果 /// </summary> /// <param name="origin"></param> /// <returns></returns> private string AuthorizeEncrypted(string origin) { // 此處使用了組件支持的DES對稱加密技術 return HslCommunication.BasicFramework.SoftSecurity.MD5Encrypt(origin, "12345678"); }
目前的激活方式是基於本地的單機激活,如果需要采用聯網激活的方式,那么也是非常容易實現的,在程序啟動的時候,把機器碼通過網絡發送給服務器,根據服務器返回的值來判斷有沒有啟動程序的權利。
在C#下方便的網絡交互,請參考如下的文章:
http://www.cnblogs.com/dathlin/p/7697782.html