◆需求:
公司一直以來對開發的產品都沒有進行使用時間的控制,要么就是將日期限制寫死在程序里面,每次都要編譯新程序再發給客戶,很不方便。於是公司讓我寫個模塊,要求如下:
1、無論哪個新開發的程序只要調用這個模塊就可以控制有效期
2、軟件到期后需要我們提供有效的注冊碼軟件才能繼續使用
(輸入驗證碼,對機器和時間進行對比)
3、客戶修改了電腦的時間或者將軟件移動到其他電腦依然可以控制
(可以用你何必要用客戶端時間啊,用服務器時間不就解決問題了)
4、如果用注冊表的方式,不允許當客戶知道注冊表后,修改注冊表還能繼續使用的情況
5、控制方式不要太復雜
RegDLL.RegClass reg = new RegDLL.RegClass(System.IO.File.GetLastWriteTime(System.Reflection.Assembly.GetAssembly(typeof(Form1)).Location).ToShortDateString());
if (reg.MiStart_Infos() && reg.MiEnd_Infos())
{
Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(true);//這句要注釋掉,因為一個程序里面只能出現一句,dll里面已經有一句了,所以這里要注釋
Application.Run(new Form1());
}
else
{
Application.Exit();
}
◆分析:
1、當時我的第一反應就是dll,於是我就用了dll的方法來做。
2、這個做一個注冊機即可。
3、我開始是想用網絡時間的驗證方式,但是客戶的電腦不一定聯網,所以不能用網絡時間的方式。
4、如果用注冊表,重裝系統或者拿到其他電腦軟件還是無法控制,所以干脆不用注冊表。
5、需要注冊功能的軟件只需要引用dll並修改Program.cs文件為如下即可,夠簡單吧
show source
實現的思路:
其實也挺簡單,我用兩個文件分別來記錄軟件注冊的時間(下面提到的秘密文件)及到期的時間(下面提到的注冊文件),這兩個文件用記事本即可,文件強制作為軟件的必要文件,缺少則無法運行軟件,當然為了更加安全可以加密文件,不過我這里沒有做。
dll模塊實現的功能如下:
一、檢查秘密文件是否存在(Eng.k)
1.存在,則讀取密文,密文為空則將程序的編譯日期寫入(調用此模塊后軟件第一次運行需要注冊一次)
2.密文不為空則跟當前電腦時間對比,驗證電腦時間的有效性,有效則將電腦時間寫入秘密文件
3.這里的時間有效性就是說電腦的時間不能小於軟件注冊的時間,里面做了驗證
二、檢查注冊文件是否存在(Engi.p)
1.存在,則讀取密文中的軟件有效期
2.如果密文有效期為空並且秘密文件信息正確,則生成注冊碼,並寫入有效日期
3.接着比較當前日期是否處在兩個文件的日期當中,是則軟件有效,否則軟件的注冊碼無效,需要重新注冊有效的注冊碼
三、注冊機的實現
1.當然就是根據日期生成注冊碼咯
2.把注冊碼發給客戶注冊,至於是否有效就是dll要做的事情啦
四、這種方式有個漏洞,若客戶知道注冊的原理,聰明點的就可以破解了,所以肯定不能透露O(∩_∩)O~
◆源碼
源碼自我感覺寫得不夠漂亮,這里我就不提供了,不過提供我的dll文件、注冊機及示例項目的下載地址:http://files.cnblogs.com/linyc/REGDLL.rar
Ps:想看源碼可以用反編譯軟件,看了源碼就知道只是用了點"小伎倆"而已,歡迎大家反編譯哈~有什么好的建議歡迎狠狠提出來交流哈~
聲明:本軟件只作為交流技術使用,不可作為商業用途,如因此引起的法律問題及其他責任本人概不負責。
轉載請注明出處:http://www.cnblogs.com/linyc/archive/2011/03/26/1996397.html