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