下面談到了一些在學習解密過程中經常遇到的問題,本人根據自己的經驗簡單給大家談一談。這些問題對於初學者來說常常是很需要搞明白的,根據我自己的學習經歷,如果你直接照著很多破解教程去學習的話,多半都會把自己搞得滿頭的霧水,因為有很多的概念要麼自己不是很清楚,要麼根本就不知道是怎麼一回事,所以希望通過下面的討論給大家一定的幫助:
1. 斷點
所謂斷點就是程序被中斷的地方,這個詞對於解密者來說是再熟悉不過了。那麼什麼又是中斷呢?中斷就是由於有特殊事件(中斷事件)發生,計算機暫停當前的任務(即程序),轉而去執行另外的任務(中斷服務程序),然後再返回原先的任務繼續執行。打個比方:你正在上班,突然有同學打電話告訴你他從外地坐火車過來,要你去火車站接他。然後你就向老板臨時請假,趕往火車站去接同學,接著將他安頓好,隨後你又返回公司繼續上班,這就是一個中斷過程。我們解密的過程就是等到程序去獲取我們輸入的注冊碼並准備和正確的注冊碼相比較的時候將它中斷下來,然後我們通過分析程序,找到正確的注冊碼。所以我們需要為被解密的程序設置斷點,在適當的時候切入程序內部,追蹤到程序的注冊碼,從而達到crack的目的。
2. 領空
這是個非常重要的概念,但是也初學者是常常不明白的地方。我們在各種各樣的破解文章裡都能看到領空這個詞,如果你搞不清楚到底程序的領空在哪裡,那麼你就不可能進入破解的大門。或許你也曾破解過某些軟件,但那只是瞎貓碰到死老鼠而已(以前我就是這樣的^_^,現在說起來都不好意思喔!)。所謂程序的領空,說白了就是程序自己的地方,也就是我們要破解的程序自己程序碼所處的位置。也許你馬上會問:我是在程序運行的時候設置的斷點,為什麼中斷後不是在程序自己的空間呢?因為每個程序的編寫都沒有固定的模式,所以我們要在想要切入程序的時候中斷程序,就必須不依賴具體的程序設置斷點,也就是我們設置的斷點應該是每個程序都會用到的東西。在DOS時代,基本上所有的程序都是工作在中斷程序之上的,即幾乎所有的DOS程序都會去調用各種中斷來完成任務。
但是到了WINDOWS時代,程序沒有權力直接調用中斷,WINDOWS系統提供了一個系統功能調用平台(API),就向DOS程序以中斷程序為基礎一樣,WINDOWS程序以API為基礎來實現和系統打交道,從而各種功能,所以WINDWOS下的軟件破解其斷點設置是以API函數為基礎的,即當程序調用某個API函數時中斷其正常運行,然後進行解密。例如在SOFTICE中設置下面的斷點:bpx GetDlgItemText(獲取對話框文本),當我們要破解的程序要讀取輸入的數據而調用GetDlgItemText時,立即被SOFTICE攔截到,從而被破解的程序停留在GetDlgItemText的程序區,而GetDlgItemText是處於WINDWOS自己管理的系統區域,如果我們擅自改掉這部分的程序代碼,那就大禍臨頭了^_^!所以我們要從系統區域返回到被破解程序自己的地方(即程序的領空),才能對程序進行破解,至於怎樣看程序的領空請看前面的SOFTICE圖解。試想一下:對於每個程序都會調用的程序段,我們可能從那裡找到什麼有用的東西嗎?(怎麼樣去加密是程序自己決定的,而不是調用系統功能實現的!)
3. API
即Application Programming Interface的簡寫,中文叫應用程序編程接口,是一個系統定義函數的大集合,它提供了訪問操作系統特征的方法。 API包含了幾百個應用程序調用的函數,這些函數執行所有必須的與操作系統相關的操作,如內存分配、向屏幕輸出和創建窗口等,用戶的程序通過調用API接口同WINDOWS打交道,無論什麼樣的應用程序,其底層最終都是通過調用各種API函數來實現各種功能的。通常API有兩中基本形式:Win16和Win32。 Win16是原來的、API的16位版本,用於Windows 3.1;Win32是現在的、API的32位版本,用於Windows 95/98/NT/ME/2000。Win32包括了Win16,是Win16的超集,大多數函數的名字、用法都是相同的。
16位的API函數和32位的API函數的區別在於最後的一個字母,例如我們設置這樣的斷點:bpx GetDlgItemText、bpx GetDlgItemTextA和bpx GetDlgItemTextW,其中 GetDlgItemText是16位API函數,GetDlgItemTextA和GetDlgItemTextW是32位API函數,而GetDlgItemTextA表示函數使用單字節,GetDlgItemTextW表示函數使用雙字節。現在我們破解中常用到的是Win32單字節API函數,就是和GetDlgItemTextA類似的函數,其它的兩種(Win16 API和Win32雙字節API函數)則比較少見。 Win32 API函數包含在動態鏈接庫(Dynamic Link Libraries,簡稱DLLs)中,即包含在kernel32.dll、user32.dll、gdi32.dll和comctl32.dll中,這就是為什麼我們要在softice中用exp=C:\windows\system\kernel32.dll等命令行將這些動態鏈接庫導入softice中的原因。因為不這樣做的話,我們就無法攔截到系統Win32 API函數調用了。
4. 關於程序中注冊碼的存在方式
破解過程中我們都會去找程序中將輸入的注冊碼和正確的注冊碼相比較的地方,然後通過對程序的跟蹤、分析找到正確的注冊碼。但是正確的注冊碼通常在程序中以兩種形態存在:顯式的和隱式的,對於顯式存在的注冊碼,我們可以直接在程序所處的內存中看到它,例如你可以直接在SOFTICE的數據窗口中看到類似"297500523"這樣存在的注冊碼(這裡是隨意寫的),對於注冊碼顯式存在的軟件破解起來比較容易;但是有些軟件的程序中並不會直接將我們輸入的注冊碼和正確的注冊碼進行比較,比如有可能將注冊碼換算成整數、或是將注冊碼拆開,然後將每一位注冊碼分開在不同的地方逐一進行比較,或者是將我們輸入的注冊碼進行某種變換,再用某個特殊的程序進行驗證等等。
總之,應用程序會采取各種不同的復雜運算方式來回避直接的注冊碼比較,對於這類程序,我們通常要下功夫去仔細跟蹤、分析每個程序功能,找到加密算法,然後才能破解它,當然這需要一定的8086匯編編程功底和很大的耐心與精力。
閱讀關於 黑客技巧 軟件破解 黑客 解密 破解技巧 的全部文章
123下一頁閱讀全文分頁導航