全部是根據現有文章學來的,《破解基礎知識彙編》,原文如下:
第六章 爆 破 軟 件
|
爆破其實很簡單,最起碼比你能一下把你家的牙膏給全擠出來要容易多了。你只要先到大街上買幾根雷管,然後放到你的顯示器上再點著就OK了(不難吧,記的點著後跑遠點兒)
爆破的原理我也說過了,相信你很容易就能理解了。我們今天就具體講一下如何找到那個關鍵跳轉以及如何才能買到即便宜又好用的雷管...
爆破一個軟體一般只需要很少的幾個步驟,首先先看一下其有無加殼,有的話是用何工具加的殼,知道了以後用相應的工具將其脫掉或進行手工脫殼,參考以有教程。接著我們就可以對脫過殼之後的軟體來開刀了。你有兩種選擇,用W32Dasm或偵錯程式,一般如果你遇上的是那種很菜的軟體的話,用W32Dasm就可以搞定了。如果遇上的不是那種比較菜的,就買股票吧,因為股票是你如膠似漆的妻子!當!快醒醒啊...哦,一般如果你遇上的不是那種很菜的軟體的話,就用偵錯程式吧。先來說W32Dasm:我們首先用W32Dasm來進行反彙編(廢話!)之後在串式參考中找到錯誤提示資訊或可能是正確的提示資訊雙擊滑鼠左鍵來到相應的地址處。在W32Dasm的主視窗中分析相應彙編程式碼,找出關鍵跳轉和關鍵call。綠色光條停在關鍵跳轉,在W32Dasm主視窗底部找到關鍵跳轉的偏移地址(實際修改地址)。用ultraedit找到偏移地址(實際修改地址)修改機器碼(或放上一根雷管),儲存(點火)!而用偵錯程式也同樣簡單,等會兒會詳細說明。
道理廢話了那麼多,來例項動手說明吧: 首先講解用W32Dasm來進行爆破:
【軟體名稱】中華壓縮(ChinaZip) 【軟體版本】7.0 【檔案大小】1041KB
【適用平臺】Win9x/Me/NT/2000
【軟體簡介】ChinaZip(中華壓縮)是一款壓縮、解壓各種壓縮文件的工具軟體,它支援包括ZIP格式檔案在內的各種常見壓縮格式如:ARJ、CAB、GZIP、JAR、LHA、TAR、ZOO、ARC、LZH、Pak等等。
軟體的出處是電腦報2001年的合訂本配套光碟,7.0時的保護做的很那個,目前版應該好多了...
好的,我們開始吧,首先第一步是你得把它裝上(引來野狼N頭),之後先隨便找個字串填上去註冊一下,會看到一個錯誤對話方塊,提示"註冊碼不正確,無法註冊"。接著我們用FI來看一下它用的是什麼殼。ASPack
2.001,caspr出場。脫過殼後我們用W32Dasm花上半分鐘或半小時的時間來對它進行反彙編。我們以經反彙編完畢。之後在串式參考中(字串資料參考)中找剛才你看到的那個錯誤提示,找到之後雙擊幾次,發現其只有一處呼叫。我們會來到004F0E64處,我把具體程式碼給貼上(請你從程式碼的最下邊開始看):
:004F4DD1 E84EE1F3FF call 00432F24 :004F4DD6 8B55F0 mov
edx, dword ptr [ebp-10] :004F4DD9 8D4DF4 lea ecx, dword ptr [ebp-0C]
:004F4DDC 8BC3 mov eax, ebx :004F4DDE E8C9010000 call
004F4FAC :004F4DE3 8B55F4 mov edx, dword ptr [ebp-0C]
:004F4DE6 58 pop eax :004F4DE7 E830F3F0FF call 0040411C
:004F4DEC 7576 jne 004F4E64 <--這個就是傳說中的男人,Stop!這個就是傳說中的關鍵跳轉
:004F4DEE B201 mov dl, 01 :004F4DF0 A158254500 mov eax,
dword ptr [00452558] * Referenced by a (U)nconditional or
(C)onditional Jump at Address: |:004F4D86(C) |
:004F4DF5 E85ED8F5FF call 00452658 :004F4DFA 8945FC mov
dword ptr [ebp-04], eax :004F4DFD 33C0 xor eax, eax
:004F4DFF 55 push ebp :004F4E00 685D4E4F00 push 004F4E5D
:004F4E05 64FF30 push dword ptr fseax] :004F4E08 648920 mov
dword ptr fseax], esp :004F4E0B B101 mov cl, 01 * Possible
StringData Ref from Code Obj ->"Software\XDZHAN\ChinaZip"
|
:004F4E0D BAA84E4F00 mov edx, 004F4EA8 :004F4E12 8B45FC mov
eax, dword ptr [ebp-04] :004F4E15 E822DAF5FF call 0045283C *
Possible StringData Ref from Code Obj ->"Real Programmers Use
Pascal!" | :004F4E1A B9CC4E4F00 mov ecx, 004F4ECC
* Possible StringData Ref from Code Obj ->"Key" |
:004F4E1F BAF44E4F00 mov edx, 004F4EF4 :004F4E24 8B45FC mov
eax, dword ptr [ebp-04] :004F4E27 E854DEF5FF call 00452C80 *
Possible StringData Ref from Code Obj ->"軟體註冊成功,謝謝您的支援!"
<--我們向上看會在這裡發現註冊成功後的正確資訊。正確資訊處向上找第一個跳轉就是我們要找的關鍵跳轉。 |
:004F4E2C B8004F4F00 mov eax, 004F4F00 :004F4E31 E8563DF6FF
call 00458B8C :004F4E36 A16C305000 mov eax, dword ptr [0050306C]
:004F4E3B 8B00 mov eax, dword ptr [eax] * Possible
StringData Ref from Code Obj ->"中華壓縮(ChinaZip)-註冊版" |
:004F4E3D BA244F4F00 mov edx, 004F4F24 :004F4E42 E80DE1F3FF
call 00432F54 :004F4E47 33C0 xor eax, eax :004F4E49 5A pop
edx :004F4E4A 59 pop ecx :004F4E4B 59 pop ecx
:004F4E4C 648910 mov dword ptr fseax], edx :004F4E4F
686E4E4F00 push 004F4E6E * Referenced by a (U)nconditional or
(C)onditional Jump at Address: |:004F4E62(U) |
:004F4E54 8B45FC mov eax, dword ptr [ebp-04] :004F4E57
E868E2F0FF call 004030C4 :004F4E5C C3 ret
:004F4E5D
E9C2E9F0FF jmp 00403824 :004F4E62 EBF0 jmp 004F4E54 *
Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004F4DEC(C) | * Possible StringData Ref from
Code Obj ->"註冊碼不正確,無法註冊!" <--這個就是出錯的資訊了,那正確資訊也就在附近,上下看看。
| :004F4E64 B8484F4F00 mov eax, 004F4F48 <--雙擊來到這裡
:004F4E69 E81E3DF6FF call 00458B8C :004F4E6E 33C0 xor eax,
eax :004F4E70 5A pop edx :004F4E71 59 pop ecx
:004F4E72 59 pop ecx :004F4E73 648910 mov dword ptr fseax],
edx :004F4E76 689B4E4F00 push 004F4E9B
你可能有點不明白,為什麼我說它就是關鍵跳轉呢?還記的在破解原理中我舉的例子嗎?
我再給你講一遍好了,通常我們會遇到兩種關鍵跳轉,我分別舉例說明: (1) je
(jne,jz,jnz) 19870219 ........ XXXXXXXXXX ........
XXXXXXXXXX ........ 軟體註冊正確的相關資訊 ... ...
19870219 軟體的出錯資訊 ....... .......
也就是說這第一種情況是先判斷註冊碼是否正確,如果不正確就跳到19870219處,正確的話就不跳轉,一直執行下去,直至註冊正確處。
對於這種情況,我們要找的關鍵跳轉,就是正確資訊上面的第一個跳轉。我們可能對其作相應修改或將其給nop掉就萬事OK了。
(2) je (jne,jz,jnz) 19870219 ........ XXXXXXXXXX
........ XXXXXXXXXX ........ 軟體的出錯資訊 ...
... 19870219 軟體註冊正確的相關資訊 ....... .......
而這第二種情況就是先判斷註冊碼正確與否,如果正確就跳到19870219處,不正確的話就不跳轉,一直執行下去,直至出錯處。
對於這種情況,我們要找的關鍵跳轉就是出錯資訊上面的第一個跳轉。將其做相應修改或改為jmp後我們就可以為所欲為了
呵呵,道理也都給你講明白了,我們來改一下試試吧。我們在W32Dasm中選中關鍵跳轉,在右下角的狀態列中看到相應的偏移地址為000F41EC。好的,我們用UltraEdit來開啟它。Ctrl+G,接著輸入0xF41EC,回車後便會跳到相應的位置。相應的機器碼是75(jne),我們將其改為74(jz)後存檔退出。
好了,執行一下看看,我們來隨便輸入一個註冊碼註冊一下試試。呵呵,註冊成功!
用W32Dasm我們就講到這裡,呵呵,很簡單的,你下去之後自己找些保護簡單的軟體上上手吧。
我們接著來講用偵錯程式來進行爆破。
如果你真的試圖用W32Dasm去爆破幾個軟體的話,用不了多少時間你就會發現一些問題。比如說有的軟體你用W32Dasm反彙編後串式參考根本就不能用。或者串式參考中沒有出錯或正確的資訊。還有就是有的軟體就算你通過串式參考來到了相應的地方,剛想去找關鍵跳轉你就會發現眼前的東西比你想像中的要亂的多...雖然你有可能通過認真仔細地找,仍會找到,但我不認為那是一件聰明的事情。畢竟,有一些動靜是隻有在程式執行期間才能看出來的。好的,如果你用W32Dasm遇到了找不到關鍵跳轉的軟體,就去用偵錯程式吧!(你用偵錯程式前可先用W32Dasm開啟一遍看個先,如果很容易就讓你找到了。那就沒必要了)
在開始之前我們有必要講一下用偵錯程式來爆破的步驟(我知道你一定會用偵錯程式的
):首先,我們當然還是要把你要Crack的軟體給裝上(我擋我擋我擋,不要亂丟東西嘛!)然後來到輸入註冊碼的地方,仍舊隨便輸入一個,接著不要按確定,待我們把偵錯程式叫出來先。還記的我前面跟你講的API的事情嗎?軟體要得到你輸入的註冊碼,就一定會呼叫某個API函式來達到目的。我們就在偵錯程式中用相應的API來做斷點,這樣的話,只要一有程式呼叫這個API,就會被偵錯程式給攔截下來。
GetDlgItemInt、GetDlgItemText、GetDlgItemTextA這三個函式可能會有用。但是如果你用的是98,那為什麼不用hmemcpy呢?那真的是一個不錯的主意。當我們下完斷點後就返回到你要註冊的那個軟體中,點確定這類的按鈕。如果被偵錯程式給斷了下來,就說明你剛才下的斷點有用,如果沒有被斷下來,就換個斷點試試。接下來我們在偵錯程式中來取消剛才你下的那個斷點,我們以TRW2000為例(SoftICE與其操作大體相同)取消斷點用bc
*指令。然後我們就輸入pmodule指令來返回到程式的領空(而在SoftICE中由於沒有相應指令,呵呵,狂按F12吧)。現在我們把話題岔開一下,什麼是領空呢?舉個例子吧,你的程式要得到你輸入的那個註冊碼,就會去呼叫相應的函式。比如呼叫GetDlgItemTextA,而GetDlgItemTextA本身又會去呼叫Hmemcpy這個函式,而這些函式都是存在於系統中的某個DLL檔案中的。那麼當這個程式呼叫相應的API函式的話,程式的領空就會轉到這個相應的DLL檔案中去執行這個API函式。(你就這樣理解就行了)我前邊也說過了,Hmemcpy這個函式應用程式本身並不直接呼叫,而是由其它的API函式來呼叫。那麼,你就可以理解為你的程式呼叫了一個API函式,呼叫的同時程式的領空會轉到這個API所在的DLL檔案裡,而這個API又呼叫了Hmemcpy函式,那麼此時領空就會又轉到了Hmemcpy所在的DLL檔案中,之後當Hmemcpy執行完畢,就會返回到呼叫它的API的領空中去,而當這個API執行完畢的後就會返回到呼叫它的應用程式的領空中去。比如說我們用Hmemcpy這個函式來當斷點,當我們輸入完註冊碼按確定後,程式就會去呼叫某個API來得到你輸入的那些資料,而這“某個API”又會去呼叫Hmemcpy,所以程式就被斷到了。當然此時程式的領空也就不會在應用程式中了,但是當我們輸入過pmodule指令之後我們就可以反回到應用程式本身的領空中去了。這樣的話你看到的就是應用程式自身的程式碼了,而不是API的!好了,我接著剛才的說(到哪兒了來著?)當我們返回到程式自身的領空中去後就一直狂按F12吧,F12的作用是一直執行程式,直到遇上ret等指令。也就是一大坨一大坨地來執行程式^_^你一直按F12,直到程式出現註冊錯誤對話方塊。然後記下剛才你按的次數,接著從頭做起,這一次按F12的次數是你剛才按的次數-1,也就是說比上一次要少按一次。而後按鍵由F12換至F10(怎麼沒有F4?),還是一路狂按,直到軟體提示出錯,這次記下你按F10的次數。好的,再從頭來一遍,我們再次按F10的時候,要一步一步慢慢來,一般你按F10的次數離你上次按的次數相差五六步的時候,一般就會看見一個CALL,接著是一個跳轉指令。你一步一步地來,看過了這個跳轉指令之後會不會跳走,如果跳走了,那一般你不會再過兩三步就應該出錯了。當然也有可能是你沒有跳走,而過了兩三步就出錯了。這個應該不難理解,因為基本上它和我前邊跟你介紹過的是一個道理。然而另外一種情況是你一路按F10下來,到了最後會發現根本沒什麼跳轉指令,呵呵,別害怕,這個很常見的。遇上這種情況,我們只要把F10的次數變換為上次按F10的次數-1,這樣的話你一般就會停在一個CALL處,而這個CALL,就是程式中的關鍵CALL,我們之後要吃點兒苦,要按F8追進去分析它,程式註冊的成功與失敗,就在這個CALL中,也就是說我們要修改的關鍵跳轉,也在這個CALL中。呵呵,其實也很好理解的,就是把我上邊說的那些個判斷什麼地放到了一個CALL裡面。我們按F8追進去之後便仍舊按F10來一步一步執行,過不了多長時間你就會發現關鍵跳轉了,找關鍵跳轉的方法跟我前邊說的一樣,即按F10的次數跟上一次差五六步的時候慢下來,就會看到了。
你應該明白,程式是很靈活的東西,並沒有那麼多公式化的東西在裡邊,大概的分析方法就是這個樣子,一切都要靠你自己去掌握,別人跟你講,也只是講一個分析的方法而以,我相信隨著你以後經驗的提高,你慢慢地就能應付各種情況了。
現在,我們再用偵錯程式來對CHINAZIP這個軟體進行分析,希望你能夠掌握這個並不難的方法。
首先,你要把剛才爆破過了的再改回來,或直接重灌一遍。之後我們開啟它,任意輸入註冊碼,接著按Ctrl+N撥出TRW,下斷點hmemcpy。下過後按F5退出(它就是不用F4,我也沒辦法^_^)然後我們點選確定。好的,程式被斷了下來:
KERNEL?HMEMCPY 0147:9e62 push bp 0147:9e63 mov
bp,sp 0147:9e65 push ds 0147:9e66 push edi
0147:9e68 push esi 0147:9e6a cld 0147:9e6b mov
ecx,[bp+06] 0147:9e6f jcxz 9ee9 ……以下N多程式碼省略……
我們輸入bc *來取消斷點,然後用pmodule來返回到程式的領空: 0167:00436d13 mov
[ebx+0c],eax 0167:00436d16 mov eax,[ebx] 0167:00436d18 cmp
eax,byte +0c 0167:00436d1b jnz 00436d38 0167:00436d1d mov
edx,[ebx+08] 0167:00436d20 push edx 0167:00436d21 mov
ecx,[ebx+04] 0167:00436d24 mov edx,eax 0167:00436d26 mov
eax,esi 0167:00436d28 call 00432b24 ……N多程式碼仍舊省略……
按7下F12另加1下F10來到0167:004f4dc4處,我們接著一下一下來按F10,大概按了10多下,就可以看到004f4dec處有一個跳轉,我們執行到004f4dec處後果然跳走了。會跳到004f4e64處,我們跳過去之後按不了三下,程式就提示出錯了。呵呵,明白過來了吧,004f4dec處的那個跳轉jnz
004f4e64就是關鍵跳轉,嘿嘿,找到了之後不用我說了吧 0167:004f4dc4 mov eax,[ebp-08]
0167:004f4dc7 push eax 0167:004f4dc8 lea edx,[ebp-10]
0167:004f4dcb mov eax,[ebx+02e0] 0167:004f4dd1 call 00432f24
0167:004f4dd6 mov edx,[ebp-10] 0167:004f4dd9 lea
ecx,[ebp-0c] 0167:004f4ddc mov eax,ebx 0167:004f4dde call
004f4fac 0167:004f4de3 mov edx,[ebp-0c] 0167:004f4de6 pop
eax 0167:004f4de7 call 0040411c 0167:004f4dec jnz 004f4e64
<--關鍵跳轉!! 0167:004f4dee mov dl,01 0167:004f4df0 mov
eax,[00452558] 0167:004f4df5 call 00452658 0167:004f4dfa mov
[ebp-04],eax 0167:004f4dfd xor eax,eax 0167:004f4dff push
ebp 0167:004f4e00 push dword 004f4e5d 0167:004f4e05 push
dword [fs:eax] 0167:004f4e08 mov [fs:eax],esp 0167:004f4e0b
mov cl,01 0167:004f4e0d mov edx,004f4ea8
|
|
≮PYG 5.4 Craker引導學習小組≯本電子書由[PYG]菜兒編輯製作 版權歸原作者所有:2006-9-6
===================我的破解過程====================================
原文說中華壓縮7.0作為試驗品(Delphi製作),但是沒找到,於是下載了6.2,反正就是地址偏移量略有些差異,破解過程完全一致。到這裡下載:
http://mydown.yesky.com/soft/32/32926_more.shtml
要破解,先脫殼啊,沒技術含量也要做,否則根本無從下手。
用ExeInfo PE 0.0.2.0 檢測,提示到這裡下載脫殼工具:
http://www.exetools.com/unpackers.htm
先後下載了 caspr1012(原文推薦的工具) 和 AspackDie 1.3d(ExeInfo推薦的工具)結果都不行。提示說脫殼成功,但雙擊執行脫殼後的程式立刻異常。
後來下載了 unaspack1091,地址:
http://www.exetools.com/files/unpackers/win/unaspack1091.zip
終於脫殼成功(雙擊脫殼後的檔案,執行不報錯)!
用W32dsm開啟脫殼後的ChinaZip.exe,選單“參考”-->“串式參考”,雙擊最底下那句“註冊碼不正確,無法註冊”,注意是英文逗號(原文寫錯了)。
查詢後只發現一處地址,往上移動(別的軟體有可能是往下移動),發現:
(一般都是比較後進行跳轉,但到底是哪幾句還是需要猜)
004F3D72 pop eax
004F3D73 call 0040411C
004F3D78 jne 004F3DF0
游標落在 jne 004F3DF0 那句,這時候發現底下狀態列顯示:源地址 004F3D78 偏移是 000F3178
用UltraEdit開啟脫殼後的ChinaZip.exe,Ctrl+G,接著輸入0xF3178,發現它的值正好是74,絕美,正好是我們要改的跳轉語句,改成75,儲存,OK.
雙擊執行ChinaZip.exe,隨便輸入什麼註冊號,成功!
---------------------------------------------------------------
為了方便我以後回味這個破解過程,我把所有軟體和工具都上傳了:
ChinaZip60.rar --> 中華壓縮安裝檔案
Installed.rar --> 中華壓縮安裝後Program Files裡的所有檔案
unpacked.rar --> 使用unaspack1091 對ChinaZip.exe脫殼後的檔案,起名仍然叫 ChinaZip.exe,原檔案被自動備份成 ChinaZip.exe.bak
Cracked.rar --> 破解之後的檔案
所用工具
unaspack1091.zip --> 脫殼工具
w32dasm.rar --> 反彙編工具
UltraEdit --> 太大了,不上傳了。到網上下載試用版的都可以。
下載地址:
http://files.cnblogs.com/findumars/ChinaZip6_Crack.rar