第五章--破解原理

看雪資料發表於2015-11-15

第五章--破解原理
從本章開始,我們來一步一步學習Crack軟體(80%讀者昏死過去,且不省人世...另有20%在尋找附近可以用來打人的東西) 第五章--破解原理
不可不說一下學習破解的三個階段:
初級,修改程式,用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都被追了進去。等你自己真正用心分析了一個軟體的演算法,並寫出了序號產生器後。你就會明白其中的道理了,我們下下下一章再說。(大哥,你不是吧,連你家太陽能都丟過來了 第五章--破解原理
<本章完>

相關文章