最近兩周一直忙于項目中一項資料加密.其中涉及到軟體加密部分很具有技巧特點.覺得很有意思,今天拿來分析一下.
其實在這所談的軟體加密我們無需把這個範圍定義太過廣泛. 簡單着重一個點來看. 行業裡軟體經過多個版本更疊已經趨于一個成熟的産品在流入市場時, 這時我們就面對一個問題:版權和核心資料保護. 目前國内關于軟體版權意識依然不是特别濃厚, 因為隻有在牽扯到實際利益時有些人才意識到版權和核心資料保護重要性.
本篇的目的本來是想談談在加密算法設計中涉及多重政策使用, 大多是算法在保密性設計上多重規則. 但這個需要一定密碼學基礎才能直接能看懂.是以本篇暫且來先講講軟體加密過程中使用各種實用的技巧. 如下我會示範目前在軟體加密中所采用各種技巧和原理. 而一個好的加密算法和加密政策的設計也是因為适用場景,範圍不同而不同. 當然這也是仁者見仁智者見智.
<a href="http://blog.51cto.com/attachment/201201/123527120.jpg" target="_blank"></a>
對與軟體的加密保護,有些加密技巧的實作并不需要你了解太多的彙編和系統底層的知識也能做到. 其實無論你的軟體采用何種方式來加密.大多是情況下都會歸結為某些條件判定.在各種條件下觸發不同内部資料操作,當然如果加密程度較高軟體産品, 條件發生變化後他們就不直接動的是判定資料,而是下一個條件判定政策的改變. 這意味解密過程的因素是依賴多方面的.
當然定義這些固定行為操作依然依賴的是不同語言的Code來實作. 我們在此不必考慮如何消除這些代碼Code,這些執行代碼必然會以各種形式存在不同地方正确執行. 我們把核心轉向如何有效隐藏和保護這些代碼.
<1.1>技巧一:有迷惑性的代碼
通常來說,開發人員和解密者都具有很好邏輯思維能力.其實一般情況下大多是同行. 開發人員為了執行代碼的效率和空間會不同重構剔除無用代碼和邏輯. 是執行這段代碼看起來簡潔. 其實解密者也是這麼了解開發人員的. 他可以通過分析程式中每一段指令來追索程式設計人員的保護思路. 也就是我們常說各種”逆向工程”方式擷取加密邏輯. 如果開發人員在編寫這段邏輯是加入大量無用代碼. 故意把程式複雜化. 畢竟開發人員使用都是第四代進階語言.而解密者能看到的是彙編代碼. 想搞清楚那些代碼使用的,那些代碼是無用的 并不是意見簡單的事情.啊
<1.2>技巧二: 虛假的檢查
上面方式其實隻是在量上加大解析的難度. 其實有時還是難免被機器程式模拟通信過程. 那麼對于已經入侵進來的人. 虛假判斷可以抓到他們通路記錄.
在程式中故意把傳回結果和一些錯誤的答案進行比較. 比較結果肯定是錯誤的. 如果發現在通信過程中這個比較結果是正确的, 則這個時候可以證明有人在模拟我們檢查邏輯. 正在試圖破解軟體. 反擊的手段可以有多重選擇.
<1.3>技巧三: 設定輸入和輸出迷宮
類似我們常在某些關鍵裝置中設定USBKey身份識别系統驗證,它内部原理.就是在一定程度上增加了輸入和輸出的迷宮.
<a href="http://blog.51cto.com/attachment/201201/123548187.png" target="_blank"></a>
現在USBKey在于裝置進行通信時采用密文資料方式. 即使有裝置能夠模拟USB通信方式截取到通信資料,依然是密文形式. 同時作為軟體開發商為了安全起見定義一套自己的加密的規則和算法,對資料輸入輸出進行再次加密.這樣即使USBKey 丢失資料依然不會外流.
<1.4>技巧四: —計時功能
對于這個計時功能, 特别是在商業軟體中使用最為廣泛. 因為這裡面涉及到一個試用期限問題. 我還記得在04年破解一個軟體時隻需要修改一下XP系統時間既可以在安裝時自動破解成功. 後來才發現原來這款軟體設定的加密規則時間戳的設定時即時的.
開發商可以在第一次運作,把系統時間記下來.建立一個起始時間檔案存儲.類似軟體試用期 為30天. 在起始時間上加上30天期限 作為結束時間存儲為檔案格式.
當下一次使用者使用軟體時判斷,如果兩個資料時間檔案都不存在進行建立. 第一次建立成功後, 下一次使用者再來使用軟體.時則 起始時間資料檔案更新成目前系統時間,這時要比較新的時間是否比開始時間檔案中時間要早,. 防止使用者修改系統時間.然後再與結束時間比較. 看是否在範圍内.這樣就完整實作時鐘功能.
本文轉自chenkaiunion 51CTO部落格,原文連結:http://blog.51cto.com/chenkai/763846