通過設(shè)置killtimer關(guān)鍵字函數(shù)斷點(diǎn)進(jìn)行尋找突破口
斷點(diǎn)設(shè)置完成之后灶伊,開始運(yùn)行軟件援制,直到運(yùn)行到我們想看到的輸入注冊(cè)碼窗口赠摇,后輸入錯(cuò)誤的注冊(cè)碼,進(jìn)行測(cè)試
輸入完成之后OD上顯示斷點(diǎn)的位置如下:
004DC19D > \83F8 03 cmp eax,0x3
004DC1A0 . 75 1E jnz short DVDMenuS.004DC1C0
004DC1A2 . 8B57 1C mov edx,dword ptr ds:[edi+0x1C] ; Case 3 of switch 004DBDA4
004DC1A5 . 50 push eax ; /TimerID = 0x3
004DC1A6 . 52 push edx ; |hWnd = 00080D4C ('DVD Menu Studio - [Untitled]',class='Afx:400000:8:10003:0:1560cb3')
004DC1A7 . FF15 B4575E00 call dword ptr ds:[<&USER32.KillTimer>] ; \KillTimer
004DC1AD . 6A 00 push 0x0
004DC1AF . 6A 00 push 0x0
004DC1B1 . 68 5C666400 push DVDMenuS.0064665C ; ASCII "The registration code seems to be not valid.\nPlease check if you didn't made any mistake."
004DC1B6 . E8 919D0D00 call DVDMenuS.005B5F4C
004DC1BB . E9 B7000000 jmp DVDMenuS.004DC277
004DC1C0 > 83F8 04 cmp eax,0x4
004DC1C3 . 75 1E jnz short DVDMenuS.004DC1E3
004DC1C5 . 50 push eax ; /TimerID = 0x3; Case 4 of switch 004DBDA4
004DC1C6 . 8B47 1C mov eax,dword ptr ds:[edi+0x1C] ; |
004DC1C9 . 50 push eax ; |hWnd = 00000003
004DC1CA . FF15 B4575E00 call dword ptr ds:[<&USER32.KillTimer>] ; \KillTimer
004DC1D0 . 6A 00 push 0x0
004DC1D2 . 6A 00 push 0x0
004DC1D4 . 68 FC656400 push DVDMenuS.006465FC ; ASCII "Thank you for your support!\nPlease Exit the Software and start it again to validate the code."
004DC1D9 . E8 6E9D0D00 call DVDMenuS.005B5F4C
004DC1DE . E9 94000000 jmp DVDMenuS.004DC277
004DC1E3 > 83F8 05 cmp eax,0x5
004DC1E6 . 75 15 jnz short DVDMenuS.004DC1FD
此時(shí)發(fā)現(xiàn)注冊(cè)成功的標(biāo)志位置:
004DC1D4 . 68 FC656400 push DVDMenuS.006465FC ; ASCII "Thank you for your support!\nPlease Exit the Software and start it again to validate the code."
那通過觀察上下匯編指令区拳,可知要讓其在等于4的時(shí)候成立拘领,做到j(luò)nz指令不跳轉(zhuǎn)從而實(shí)現(xiàn)破解成功。
這是主體實(shí)現(xiàn)破解成功思路樱调。
通過分析约素,我門要找其根源,那么我們就跟進(jìn)下去本涕,從比較條件為3的時(shí)候向上跟蹤业汰。
004DC19D > \83F8 03 cmp eax,0x3
從此處開始, 發(fā)現(xiàn)其跳轉(zhuǎn)來自eax=00000003
跳轉(zhuǎn)來自 004DC04C
通過操作跳轉(zhuǎn)如下:
004DC049 > \83F8 02 cmp eax,0x2
004DC04C . 0F85 4B010000 jnz DVDMenuS.004DC19D
再根據(jù)其條件不等于2 查看跳轉(zhuǎn)來自的地址進(jìn)行回溯跟蹤菩颖。
004DC049 > \83F8 02 cmp eax,0x2
eax=00000003
跳轉(zhuǎn)來自 004DBE01
跳轉(zhuǎn)到下面
004DBDFE > \83F8 07 cmp eax,0x7
004DBE01 . 0F85 42020000 jnz DVDMenuS.004DC049
同上
004DBDFE > \83F8 07 cmp eax,0x7
eax=00000003
跳轉(zhuǎn)來自 004DBDA9
跳轉(zhuǎn)如下:
004DBDA4 . 83F8 01 cmp eax,0x1 ; Switch (cases 1..B)
004DBDA7 . 8BF9 mov edi,ecx
004DBDA9 . 75 53 jnz short DVDMenuS.004DBDFE
004DBDAB . 50 push eax ; /TimerID = 0x3; Case 1 of switch 004DBDA4
此時(shí)發(fā)現(xiàn)跳轉(zhuǎn)到程序的開頭入口點(diǎn)
使用的是switch 語(yǔ)句結(jié)構(gòu)進(jìn)行跳轉(zhuǎn)样漆,跳轉(zhuǎn)條件從1-B
在程序的開頭設(shè)置斷點(diǎn),重新跑程序晦闰,查看程序運(yùn)行過程的eax的值這么發(fā)送變化的放祟。
觀察可知,程序通過switch循環(huán)呻右,進(jìn)行判斷跪妥,當(dāng)輸入錯(cuò)誤的注冊(cè)碼時(shí),eax=3声滥,那么程序運(yùn)行到這個(gè)位置和3進(jìn)行比較相等眉撵,那么就跳轉(zhuǎn),
執(zhí)行到錯(cuò)誤提示的位置如下:
004DC1D4 . 68 FC656400 push DVDMenuS.006465FC ; ASCII "Thank you for your support!\nPlease Exit the Software and start it again to validate the code."
那么此處突破口的關(guān)鍵位置如下:
004DBD9E . 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004DBDA1 . 53 push ebx ; DVDMenuS.004DBD80
004DBDA2 . 56 push esi
004DBDA3 . 57 push edi
004DBDA4 . 83F8 01 cmp eax,0x1 ; Switch (cases 1..B)
上述理論上通過更改 004DBD9E . 8B45 08 mov eax,dword ptr ss:[ebp+0x8] 為 mov eax, 4
便可得到破解的目的落塑,但通過測(cè)試發(fā)現(xiàn)纽疟,如果這樣修改第一個(gè)會(huì)導(dǎo)致增加后源程序多了兩個(gè)字節(jié)的數(shù)據(jù),這樣就會(huì)導(dǎo)致堆棧不對(duì)稱平衡憾赁,
從而影響整個(gè)程序運(yùn)行污朽,或者運(yùn)行不正常,那么我們就不能這樣修改龙考,所以此處要用到經(jīng)典的破解手法就是內(nèi)聯(lián)補(bǔ)丁蟆肆。
內(nèi)聯(lián)補(bǔ)斗馈:表示就是通過找到程序中沒有實(shí)際代碼指令的位置,添加要破解的指令炎功,通過互相跳轉(zhuǎn)來實(shí)現(xiàn)不影響程序運(yùn)行的目的實(shí)現(xiàn)最終的破解枚冗。
制作內(nèi)聯(lián)補(bǔ)丁(內(nèi)嵌補(bǔ)锻鑫省)
005E47C0 00 db 00
005E47C1 00 db 00
005E47C2 00 db 00
005E47C3 00 db 00
005E47C4 00 db 00
005E47C5 00 db 00
005E47C6 00 db 00
005E47C7 00 db 00
005E47C8 00 db 00
005E47C9 00 db 00
005E47CA 00 db 00
005E47CB 00 db 00
005E47CC 00 db 00
005E47CD 00 db 00
005E47CE 00 db 00
005E47CF 00 db 00
005E47D0 00 db 00
005E47D1 00 db 00
005E47D2 00 db 00
類似找到上面沒有編寫匯編指令的代碼處官紫,在內(nèi)嵌補(bǔ)丁的過程中 盡量不要在剛開始的位置進(jìn)行內(nèi)嵌,要盡量空出幾行進(jìn)行州藕,
那么從地址 005E47D0 開始
根據(jù)下面的關(guān)鍵代碼位置進(jìn)行更改
004DBD9E > . 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004DBDA1 . 53 push ebx ; DVDMenuS.004DBD80
004DBDA2 . 56 push esi
004DBDA3 . 57 push edi
更改如下:
005E47D0 > B8 04000000 mov eax,0x4
005E47D5 53 push ebx ; DVDMenuS.004DBD80
005E47D6 56 push esi
005E47D7 00 db 00
然后到 地址 004DBD9E 處將其更改為 jmp 005E47D0
讓程序運(yùn)行到此處跳轉(zhuǎn)至我們?cè)O(shè)置好的內(nèi)嵌補(bǔ)丁
然后在地址 005E47D7 添加jmp 004DBDA3 讓其跳轉(zhuǎn)至正常程序的下面代碼執(zhí)行后面的流程,如下:
004DBD9E > /E9 2D8A1000 jmp <DVDMenuS.添加內(nèi)嵌補(bǔ)丁的開頭位置>
004DBDA3 . |57 push edi
上面操作 導(dǎo)致一個(gè)死循環(huán)酝陈,還沒有完全破解床玻。
所以通過整體觀察,發(fā)現(xiàn)switch在跳轉(zhuǎn)到B的時(shí)候沉帮,就會(huì)跳出循環(huán)锈死,最終將其改為如下:
005E47D0 B8 0B000000 mov eax,0xB
005E47D5 . 53 push ebx
005E47D6 . 56 push esi
005E47D7 .^ E9 C775EFFF jmp DVDMenuS.004DBDA3
將005E47D0 B8 0B000000 mov eax,0xB 改為等于B 就跳出循環(huán),成功破解穆壕。
005ABE4D $ B8 442D5E00 mov eax,DVDMenuS.005E2D44
004DC0D1 . E8 77FD0C00 call DVDMenuS.005ABE4D
執(zhí)行完整個(gè)程序待牵,堆棧的調(diào)用過程
調(diào)用堆棧: 主線程
地址 堆棧 函數(shù)過程 / 參數(shù) 調(diào)用來自 結(jié)構(gòu)
0018FA60 758C7C1D user32.758C78C2 user32.758C7C18 0018FA7C
0018FA80 005B044F user32.GetMessageA DVDMenuS.005B0449 0018FA7C
0018FA84 00662858 pMsg = DVDMenuS.00662858
0018FA88 00000000 hWnd = NULL
0018FA8C 00000000 MsgFilterMin = 0x0
0018FA90 00000000 MsgFilterMax = 0x0
0018FA9C 005AF0A2 包含DVDMenuS.005B044F DVDMenuS.005AF09F
0018FAC0 005ABF2E DVDMenuS.005AEFC8 DVDMenuS.005ABF29
0018FAFC 004DC0D6 ? DVDMenuS.005ABE4D DVDMenuS.004DC0D1
我們查找的話,也要查找最后的那個(gè)調(diào)用來自喇勋, 要從這里找缨该,找到調(diào)用nag窗口的來源地址,然后雙擊川背,進(jìn)入
當(dāng)找到這個(gè)關(guān)鍵的地址贰拿,就要在這個(gè)關(guān)鍵位置的上下文的開始下個(gè)斷點(diǎn)進(jìn)行跟進(jìn)
另一種方法,牛逼而且簡(jiǎn)單熄云,待強(qiáng)化
將004DBDC5 /75 1F jnz short DVDMenuS.004DBDE6
修改為nop保存即可膨更。