詳述破解技術中的暴力破解原理
不可不說一下學習破解的三個階段:
初級,修改程式,用ultraedit等工具修改exe檔案,稱暴力破解,簡稱爆破。
中級,追出軟體的註冊碼。
高級,寫出註冊機。
先說這爆破。所謂爆破,就是指通過修改執行檔的源檔案,來達到相應的目的。你不明白?呵呵,舉個例子好了,比如說某共享軟體,它比較用戶輸入的註冊碼,如果用戶輸入的,跟它通過用戶名(或其它)算出來的註冊碼相等的話(也就是說用戶輸入的註冊碼正確了),那么它就會跳到註冊成功的地方去,否則就跳到出錯的地方去。
明白過來了吧,我們只要找到這個跳轉指令,把它修改為我們需要的“造型”,這樣,我們是不是就可以為所欲為了?
常見的修改方法有兩種,我給你舉例說明:
no.1
在某軟體中,這樣來進行註冊:
00451239 CALL 00405E02 (關鍵CALL,用來判斷用戶輸入的註冊碼是否正確)
0045123D JZ 004572E6 (!!!<--此為關鍵跳轉,如果用戶輸入的註冊碼正確,就跳向成功處,即004572E6處)
0045XXXX YYYYYYYYYY
XXXXXXXX YYYYYYYYYY
XXXXXXXX YYYYYYYYYY
XXXXXXXX 執行到此處,就提示用戶註冊失敗
..提示用戶註冊碼不正確等相關信息
...
004572E6 ... <--(註冊成功處!!!)
...提示用戶註冊成功等相關信息
呵呵,看明白了嗎?沒有的話,我來給你講一下。在軟體執行到00451239處的時候,CALL置0045E02處來進行註冊碼判斷。接著回來後就來一個跳轉語句,即如果用戶輸入的註冊碼正確就跳到004572E6處,跳到此處,就算是註冊成功了。如果用戶輸入的註冊碼不正確的話,那么就不會在0045123D處進行跳轉,而一直執行下去。在下面等它的,是註冊失敗部分。
想明白了嗎?嘿嘿...沒錯,我們只要把那個關鍵跳轉JZ給改為JNZ(如果用戶輸入的註冊碼錯誤,就註冊成功,輸入正確則註冊失敗)。當然你也可以將JNZ修改為Jmp,這樣的話,你輸入的註冊碼無論正確與否。都可以註冊成功。
no.2
我們再來講一下另外的一種情況:
00451239 CALL 00405E02 (關鍵CALL,用來判斷用戶輸入的註冊碼是否正確)
0045123D JNZ 004572E6 (!!!<--此為關鍵跳轉,如果用戶輸入的註冊碼不正確,就跳向失敗處,即004572E6處)
0045XXXX YYYYYYYYYY
XXXXXXXX YYYYYYYYYY
XXXXXXXX YYYYYYYYYY
XXXXXXXX 執行到此處,就提示用戶註冊成功
...提示用戶註冊成功等相關信息
...
004572E6 ... <--(註冊失敗處!!!)
...提示用戶註冊碼不正確等相關信息
你一定看出跟第一種情況不同的地方了吧。沒錯!它與第一種不同的,就是第一種情況是如果註冊碼正確,就跳到註冊成功處,如果沒有跳走,就會執行到失敗處。而這一種情況則是如果註冊碼不正確,就跳到註冊失敗處,否則將執行到註冊成功處。
這種情況的修改,除了把JNZ改為JZ外,還可以將其改為Nop,Nop這個指令沒有任何意義,將該條指令修改為Nop後,便可隨意輸入註冊碼來進行註冊了。
原理以經給你講了,下面我們再來講一下具體的修改辦法吧。
先說一下虛擬地址和偏移量轉換的問題,在SoftICE和W32Dasm下顯示的地址值是所謂的記憶體地址(memory offset),或稱之為虛擬地址(Virual Address,VA)。
而十六進制工具里,如:Hiew、Hex Workshop等顯示的地址就是檔案地址,稱之為偏移量(File offset) 或物理地址(RAW offset)。
所以當我們要通過那些十六進制工具來對執行檔中的相應指令進行修改的話,先要找到它的File offset。我們沒有必要去使用那些專門的轉換工具,在W32Dasm中就有這個功能,比如說你W32Dasm中來到0045123D處,在W32Dasm界面下方的狀態欄中就會出現該條指令的虛擬地址和偏移地址,即@:0045123D @offset 0005063Dh 後面的這個0005063Dh就是相應的偏移地址。我們得到該地址後,便可用UltraEdit等十六進制工具來對執行檔進行修改了。比如使用UltraEdit,你先用UltraEdit打開該執行檔,然後按Ctrl+G,接著輸入你得到的偏移地址,就可以來到其相應的機器碼處。
再給你講一下機器碼,所謂的機器碼。就是你看到的那些個十六進制數據了。還記的它們與彙編指令是一一對應的嗎?
以下這幾個是爆破時要用到的,其它的如果感興趣,可自行查看相關資料:
JZ=74;JNZ=75;JMP=EB;Nop=90
爆破的時候,只要對以上機器碼進行相應的修改就行了,比如第一種情況的時候,可以將74修改為EB,即將JZ修改為JMP。而第二種情況,責需將75修改為90,即將JNZ修改為Nop。
上邊講了爆破的原理,你需要明白的是。爆破只是你學習Crack的開始,是很簡單的手段。剛入門的時候可以玩玩兒,但希望你不要就此不前!
其實要找到註冊碼並不是一件多么難的事,我是指你所針對的軟體不太那個的時候 不過你無需懼怕。
剛才我們說爆破的時候不提到過關鍵CALL嗎?一般情況下,這個關鍵CALL就是對兩個註冊碼(一個是軟體自身通過你的註冊名或機器什麼的計算出來的正確的註冊碼,令一個就是你輸入的錯誤的註冊碼)進行比較。我前邊提到過,CALL之前一般會把所用到的數據先放到一個地方,CALL過去的時候再從這些地方把先前放入的數據取出來,進行相應的處理。這個關鍵CALL也是這樣,在CALL之前,一般會把那兩個註冊碼放到堆疊或某個暫存器中。嘿嘿,我們只要在調試器中,單步執行到該CALL,在未進去之前通過CALL之前的指令判斷其將正確的和不正確的註冊碼放到哪裡了。然後再用相應指令進行查看就成了,我說過不難的。
下面列出兩個最常見的情況:
no.1
mov eax [ ] 這裡可以是地址,也可以是其它暫存器
mov edx [ ] 同上,該條指令也可以是pop edx
call 00?????? 關鍵call
test eax eax
jz(jnz)或jne(je) 關鍵跳轉
看明白了吧,在關鍵CALL之前,軟體會把兩個註冊碼分別放入eax和edx中,你只要在CALL處下d eax或d edx就能看到正確的註冊碼了。
no.2
mov eax [ ] 這裡可以是地址,也可以是其它暫存器
mov edx [ ] 同上,該條指令也可以是pop edx
call 00?????? 關鍵call
jne(je) 關鍵跳轉
以上兩種情況最為常見,而那些個不太常見的情況,我們這裡就不再提了。到下下一章的時候,我會給你講相關方法的...
關於查找軟體註冊碼的部分,就到這裡。具體內容,下下一章咱們再說。(不是說了嗎?我以經可以接到你的磚頭了,幹嘛還要丟呢? )
最後,再來說最後的所謂的高級階段,如果你相信自己。並且熱愛Crack,那么你一定會熬到這個階段的,只是時間因人而異。
其實分析軟體的算法,是有好多技巧在裡面的。呵呵,最起碼我剛開始的時候就摸不著頭腦,那么多CALL,每個看起來,都很重要,都追一遍?結果連好多API都被追了進去。等你自己真正用心分析了一個軟體的算法,並寫出了註冊機後。你就會明白其中的道理了。