C# 超級狗 二次開發 讀寫數據 激活驗證 存儲數據庫連接字符串


本文主要講解如果使用C#語言來對超級狗進行二次開發,如果僅僅是做個激活的功能,可以參照另一篇博客,地址:http://www.cnblogs.com/dathlin/p/8487842.html

 

 

繼續主題研究,如果使用C#來對超級狗進行二次開發。

樓主在研究這個超級狗的時候,直接某寶購買了開發狗和子狗兩個狗,並沒有購買demo狗,所以后來在研究開發套件里的Demo項目時,老是提醒找不到超級狗,一定要開發套件里生成的公司的獨一無二的組件進行訪問。

 

第一步,當然是下載公司的API庫了

其中開發商代碼文件很關鍵,等會要用到

然后耐心的等待下載完成就好了。

 

 

准備資源


接下來要找到兩個重要的東西才能進行開發,一個是組件庫,一個是開發商代碼文件。

獨一無二的組件庫在我的電腦的文檔里(可能不同的電腦會不一致)

把所有的組件拷貝出來,放到你自己的項目里去,然后引用dog_net_windows.dll即可

還有下面這個文件夾里的這個文件的內容,也是非常的重要,涉及到是否成功訪問超級狗的關鍵。

 

然后在項目里新建一個類。把里面的字符串拷貝出來,如下:

 

 

應用篇

情景一:在軟件中顯示當前的激活狀態


雖然一般來說,軟件可運行就代表着激活了,但是對於超級狗而言,有很多種方式,可能是永久激活的,可能是限制了次數的,可能是限制了日期的,不管超級狗的特征是什么類型的,我們都希望在軟件界面上友好的激活。

例如界面顯示當前為永久激活,界面上顯示當前激活天數只剩30天之類的

 

        public DogStatus ReadDogActiveString( int feature, string verdorCode, out string msg )
        {
            string scope = "<dogscope />";
            DogStatus status;
            Dog curDog = new Dog( new DogFeature( feature ) );

            status = curDog.Login( verdorCode, scope );
            if (status != DogStatus.StatusOk)
            {
                if (status == DogStatus.InvalidVendorCode)
                {
                    msg = "Invalid vendor code.";
                }
                else if (status == DogStatus.UnknownVcode)
                {
                    msg = "Vendor Code not recognized by API.";
                }
                else
                {
                    msg = "Login to feature failed with status: " + status;
                }
                return status;
            }

            string info = string.Empty;
            DogStatus read = curDog.GetSessionInfo( "<dogformat><feature><attribute name=\"id\"/><element name=\"license\"/></feature></dogformat>", ref info );
            if (read == DogStatus.StatusOk)
            {
                // 讀取特征成功
                XElement xElement = XElement.Parse( info ).Element( "feature" ).Element( "license" );
                string type = xElement.Element( "license_type" ).Value;
                if (type == "perpetual")
                {
                    // 永久激活方式
                    msg = "產品激活成功";
                }
                else if (type == "executions")
                {
                    // 執行次數的驗證方式
                    msg = "總激活數:" + xElement.Element( "counter_fix" ).Value + " 當前激活次數:" + xElement.Element( "counter_var" ).Value;
                }
                else if (type == "expiration")
                {
                    // 到期時間的激活方式
                    string time_second = xElement.Element( "exp_date" ).Value;
                    DateTime dateTime = new DateTime( 1970, 1, 1 ).AddSeconds( double.Parse( time_second ) );
                    msg = "到期時間:" + dateTime.ToString( "yyyy-MM-dd" );
                }
                else if (type == "trial")
                {
                    // 測試版
                    DateTime dateTime = new DateTime( 1970, 1, 1 ).AddSeconds( double.Parse( xElement.Element( "time_start" ).Value ) );
                    int days = int.Parse( xElement.Element( "total_time" ).Value ) / 3600 / 24;
                    DateTime timeNow = DateTime.Now;
                    curDog.GetTime( ref timeNow );
                    msg = "剩余激活天數:" + (days - (int)(timeNow - dateTime).TotalDays);
                }
                else
                {
                    msg = "激活方式未知";
                }
            }
            else
            {
                msg = "ReadFailed: " + read;
            }

            curDog.Logout( );
            curDog.Dispose( );
            return read;
        }

 此處提供一個通用的方法,讀取超級狗的激活狀態,並返回msg。使用方式如下:

        private void button3_Click( object sender, EventArgs e )
        {
            if(!int.TryParse(textBox1.Text,out int feature))
            {
                MessageBox.Show( "特征輸入不正確" );
            }

            DogStatus status = ReadDogActiveString( feature, VendorCode.strVendorCode, out string msg );
            label2.Text = msg;
        }

 效果如下:

 

 

 

情景二:存儲隱私數據,密碼或是數據庫連接字符串


想必這個應用也是非常廣泛的了,如果你要驗證用戶的密碼輸入,如果不使用數據庫實現,那么就只能直接判斷了

            string password = "123456";

            if(password=="123456")
            {
                // 密碼正確
            }
            else
            {
                // 密碼錯誤
            }

 但是這樣就會非常的危險,對付一般的小白用戶可能無所謂,但是只要是知道些反編譯技術的人,用反編譯工具就可以很快知道這個密碼了,然后就可以進去做某些XXXXX的事了。

 

可能有人會覺得把正確的密碼存放在數據庫好了,然后軟件啟動的時候加載數據庫里的密碼,這樣不就安全了嗎?但是你也公開了一個信息,那就是數據庫連接字符串

Server=(local);Database=pubs;Uid=sa;Pwd=asdasd;

 別人就知道了你的數據庫的地址,用戶名,密碼,然后入侵到你的數據庫服務器里,這樣所有的數據都暴露了。

 

 

那么我們怎么用加密狗解決這個問題呢?加密狗里有數據文件,允許進行讀寫操作,OK,那么我們來試一下

 

我們新增一個數據文件,然后按照下面進行勾選,我們發現可以創建三種模式的數據文件,讀寫,只讀,寫一次,很好理解,這里我們創建個可讀寫的,長度為128字節。

然后點擊確定,回到上個界面,點擊編程超級狗,將信息寫入到超級狗里。

 

剛才寫的是文件ID是5,所以接下來就需要在代碼上操作,我們先讀取這個數據

        public DogStatus ReadString( int feature, int fileId, string verdorCode, out string msg )
        {
            string scope = "<dogscope />";
            DogStatus status;
            Dog curDog = new Dog( new DogFeature( feature ) );

            status = curDog.Login( VendorCode.strVendorCode, scope );
            if (status != DogStatus.StatusOk)
            {
                if (status == DogStatus.InvalidVendorCode)
                {
                    msg = "Invalid vendor code.\n" ;
                }
                else if (status == DogStatus.UnknownVcode)
                {
                    msg = "Vendor Code not recognized by API.\n" ;
                }
                else
                {
                    msg = "Login to feature failed with status: " + status ;
                }
                return status;
            }

            DateTime time = DateTime.Now;
            DogFile file = curDog.GetFile( fileId );

            int size = 0;
            file.FileSize( ref size );
            byte[] buffer = new byte[size];
            file.Read( buffer, 0, size );

            msg = Encoding.ASCII.GetString( buffer ).Trim( '\0' );


            curDog.Logout( );

            return status;
        }

 調用該方法即可讀取指定的數據文件的信息,比如,數據文件5,讀取出來就是Sample Data File

private void button2_Click( object sender, EventArgs e )
        {
            ReadString( 1, 5, VendorCode.strVendorCode, out string msg );
            label2.Text = msg;
        }

 寫入的通用方法

public DogStatus WriteString( int feature, int fileId, string verdorCode, out string msg ,string content)
        {
            string scope = "<dogscope />";
            DogStatus status;
            Dog curDog = new Dog( new DogFeature( feature ) );

            status = curDog.Login( VendorCode.strVendorCode, scope );
            if (status != DogStatus.StatusOk)
            {
                if (status == DogStatus.InvalidVendorCode)
                {
                    msg = "Invalid vendor code.\n";
                }
                else if (status == DogStatus.UnknownVcode)
                {
                    msg = "Vendor Code not recognized by API.\n";
                }
                else
                {
                    msg = "Login to feature failed with status: " + status;
                }
                return status;
            }

            DateTime time = DateTime.Now;
            DogFile file = curDog.GetFile( fileId );

            byte[] buffer = Encoding.ASCII.GetBytes( content );
            file.Write( buffer, 0, buffer.Length );

            msg = "success";
            curDog.Logout( );

            return status;
        }

 下面就是調用演示的方法

private void button5_Click( object sender, EventArgs e )
        {
            WriteString( 1, 5, VendorCode.strVendorCode, out string msg, "Server=(local);Database=pubs;Uid=sa;Pwd=asdasd;" );
        }

 

我們把數據庫的信息寫入到超級狗里,然后再讀取出來就,相對的提升了安全性。然后再讀取這個數據

注意:如果你在寫入了"123456",然后再讀取字符串信息 "123456=(local);Database=pubs;Uid=sa;Pwd=asdasd;"

寫入了時候需要外帶清空后面的字符串。

 


免責聲明!

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



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