全部是根據現有文章學來的,《破解基礎知識匯編》,原文如下:
|
第六章 爆 破 軟 件
|
爆破其實很簡單,最起碼比你能一下把你家的牙膏給全擠出來要容易多了。你只要先到大街上買幾根雷管,然后放到你的顯示器上再點着就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