OD調試9—實例:深入分析代碼完成軟件破解
爆破,是最初級的解決方案,不到萬不得已,我們不直接修改JNZ通關。因為這樣子的話,我們就享受不到破解、逆向的真正樂趣了。
了解程序背后按照劇情發展經常會出的一些走法,逆向程序的算法,才能體會逆向的真正樂趣!
所以,今天的主題是:是男人,就跟進去吧~
這次還是使用一個比較簡單的程序,不然太復雜的話,一步步跟進程序可能會把自己搞崩潰,腦子恐怕不夠搞。大家憑自己的能力,能進入多少就進入多少,一分不少,一寸不多!能力是培養出來的,耐心!
試驗軟件:MrBills.exe(一個掃描儀軟件)
軟件下載鏈接:http://pan.baidu.com/s/1hq7rKpu
運行起來看看:
記住這句注冊失敗的提示信息。因為它可以作為一個關鍵的字符串來尋找。
未注冊版的軟件一般會限制功能,注冊完成后才讓你使用所有功能。
用OD打開這個可執行文件,開始分析:
1 查找字符串:
Cpu窗口右鍵->查找所有參考文本字符串->查找注冊失敗的提示信息”You have entered an xxxxxx” (注意把進度條拉至文本子串最上方,因為它是從上往下查找的)
查找結果如下圖:
雙擊該字串,跟隨到cpu窗口代碼處。
在這里我們找到了上方一個突破口—跳轉jnz,這里如果jnz跳轉的話,就直接來到了注冊成功處:”Thank you for registering!”,所以它是一個關鍵跳轉。
2 分析:
(1)那么跳轉jnz的條件判斷是由誰引起的呢?
是在它上方的test al , al。因為這句會改變寄存器里標志位ZF的值(0或1)。
test進行的是邏輯與運算(and),如果兩個al為1的話,結果為1;兩個為0的話,結果為0。它不改變al的值,只會修改標志位。
此時通過eax寄存器可以看出al為0,所以ZF標志位為1,(運算結果為0時,標志位Z置1),進而jnz不會跳轉,即來到注冊失敗處。
由此我們就可以推理出,想辦法把al的值由0變為1,就可以實現關鍵跳轉,進而使軟件注冊成功了!!
(2)那么al的值在哪里被修改過呢?或者說是誰決定了al的值呢?
可以看到在test語句上方有一個call,我們在win32匯編語言里學過:Call調用函數進行一堆操作之后的返回值都存放在EAX里,也就是說這個call會影響到al的值。(al是eax的最低位/最后一個字節,eax是32位的,al是8位)
那么這個call就是需要進入分析的,在該處下斷點,重載后寫入注冊信息觸發該斷點,接着進入這個call里,來到下圖:
進入之后呢,不要盲目地按F8過,先觀察下程序內容(很多朋友就一直F8走,寄存器也不看,下面地址也不看,進行了什么樣的邏輯關系也不看,就是直接的走,然后就迷路了!)
觀察之后,我們發覺,又出現了兩個相連call和test(如上圖),這兩個call也會影響到我們關注的al的值,所以注釋上【需進入】,方便之后進入分析。下面進入第二個call里,如下圖:
進入第二個call里,發現了兩個關於al的可疑之處(如上圖),mov bl,al mov al,bl 這兩句是干啥呢?將al的值給bl,bl的值再還給al….??現在可以推想一下: bl可能是用來暫時保存數據的,al標志着是否已經被注冊,它不希望被修改,所以將al保存在bl里面,經過一些操作后,再將bl賦給al。那么在這之前,決定al值得call或許就是一個關鍵點!我們接着進入上圖中的第4個call,如下圖:
在這里走過一遍,發現al的值在這里被bl賦為0,這里就是修改的關鍵點了,將這個al的值修改為1的話,就應該注冊成功了,我們先走出去,稍后再來一輪在這里進行修改。
F8走出這里后回到第二個關鍵call的位置,如下圖:
繼續往下走,我們要繞出去!
好了,進到幾個關鍵call里用火眼金睛巡視了一番后,終於找到了注冊的關鍵所在,只要把第4個關鍵call里的al的值修改為1(原來為0),就應該可以注冊成功了!
修改如下:
修改后點擊運行:成功注冊了了!!
點擊確定,軟件變為了已注冊版: