常見保護的攻擊:序列號方式 續(xù)
怎么攻擊序列號保護
要找到序列號,或修改掉判斷序列號之后的跳轉(zhuǎn)指令,最重要的是要利用各種工具定位判斷序列號的代碼段。這些常用的API包括GetDlgItemInt, GetDlgItemTextA, GetTabbedTextExtentA, GetWindowTextA, Hmemcpy (僅僅視窗系統(tǒng) 9x), lstrcmp, lstrlen, memcpy (限于NT/2000)。
1)數(shù)據(jù)約束性的秘訣
這個概念是+ORC提出的,只限于用明文比較注冊碼的那種保護方式。在大多數(shù)序列號保護的程式中,那個真正的、正確的注冊碼或密碼(Password)會于某個時刻出目前內(nèi)存中,當然他出現(xiàn)的位置是不定的,但多數(shù)情況下他會在一個范圍之內(nèi),即存放用戶輸入序列號的內(nèi)存地址±0X90字節(jié)的地方。這是由于加密者所用工具內(nèi)部的一個視窗系統(tǒng)數(shù)據(jù)傳輸?shù)募s束條件決定的。
2)Hmemcpy函數(shù)(俗稱萬能斷點)
函數(shù)Hmemcpy是視窗系統(tǒng)9x系統(tǒng)的內(nèi)部函數(shù),位于KERNEL32.DLL中,他的作用是將內(nèi)存中的一塊數(shù)據(jù)拷貝到另一個地方。由于視窗系統(tǒng)9x系統(tǒng)頻繁使用該函數(shù)處理各種字串,因此用他作為斷點非常實用,他是視窗系統(tǒng)9x平臺最常用的斷點。在視窗系統(tǒng) NT/2K中沒有這個斷點,因為其內(nèi)核和視窗系統(tǒng)9x完全不同。
3)S命令
由于S命令忽略不在內(nèi)存中的頁面,因此你能使用32位平面地址數(shù)據(jù)段描述符30h在整個4GB(0~FFFFFFFFh )空間查找,一般用在視窗系統(tǒng)9x下面。具體步驟為:先輸入姓名或假的序列號(如: 78787878),按Ctrl+D轉(zhuǎn)換到SoftICE下,下搜索命令:
s 30:0 L ffffffff ’78787878’
會搜索出地址:ss:ssssssss(這些地址可能不止一個),然后用bpm斷點監(jiān)視搜索到的假注冊碼,跟蹤一下程式怎么處理輸入的序列號,就有可能找到正確的序列號。
4)利用消息斷點
在處理字串方面能利用消息斷點WM_GETTEXT和WM_COMMAND。前者用來讀取某個控件中的文本,比如拷貝編輯窗口中的序列號到程式提供的一個緩沖區(qū)里;后者則是用來通知某個控件的父窗口的,比如當輸入序列號之后點擊OK按鈕,則該按鈕的父窗口將收到一個WM_COMMAND消息,以表明該按鈕被點擊。
BMSG xxxx WM_GETTEXT (攔截序列號)
BMSG xxxx WM_COMMAND (攔截OK按鈕)
能用SoftICE提供的HWND命令獲得窗口句柄的信息,也能利用Visual Studio中的Spy++實用工具得到相應(yīng)窗口的句柄值,然后用BMSG設(shè)斷點攔截。例:
BMSG 0129 WM_COMMAND
序列號方式的保護方式就為大家介紹完了,希望大家已經(jīng)掌握。如果想了解更多的相關(guān)內(nèi)容,請大家閱讀:常見保護的攻擊:序列號方式
【編輯推薦】