新手学逆向,调试abexcm1过程
寫在前面的話:在下完全就是一個(gè)新手,現(xiàn)在目前在學(xué)16位匯編,偶爾用OD調(diào)試看看程序,主要就是為了學(xué)習(xí),今天寫這個(gè)帖子,完全就是筆記用,然后拿出來和大家一起討論交流。
因?yàn)閯傞_始接觸,文章可能一些地方有錯(cuò)誤,如果有錯(cuò)誤的地方還請(qǐng)指出來,畢竟剛學(xué),確實(shí)差的十萬八千里。而且這個(gè)程序也很簡(jiǎn)單,主要還是為了做記錄。
?
網(wǎng)上找了個(gè)abexcm1,然后進(jìn)行調(diào)試。
我個(gè)人的習(xí)慣,當(dāng)首先拿到 程序的時(shí)候,我都會(huì)按F8直接把程序走一遍,看看大概的流程。
?
?
這個(gè)程序的功能很簡(jiǎn)單,匹配C:\驅(qū)動(dòng)器的屬性,如果成功,就彈出開OK,如果失敗,就彈出來失敗。兩者均退出程序。
?
?
00401000 >/$ 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL ;將數(shù)據(jù)入棧 00401002 |. 68 00204000 push 00402000 ; |Title = "abex' 1st crackme" 將數(shù)據(jù)入棧 00401007 |. 68 12204000 push 00402012 ; |Text = "Make me think your HD is a CD-Rom." 將數(shù)據(jù)入棧 0040100C |. 6A 00 push 0 ; |hOwner = NULL 將數(shù)據(jù)入棧 0040100E |. E8 4E000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA 調(diào)用WIN API 00401013 |. 68 94204000 push 00402094 ; /RootPathName = "c:\" ;將00402094 數(shù)據(jù)入棧 00401018 |. E8 38000000 call <jmp.&KERNEL32.GetDriveTypeA> ; \GetDriveTypeA ; ; 調(diào)用WIN API 0040101D |. 46 inc esi ;esi +1 =1 eax = 03 0040101E |. 48 dec eax exc-1 = 02 0040101F |. EB 00 jmp short 00401021 ;垃圾指令 00401021 |> 46 inc esi esi = 2 00401022 |. 46 inc esi esi = 3 00401023 |. 48 dec eax eax-1 = 01 00401024 |. 3BC6 cmp eax, esi ; 比較值,如果值相等,JE條件跳轉(zhuǎn),如果不相等,繼續(xù)走下去 00401026 |. 74 15 je short 0040103D ;值不相等,無法段內(nèi)段轉(zhuǎn)移,繼續(xù)走下去 00401028 |. 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL 0040102A |. 68 35204000 push 00402035 ; |Title = "Error" 0040102F |. 68 3B204000 push 0040203B ; |Text = "Nah... This is not a CD-ROM Drive!" 00401034 |. 6A 00 push 0 ; |hOwner = NULL 00401036 |. E8 26000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA ;調(diào)用MESSAGEBOX彈出錯(cuò)誤 0040103B |. EB 13 jmp short 00401050 ;t跳轉(zhuǎn) 0040103D |> 6A 00 push 0 ; |/Style = MB_OK|MB_APPLMODAL ;調(diào)用成功的函數(shù), 0040103F |. 68 5E204000 push 0040205E ; ||Title = "YEAH!" 00401044 |. 68 64204000 push 00402064 ; ||Text = "Ok, I really think that your HD is a CD-ROM! :p" 00401049 |. 6A 00 push 0 ; ||hOwner = NULL 0040104B |. E8 11000000 call <jmp.&USER32.MessageBoxA> ; |\MessageBoxA 00401050 \> E8 06000000 call <jmp.&KERNEL32.ExitProcess> ; \ExitProcess ;程序退出。從以上我們可以看出,程序2次彈出來了MESSAGEBOX,那如何來破解呢?、
?
?
我們知道,破解中最注意的應(yīng)該就是跳轉(zhuǎn)之前的比較指令,
?
0040101D |. 46 inc esi 0040101E |. 48 dec eax 0040101F |. EB 00 jmp short 00401021 00401021 |> 46 inc esi 00401022 |. 46 inc esi 00401023 |. 48 dec eax 00401024 |. 3BC6 cmp eax, esi 00401026 |. 74 15 je short 0040103D以上可以看出,如果比較的值相等,就繼續(xù)執(zhí)行,如果不相等,就轉(zhuǎn)到另外一個(gè)MESSAGEBOX函數(shù)出,直接調(diào)用API。
那我們可以直接讓他相等就好了,或者直接JMP 無條件跳轉(zhuǎn)到0040103D地址處調(diào)用成功的MESSAGEBOX API,就達(dá)到了破解的功能。
?
?
?
?
下面我們來跟蹤每一次執(zhí)行完以后的寄存器的變化。
寄存器相關(guān)的值:
?
EAX= 75E23358 ;一般用來存放臨時(shí)數(shù)據(jù) ECX= 00000000 ;ECX一般用來進(jìn)行LOOP循環(huán)才會(huì)用到 EDX= 00401000 ;數(shù)據(jù)寄存器, EBX= 7EFDE000 ;基址寄存器,常用來存放訪問內(nèi)在時(shí)的基地址 ESP= 0018FF8C ;棧頂指針,指向棧頂?shù)刂?#xff0c;在32為寄存器中,碰到PUSH的時(shí)候,SP = SP-4,pop的時(shí)候,POP = POP + 4 EBP= 0018FF94 ;是基址指針,段地址默認(rèn)在SS中.可以定位物理地址 ESI= 00000000 ;源變址寄存器,默認(rèn)段地址和DI一樣,在DS中.和DS聯(lián)用 EDI= 00000000 ;變址寄存器.可以和bx.bp聯(lián)用 EIP= 00401000 ;EIP指向當(dāng)前要執(zhí)行的指令,每次EIP= EIP+執(zhí)行指令的長度?
//標(biāo)志位沒寫00401000 >/$ 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL 00401002 |. 68 00204000 push 00402000 ; |Title = "abex' 1st crackme" 00401007 |. 68 12204000 push 00402012 ; |Text = "Make me think your HD is a CD-Rom." 0040100C |. 6A 00 push 0 ; |hOwner = NULL 0040100E |. E8 4E000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA 00401013 |. 68 94204000 push 00402094 ; /RootPathName = "c:\" 00401018 |. E8 38000000 call <jmp.&KERNEL32.GetDriveTypeA> ; \GetDriveTypeA
當(dāng)執(zhí)行push? ? 00402000,其實(shí)就是將 00402000 這個(gè)內(nèi)存地址的數(shù)據(jù)壓入桟。
我們來看00402000的數(shù)據(jù)
push? ? 0
為空
?
call <jmp.&USER32.MessageBoxA> 調(diào)用MESSAGEBOX API
在執(zhí)行CALL <jmp.&USER32.MessageBoxA>,MessageBoxA 的內(nèi)存地址在 00401061,直接 調(diào)用了API,彈出MESSAGEBOX
CALL API(也可以說是標(biāo)號(hào))。將執(zhí)行2步操作:
?
1:PUSH IP 1:JMP NEAR PTR 標(biāo)號(hào)0040101D |. 46 inc esi 0040101E |. 48 dec eax 0040101F |. EB 00 jmp short 00401021 ;垃圾指令 00401021 |> 46 inc esi 00401022 |. 46 inc esi 00401023 |. 48 dec eax 00401024 |. 3BC6 cmp eax
以上均是數(shù)據(jù)比較。
然后在進(jìn)行條件跳轉(zhuǎn)。
這次的分析就到這兒了,因?yàn)槌鯇W(xué),難免錯(cuò)誤,還請(qǐng)多多指點(diǎn)。各位勿噴。謝謝
轉(zhuǎn)載于:https://www.cnblogs.com/killbit/p/4851398.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的新手学逆向,调试abexcm1过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 1091 跳蚤
- 下一篇: LA 4254 Processor 处理