[分享] 10招讓你快速增加自己破解技能

下面談到了一些在學習解密過程中經常遇到的問題,本人根據自己的經驗簡單給大家談一談。這些問題對於初學人來說常常是很需要搞明白的,根據我自己的學習經歷,如果你直接照著很多破解教程去學習的話,多半都會把自己搞得滿頭的霧水,因為有很多的概念要么自己不是很清楚,要么根本就不知道是怎么一回事,所以希望透過下面的討論給大家一定的幫助︰

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彙編編程功底和很大的耐心與精力。

5. 關於軟體的破解模式︰本人將破解模式分為兩大類,即完全破解和暴力破解。所謂完全破解主要是針對那些需要輸入註冊碼或密碼等軟體來說的,如果我們能透過對程式的跟蹤找到正確的註冊碼,透過軟體本身的註冊功能正常註冊了軟體,這樣的破解稱之為完全破解;但如果有些軟體本身沒有提供註冊功能,只是提供試用(DEMO),或是註冊不能透過軟體本身進行(例如需要獲取另外一個專用的註冊程式,透過INTERNET的註冊等等),或者是軟體本身的加密技術比較複雜,軟體破解者的能力、精力、時間有限,不能直接得到正確的註冊碼,此時我們需要去修改軟體本身的程式碼,即人為改淙砑 腦誦蟹較 庋 鈉平獬浦 ζ平狻?

6. 關於破解教程中程式代碼位址問題︰破解教程中都會放上一部分程式代碼以幫助講解程式的分析方法,例如下面的一段程式代碼︰
……
0167:00408033 PUSH 00
0167:00408035 PUSH EBX
0167:00408036 CALL [USER32!EndDialog]
0167:0040803C JMP 0040812C
……
在這裡程式中的代碼位址如0167:00408033,其代碼段的值(即0167)有可能根據不同的電腦會有區別,不一定一模一樣,但偏移值應該是固定的(即00408033不變),所以如果看到破解文章裡的程式代碼的位址值和自己的電腦裡不一樣,不要以為搞錯地方了,只要你的程式代碼正確就不會有問題。

7. 關於如何設定斷點的問題︰正確恰當的設定好斷點對於快速有效的解密非常重要,好的斷點設定可以使我們迅速找到關鍵的程式段,而不恰當的斷點則會對解密造成不必要的精力消耗,甚至根本就不能攔截到程式的營運。但是具體什麼時候用什麼斷點比較合適很難說,這需要自己用經驗去累積,總的說來bpx hmemcpy這個萬能斷點對大多數註冊碼模式的軟體都有用,初學人不妨多試試這個斷點(通常我也是用這個斷點設定,懶嘛^_^,哈哈。。。)。對於那些需要暴力破解的非註冊碼模式的軟體,通常我們應該攔截對話框(如bpx DialogBox)和消息框(如bpx MessageBox(A))等。不論對於哪一類軟體,當我們設定的斷點均沒有效果時,可是試一下bpx lockmytask,這個斷點的作用是攔截任何一個按鍵的動作,具體常用的一些斷點設定請參考"破解常用斷點設定"一文。另外,在註冊碼的破解中通常需要輸入用戶名和註冊碼,一般說來用戶名和密碼都可以隨意輸入,但是根據我自己的經驗,很多軟體對於註冊碼都會逐位的進行處理,假如輸入"78787878″這串數字,那麼在跟蹤程式的時候我們就無法知道我們當時所看到的"78″倒底是哪一個"78″,所以我比較喜歡用"12345678″這樣的註冊碼輸入模式,這樣的話就就能知道程式是在對註冊碼的哪一位進行運算,同樣的對於那些需要輸入較長序列號的軟體,輸入類似"12345-67890-ABCDEF"這樣的序列號較好。 不過有一點大家需要特別的注意︰上面講的註冊碼輸入模式"12345678″是針對攔截WIN32 API函數來說的,假如有些時候直接攔截WIN32 API函數難以找到程式的突破口,而要借助於"S"指令在內存中尋找我們輸入的用戶名或註冊碼時,就最好不要採用"12345678″作為註冊碼,因為內存中很可能有許多的"12345678″字元串,這樣我們沒有辦法知道倒底我們要破解的程式使用的是哪一個"12345678″,所以我們應該選擇一個不易和內存數據相同的註冊碼,比如︰74747474(本人喜歡用,意思嘛︰去死去死。。。哈哈哈^_^),對應的搜索指令為︰ S 30:0 L FFFFFFFF ‘74747474’ 。當然,以上只是我個人的習慣而已,具體用什麼樣的輸入形式可以根據本人的愛好、習慣來定,不必拘泥於某一固定的模式。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s


%d 位部落客按了讚: