小甲鱼 OllyDbg 教程系列 (一) :二进制破解科普系列之 ReverseMe
?
?
小甲魚 視頻教程(?4、5?集?):https://www.bilibili.com/video/av6889190?p=4
實驗程序 reverseME.exe?下載地址:https://pan.baidu.com/s/18NDV3rQ_yV_qzUrNRYmqjA ? ?提取碼:e91j?
http://www.360doc.com/content/16/0220/00/26186435_535858733.shtml
?
?
0. 前言
?
本系列為二進制破解科普系列教程。教程面向新手愛好者,歡迎大家探討、建議,大牛輕噴。
?
?
1. 準備工作
?
在學習之前,我們需要了解以下的內容:
?
1.寄存器:
寄存器就好比是CPU身上的口袋,方便CPU隨時從里邊拿出需要的東西來使用。常見涉及到的九個寄存器:
?EAX : 擴展累加寄存器EBX : 擴展基址寄存器ECX : 擴展計數寄存器EDX : 擴展數據寄存器ESI : 擴展來源寄存器EDI : 擴展目標寄存器EBP : 擴展基址指針寄存器ESP : 擴展堆棧指針寄存器EIP : 擴展的指令指針寄存器這些寄存器的大小是32位(4個字節),他們可以容納數據從0-FFFFFFFF(無符號數),除了以下三個寄存器,其他我們都可以隨意使用:
?EBP : 主要是用于棧和棧幀。ESP : 指向當前進程的棧空間地址。EIP : 總是指向下一條要被執行的指令。?
2. 棧:棧是在內存中的一部分,它有兩個特殊的性質:
圖示:
?
3. CALL指令
? ? call有以下幾種方式:
?
4. 系統API
? ? Windows 應用程序運行在 Ring3 級別
API 函數,我們也稱之為系統提供給我們的接口。因為系統只信任自己提供的函數,所以我們要通過 API 才能實現對內核的操作。
?
5. mov指令
mov 指令格式:mov?dest,?src。這是一個很容易理解的指令,mov 指令將 src 的內容拷貝到 dest,
mov 指令總共有以下幾種擴展:movs/movsb/movsw/movsd?edi,esi:這些變體按串/字節/字/雙字為單位,將 esi 寄存器指向的數據復制到 edi 寄存器指向的空間。movsx符號位擴展,byte->word,word->dword?(擴展后高位全用符號位填充),然后實現mov。movzx零擴展,byte->word,word->dword(擴展后高位全用0填充),然后實現mov。
?
6. cmp指令
cmp 指令格式:cmp?dest,?src。cmp 指令比較 dest 和 src 兩個操作數,并通過比較結果設置 C/O/Z 標志位。
cmp 指令大概有以下幾種格式:
?
7. 標志位:在破解中起到的作用是至關重要的。
在逆向中,你真正需要關心的標志位只有三個,也就是 cmp 指令能修改的那三個:Z/O/C。
?
8. 邏輯運算
如圖:
?
9.test 指令
test 指令格式:test?dest,?src。這個指令 和 and 指令一樣,對兩個操作數進行按位的 ‘與’ 運算,唯一不同之處是不將 ‘與’ 的結果保存到 dest。即本指令對兩個操作數的內容均不進行修改,僅是在邏輯與操作后,對標志位重新置位。
?
10. 條件跳轉指令
條件跳轉指令,就是根據各種不同標志位的條件判斷是否成立,條件成立則跳轉。
?
?
2. 破解 ReverseMe
?
按 F3 載入程序:
首先,我們來看看程序圖,我們先隨便的走一次,順便介紹對應的名詞。
LoadIconA??: 圖片的圖標
CreateFileA: 創建文件
當 跳轉不實現的時候,就執行下面的代碼段:
然后彈出消息框,結束進程。
我們的目的是想讓他跳轉實現,那我們怎么辦呢?就得跳過上面的代碼段,我們如何來修改對應的代碼段,來實現我們所要的效果呢?
要讓他跳轉實現的話,修改對應的 Z=0 就實現跳轉。
這里已經實現跳轉了,我們這節課肯定不像上面的課程那么簡單了,直接一步到位,我們這節課的話,需要跳轉幾個位置,要不然我們怎么能突破障礙呢?
那接下來,我們繼續走我們的調試文件!
ReadFile:讀取一個文件
這里我們要明白為什么要去ReadFile呢?因為這里的話,要去讀取一個密鑰的文件,所以這里才需要ReadFile。
-
?test 指令格式:test?dest,?src
-
?test 指令和 and 指令一樣,對兩個操作數進行按位的‘與’運算,唯一不同之處是不將‘與’?的結果保存到dest。
-
?jnz條件跳轉
-
?jmp:無條件跳轉
一般我們想讓條件跳轉判斷的話,看如下圖:
我們又遇到一個跳轉未實現的值,其實在這里也是一個坑來的,那我們和上面一樣,讓他跳轉的值實現。同樣把寄存器區的Z值修改為 Z=0?從而達到跳轉的效果。
ebx 的值等于 0 的話可以看看寄存器上的 ebx 的值。
這里看到的是xor的條件判斷,對相應的值清0
下面我們走到的密鑰區,如下圖所示:
我們可以看到這里的跳轉已實現,那想想這里是不是我們的第三個障礙呢?
分析到下面的語句,發現這里要是直接走下去的話,會誤人程序的陷阱,那我們的目的只能讓跳轉不實現了,j1的跳轉判斷的話,可以看我們上面的跳轉圖。要讓jl不實現的話,我們這里需要讓SF!=OF,從而達到我們想要的效果。
就可以達到跳轉不實現,我們跳過這個障礙之后,我們繼續走,繼續看我們的程序。
繼續走我們的程序,我們又遇到一個跳轉已實現的,分析到下面的代碼,發現會跳轉到密鑰區,所以我們繼續讓他不實現。看他的條件語句:
讓SF!=OF的值相等就行,那在這里修改S的值,讓S=1變為S=0就可以達到所要的效果。
通過修改后,可以看到跳轉未實現。
接下來,我們繼續走我們的程序,走到jmp是無條件跳轉,就讓他跳吧。
我們跳轉到這里的話,我們看到text里面的提示:You?really?did?it!?Congratz?!!!?提示你破解已經成功咯。
是不是有點小小的激動呢?
?
?
以上都是?根據??[魚C]小甲魚主講OD使用教程(第4、5集):https://www.bilibili.com/video/av6889190/?p=4
?
?
?
總結
以上是生活随笔為你收集整理的小甲鱼 OllyDbg 教程系列 (一) :二进制破解科普系列之 ReverseMe的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一篇文章带你领悟 Frida 的精髓(基
- 下一篇: Java8 Stream详解~映射(ma