日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小甲鱼 OllyDbg 教程系列 (一) :二进制破解科普系列之 ReverseMe

發(fā)布時間:2024/7/23 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小甲鱼 OllyDbg 教程系列 (一) :二进制破解科普系列之 ReverseMe 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

?

小甲魚 視頻教程(?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. 前言

?

本系列為二進(jìn)制破解科普系列教程。教程面向新手愛好者,歡迎大家探討、建議,大牛輕噴。

?

?

1. 準(zhǔn)備工作

?

在學(xué)習(xí)之前,我們需要了解以下的內(nèi)容:

?

1.寄存器:

寄存器就好比是CPU身上的口袋,方便CPU隨時從里邊拿出需要的東西來使用。常見涉及到的九個寄存器:

?EAX : 擴展累加寄存器EBX : 擴展基址寄存器ECX : 擴展計數(shù)寄存器EDX : 擴展數(shù)據(jù)寄存器ESI : 擴展來源寄存器EDI : 擴展目標(biāo)寄存器EBP : 擴展基址指針寄存器ESP : 擴展堆棧指針寄存器EIP : 擴展的指令指針寄存器

這些寄存器的大小是32位(4個字節(jié)),他們可以容納數(shù)據(jù)從0-FFFFFFFF(無符號數(shù)),除了以下三個寄存器,其他我們都可以隨意使用:

?EBP : 主要是用于棧和棧幀。ESP : 指向當(dāng)前進(jìn)程的棧空間地址。EIP : 總是指向下一條要被執(zhí)行的指令。

?

2. 棧:棧是在內(nèi)存中的一部分,它有兩個特殊的性質(zhì):

  • FILO(Fisrt In Last Out,先進(jìn)后出)
  • 地址反向增長(棧底為大地址,棧頂為小地址)
  • 圖示:

    ?

    3. CALL指令

    ? ? call有以下幾種方式:

  • call?404000h?;? ? 直接跳到函數(shù)或過程的地址
  • call?eax?;? ? ? ? ? ? 函數(shù)或過程地址存放在eax
  • call?dword?ptr?[eax]
  • ?

    4. 系統(tǒng)API

    ? ? Windows 應(yīng)用程序運行在 Ring3 級別

    API 函數(shù),我們也稱之為系統(tǒng)提供給我們的接口。因為系統(tǒng)只信任自己提供的函數(shù),所以我們要通過 API 才能實現(xiàn)對內(nèi)核的操作。

    ?

    5. mov指令

    mov 指令格式:mov?dest,?src。這是一個很容易理解的指令,mov 指令將 src 的內(nèi)容拷貝到 dest,

    mov 指令總共有以下幾種擴展:movs/movsb/movsw/movsd?edi,esi:這些變體按串/字節(jié)/字/雙字為單位,將 esi 寄存器指向的數(shù)據(jù)復(fù)制到 edi 寄存器指向的空間。movsx符號位擴展,byte->word,word->dword?(擴展后高位全用符號位填充),然后實現(xiàn)mov。movzx零擴展,byte->word,word->dword(擴展后高位全用0填充),然后實現(xiàn)mov。

    ?

    6. cmp指令

    cmp 指令格式:cmp?dest,?src。cmp 指令比較 dest 和 src 兩個操作數(shù),并通過比較結(jié)果設(shè)置 C/O/Z 標(biāo)志位。

    cmp 指令大概有以下幾種格式:

  • cmp?eax,?ebx? ? ? ? ? ? ?; 如果相等,Z標(biāo)志位置1,否則0.
  • cmp?eax,?[404000]? ? ?; 將eax和404000地址處的dword型數(shù)據(jù)相比較并同上置位。
  • cmp?[404000],?eax? ? ?; 同上。
  • ?

    7. 標(biāo)志位:在破解中起到的作用是至關(guān)重要的。

    在逆向中,你真正需要關(guān)心的標(biāo)志位只有三個,也就是 cmp 指令能修改的那三個:Z/O/C。

  • Z 標(biāo)志位(0標(biāo)志),這個標(biāo)志位是最常用的,運算結(jié)果為0時候,Z標(biāo)志位置1,否則置0。
  • O 標(biāo)志位(溢出標(biāo)志),在運行過程中,如操作數(shù)超出了機器能表示的范圍則稱為溢出,此時OF位置1,否則置0。
  • C 標(biāo)志位(進(jìn)位標(biāo)志),記錄運算時從最高有效位產(chǎn)生的進(jìn)位值。例如執(zhí)行加法指令時,最高有效位有進(jìn)位時置1,否則置為 0 。
  • ?

    8. 邏輯運算

    如圖:

    ?

    9.test 指令

    test 指令格式:test?dest,?src。這個指令 和 and 指令一樣,對兩個操作數(shù)進(jìn)行按位的 ‘與’ 運算,唯一不同之處是不將 ‘與’ 的結(jié)果保存到 dest。即本指令對兩個操作數(shù)的內(nèi)容均不進(jìn)行修改,僅是在邏輯與操作后,對標(biāo)志位重新置位。

    ?

    10. 條件跳轉(zhuǎn)指令

    條件跳轉(zhuǎn)指令,就是根據(jù)各種不同標(biāo)志位的條件判斷是否成立,條件成立則跳轉(zhuǎn)。

    ?

    ?

    2. 破解 ReverseMe

    ?

    按 F3 載入程序:

    首先,我們來看看程序圖,我們先隨便的走一次,順便介紹對應(yīng)的名詞。

    LoadIconA??: 圖片的圖標(biāo)
    CreateFileA: 創(chuàng)建文件

    當(dāng) 跳轉(zhuǎn)不實現(xiàn)的時候,就執(zhí)行下面的代碼段:

    然后彈出消息框,結(jié)束進(jìn)程。

    我們的目的是想讓他跳轉(zhuǎn)實現(xiàn),那我們怎么辦呢?就得跳過上面的代碼段,我們?nèi)绾蝸硇薷膶?yīng)的代碼段,來實現(xiàn)我們所要的效果呢?

    要讓他跳轉(zhuǎn)實現(xiàn)的話,修改對應(yīng)的 Z=0 就實現(xiàn)跳轉(zhuǎn)。

    這里已經(jīng)實現(xiàn)跳轉(zhuǎn)了,我們這節(jié)課肯定不像上面的課程那么簡單了,直接一步到位,我們這節(jié)課的話,需要跳轉(zhuǎn)幾個位置,要不然我們怎么能突破障礙呢?

    那接下來,我們繼續(xù)走我們的調(diào)試文件!

    ReadFile:讀取一個文件

    這里我們要明白為什么要去ReadFile呢?因為這里的話,要去讀取一個密鑰的文件,所以這里才需要ReadFile。

    • ?test 指令格式:test?dest,?src

    • ?test 指令和 and 指令一樣,對兩個操作數(shù)進(jìn)行按位的‘與’運算,唯一不同之處是不將‘與’?的結(jié)果保存到dest。

    • ?jnz條件跳轉(zhuǎn)

    • ?jmp:無條件跳轉(zhuǎn)

    一般我們想讓條件跳轉(zhuǎn)判斷的話,看如下圖:

    我們又遇到一個跳轉(zhuǎn)未實現(xiàn)的值,其實在這里也是一個坑來的,那我們和上面一樣,讓他跳轉(zhuǎn)的值實現(xiàn)。同樣把寄存器區(qū)的Z值修改為 Z=0?從而達(dá)到跳轉(zhuǎn)的效果。

    ebx 的值等于 0 的話可以看看寄存器上的 ebx 的值。

    這里看到的是xor的條件判斷,對相應(yīng)的值清0

    下面我們走到的密鑰區(qū),如下圖所示:

    我們可以看到這里的跳轉(zhuǎn)已實現(xiàn),那想想這里是不是我們的第三個障礙呢?

    分析到下面的語句,發(fā)現(xiàn)這里要是直接走下去的話,會誤人程序的陷阱,那我們的目的只能讓跳轉(zhuǎn)不實現(xiàn)了,j1的跳轉(zhuǎn)判斷的話,可以看我們上面的跳轉(zhuǎn)圖。要讓jl不實現(xiàn)的話,我們這里需要讓SF!=OF,從而達(dá)到我們想要的效果。

    就可以達(dá)到跳轉(zhuǎn)不實現(xiàn),我們跳過這個障礙之后,我們繼續(xù)走,繼續(xù)看我們的程序。

    繼續(xù)走我們的程序,我們又遇到一個跳轉(zhuǎn)已實現(xiàn)的,分析到下面的代碼,發(fā)現(xiàn)會跳轉(zhuǎn)到密鑰區(qū),所以我們繼續(xù)讓他不實現(xiàn)。看他的條件語句:

    讓SF!=OF的值相等就行,那在這里修改S的值,讓S=1變?yōu)镾=0就可以達(dá)到所要的效果。

    通過修改后,可以看到跳轉(zhuǎn)未實現(xiàn)。

    接下來,我們繼續(xù)走我們的程序,走到j(luò)mp是無條件跳轉(zhuǎn),就讓他跳吧。

    我們跳轉(zhuǎn)到這里的話,我們看到text里面的提示:You?really?did?it!?Congratz?!!!?提示你破解已經(jīng)成功咯。

    是不是有點小小的激動呢?

    ?

    ?

    以上都是?根據(jù)??[魚C]小甲魚主講OD使用教程(第4、5集):https://www.bilibili.com/video/av6889190/?p=4

    ?

    ?

    ?

    總結(jié)

    以上是生活随笔為你收集整理的小甲鱼 OllyDbg 教程系列 (一) :二进制破解科普系列之 ReverseMe的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。