[轉]關於軟件保護的一般性建議

本節將給出關於軟件保護的一般性建議,這些都是無數人經驗的總結。程序員在設計自己的保護方式時最好能夠遵守這裏給出的準則,這樣會提高軟件的保護強度。
(1)軟件最終發行之前一定要將可執行程序進行加殼/壓縮,使得解密者無法直接修改程序。如果時間允許並且有相應的技術能力,最好是設計自己的加殼/壓縮方法。如果採用現成的加殼工具,最好不要選擇流行的工具,因爲這些工具已被廣泛深入地加以研究,有了通用的脫殼/解壓辦法。另外,最好採用兩種以上的不同的工具來對程序進行加殼/壓縮,並儘可能地利用這些工具提供的反跟蹤特性。
(2)增加對軟件自身的完整性檢查。這包括對磁盤文件和內存映像的檢查,以防止有人未經允許修改程序以達到破解的目的。DLL和EXE之間可以互相檢查完整性。
(3)不要採用一目瞭然的名字來命名函數和文件,如IsLicensedVersion( )、key.dat等。所有與軟件保護相關的字符串都不能以明文形式直接存放在可執行文件中,這些字符串最好是動態生成。
(4)儘可能少地給用戶提示信息,因爲這些蛛絲馬跡都可能導致解密者直接深入到保護的核心。比如,當檢測到破解企圖之後,不要立即給用戶提示信息,而是在系統的某個地方做一個記號,隨機地過一段時間後使軟件停止工作,或者裝作正常工作但實際上卻在所處理的數據中加入了一些垃圾。
(5)將註冊碼、安裝時間記錄在多個不同的地方。
(7)檢查註冊信息和時間的代碼越分散越好。不要調用同一個函數或判斷同一個全局標誌,因爲這樣做的話只要修改了一個地方則全部都被破解了。
(8)不要依賴於GetLocalTime( )、GetSystemTime( )這樣衆所周知的函數來獲取系統時間,可以通過讀取關鍵的系統文件的修改時間來得到系統時間的信息。
(9)如果有可能的話,可以採用聯網檢查註冊碼的方法,且數據在網上傳輸時要加密。
(10)除了加殼/壓縮之外,還需要自己編程在軟件中嵌入反跟蹤的代碼,以增加安全性。
(11)在檢查註冊信息的時候插入大量無用的運算以誤導解密者,並在檢查出錯誤的註冊信息之後加入延時。
(12)給軟件保護加入一定的隨機性,比如除了啓動時檢查註冊碼之外,還可以在軟件運行的某個時刻隨機地檢查註冊碼。隨機值還可以很好地防止那些模擬工具,如軟件狗模擬程序。
(13)如果採用註冊碼的保護方式,最好是一機一碼,即註冊碼與機器特徵相關,這樣一臺機器上的註冊碼就無法在另外一臺機器上使用,可以防止有人散播註冊碼,並且機器號的算法不要太迷信硬盤序列號,因用相關工具可以修改其值。
(14)如果試用版與正式版是分開的兩個版本,且試用版的軟件沒有某項功能,則不要僅僅使相關的菜單變灰,而是徹底刪除相關的代碼,使得編譯後的程序中根本沒有相關的功能代碼。
(15)如果軟件中包含驅動程序,則最好將保護判斷加在驅動程序中。因爲驅動程序在訪問系統資源時受到的限制比普通應用程序少得多,這也給了軟件設計者發揮的餘地。
(16)如果採用keyfile的保護方式,則keyfile的尺寸不能太小,可將其結構設計得比較複雜,在程序中不同的地方對keyfile的不同部分進行復雜的運算和檢查。
(17)自己設計的檢查註冊信息的算法不能過於簡單,最好是採用比較成熟的密碼學算法。可以在網上找到大量的源碼。進入討論組討論。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章