C# 注冊機功能開發,機器碼設計


前言


 本文將使用一個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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM