(1)序列號保護機制 數學算法一項都是密碼加密的核心,但在一般的軟件加密中,它似乎并不太為人們關心,因為大多數候軟件加密本身實現的都是一種編程的技巧。但近幾年來隨著序列號加密程序的普及,數學算法在軟件加密中的比重似乎是越來越大了。
我們先來看看在網絡上大行其道的序列號加密的工作原理。當用戶從網絡上下載某個shareware――共享軟件后,一般都有使用時間上的限制,當過了共享軟件的試用期后,你必須到這個軟件的公司去注冊后方能繼續使用。注冊過程一般是用戶把自己的私人信息(一般主要指名字)連同信用卡號碼告訴給軟件公司,軟件公司會根據用戶的信息計算出一個序列碼,在用戶得到這個序列碼后,按照注冊需要的步驟在軟件中輸入注冊信息和注冊碼,其注冊信息的合法性由軟件驗證通過后,軟件就會取消掉本身的各種限制,這種加密實現起來比較簡單,不需要額外的成本,用戶購買也非常方便,在互聯網上的軟件80%都是以這種方式來保護的。
我們注意到軟件驗證序列號的合法性過程,其實就是驗證用戶名和序列號之間的換算關系是否正確的過程。其驗證最基本的有兩種,一種是按用戶輸入的姓名來生成注冊碼,再同用戶輸入的注冊碼比較,公式表示如下:
序列號 = F(用戶名)
但這種方法等于在用戶軟件中再現了軟件公司生成注冊碼的過程,實際上是非常不安全的,不論其換算過程多么復雜,解密者只需把你的換算過程從程序中提取出來就可以編制一個通用的注冊程序。
另外一種是通過注冊碼來驗證用戶名的正確性,公式表示如下:
用戶名稱 = F逆(序列號) (如ACDSEE,小樓注)
這其實是軟件公司注冊碼計算過程的反算法,如果正向算法與反向算法不是對稱算法的話,對于解密者來說,的確有些困難,但這種算法相當不好設計。
于是有人考慮到一下的算法:
F1(用戶名稱) = F2(序列號)
F1、F2是兩種完全不同的的算法,但用戶名通過F1算法的計算出的特征字等于序列號通過F2算法計算出的特征字,這種算法在設計上比較簡單,保密性相對以上兩種算法也要好的多。如果能夠把F1、F2算法設計成不可逆算法的話,保密性相當的好;可一旦解密者找到其中之一的反算法的話,這種算法就不安全了。一元算法的設計看來再如何努力也很難有太大的突破,那么二元呢?
特定值 = F(用戶名,序列號)
這個算法看上去相當不錯,用戶名稱與序列號之間的關系不再那么清晰了,但同時也失去了用戶名于序列號的一一對應關系,軟件開發者必須自己維護用戶名稱與序列號之間的唯一性,但這似乎不是難以辦到的事,建個數據庫就好了。當然你也可以根據這一思路把用戶名稱和序列號分為幾個部分來構造多元的算法。
特定值 = F(用戶名1,用戶名2,...序列號1,序列號2...)
現有的序列號加密算法大多是軟件開發者自行設計的,大部分相當簡單。而且有些算法作者雖然下了很大的功夫,效果卻往往得不到它所希望的結果。其實現在有很多現成的加密算法可以用,如RSADES,MD4,MD5,只不過這些算法是為了加密密文或密碼用的,于序列號加密多少有些不同。我在這里試舉一例,希望有拋磚引玉的作用:
1、在軟件程序中有一段加密過的密文S
2、密鑰 = F(用戶名、序列號) 用上面的二元算法得到密鑰
3、明文D = F-DES(密文S、密鑰) 用得到的密鑰來解密密文得到明文D
4、CRC = F-CRC(明文D) 對得到的明文應用各種CRC統計
5、檢查CRC是否正確。最好多設計幾種CRC算法,檢查多個CRC結果是否都正確
用這種方法,在沒有一個已知正確的序列號情況下是永遠推算不出正確的序列號的。
(2)如何攻擊序列號保護
要找到序列號,或者修改掉判斷序列號之后的跳轉指令,最重要的是要利用各種工具定位判斷序列號的代碼段。這些常用的API包括GetDlgItemInt, GetDlgItemTextA, GetTabbedTextExtentA, GetWindowTextA, Hmemcpy (僅僅Windows 9x), lstrcmp, lstrlen, memcpy (限于NT/2000)。
1)數據約束性的秘訣
這個概念是+ORC提出的,只限于用明文比較注冊碼的那種保護方式。在大多數序列號保護的程序中,那個真正的、正確的注冊碼或密碼(Password)會于某個時刻出現在內存中,當然它出現的位置是不定的,但多數情況下它會在一個范圍之內,即存放用戶輸入序列號的內存地址±0X90字節的地方。這是由于加密者所用工具內部的一個Windows數據傳輸的約束條件決定的。
2)Hmemcpy函數(俗稱萬能斷點)
函數Hmemcpy是Windows9x系統的內部函數,位于KERNEL32.DLL中,它的作用是將內存中的一塊數據拷貝到另一個地方。由于Windows9x系統頻繁使用該函數處理各種字串,因此用它作為斷點很實用,它是Windows9x平臺最常用的斷點。在Windows NT/2K中沒有這個斷點,因為其內核和Windows9x完全不同。
3)S命令
由于S命令忽略不在內存中的頁面,因此你可以使用32位平面地址數據段描述符30h在整個4GB(0~FFFFFFFFh )空間查找,一般用在Windows9x下面。具體步驟為:先輸入姓名或假的序列號(如: 78787878),按Ctrl+D切換到SoftICE下,下搜索命令:
s 30:0 L ffffffff '78787878'
會搜索出地址:ss:ssssssss(這些地址可能不止一個),然后用bpm斷點監視搜索到的假注冊碼,跟蹤一下程序如何處理輸入的序列號,就有可能找到正確的序列號。
4)利用消息斷點
在處理字串方面可以利用消息斷點WM_GETTEXT和WM_COMMAND。前者用來讀取某個控件中的文本,比如拷貝編輯窗口中的序列號到程序提供的一個緩沖區里;后者則是用來通知某個控件的父窗口的,比如當輸入序列號之后點擊OK按鈕,則該按鈕的父窗口將收到一個WM_COMMAND消息,以表明該按鈕被點擊。
BMSG xxxx WM_GETTEXT (攔截序列號)
BMSG xxxx WM_COMMAND (攔截OK按鈕)
可以用SoftICE提供的HWND命令獲得窗口句柄的信息,也可以利用Visual Studio中的Spy++實用工具得到相應窗口的句柄值,然后用BMSG設斷點攔截。例:
BMSG 0129 WM_COMMAND
上一篇:受全球經濟波動影響 半導體工廠08年開支縮減17%
下一篇軟件保護技術--警告(NAG)窗口
溫馨提示:
凡在本公司進行電路板克隆業務的客戶,必須有合法的PCB設計版權來源聲明,以保護原創PCB設計版權所有者的合法權益;