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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第四课 脱壳必备知识要点及方法

發布時間:2025/3/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第四课 脱壳必备知识要点及方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

???????????????????????????? 第四課? 脫殼必備知識要點及方法

?

??? 今天所要講的是這高級篇中最為關鍵,最為重要的一課,希望大家能認真學習,反復推敲,舉一反三學習脫殼的各種方法,當然有的時候可能需要幾種方法一起使用,今后我們也會一點一點接觸到,今天我們先學習大體的幾種脫殼法。

?

一:常見脫殼調試法

?

二:預備知識

???

??? OEP是Original Entry Point縮寫,即程序加殼前的真正的入口點。

??? 外殼初始化的現場環境(各寄存器值)與原程序的現場環境是相同的。加殼程序初始化時保存各寄存器的值,外殼執行完畢,會恢復各寄存器內容。其代碼形式一般如下:

?

??? PUSHFD???????? ; 將標志寄存器入棧保存

??? PUSHAD???????? ; push eax, ecx, edx, ebx, esp, ebp, esi, edi

??? ……?????????? ; 外殼代碼部分

??? POPAD????????? ; pop edi, esi, ebp, esp, ebx, edx, ecx, eax

??? POPFD????????? ; 恢復標志寄存器

??? JMP OEP??????? ; 大的跳轉

??? OEP: ……????? ; 解壓后的程序原代碼

?

??? PUSHAD (壓棧) 代表程序的入口點,

??? POPAD? (出棧) 代表程序的出口點,與PUSHAD想對應,一般找到這個OEP就在附近

?

三:脫殼方法之單步跟蹤找OEP

???

??? 1.用OD載入,如果有提示是否分析代碼,就點“ 不分析代碼!”

??? 2.F8單步向下跟蹤調試,沒有實現的向上的跳,向下的跳都可以步過,阻止實現的向上的跳。

??? 3.遇到會跑飛的CALL我們就F7步入。

???

Btw:遇到程序無法向下跟蹤調試的時候,在附近(上下均可)找一個大跳轉(像下的實現的,跳的大小看線的長短)(如果找不到大的跳就找一個不跳的跳(沒有線),FSG2.0就是這樣),F4運行到該跳處,然后右鍵→跟隨或者回車到達跟隨的地址按F2下斷點,然后shift+F9(忽略異常運行)運行到跟隨的地址,然后再F2取消斷點,接著就可以F8繼續單步調試了(對于FSG2.0的課可能直接就到oep了,另外老版的OD可能會出現要你分析代碼,解決辦法:右鍵-->分析-->從模塊刪除目標文件)。另:在F8單步跟蹤的時候并不一定非要是在實現的向上的跳的下一句F4,如果是像:je,jne,ja,jna,等有條件的跳也可以繼續F8單步,因為你跟著循環個次它的條件一般就會改變然后向后走(它本身變成了為實現的跳了)。但是如果是像jmp這樣非條件的跳,如果你還F8單步的話它會一直循環,所以這種跳就必須F4。

?

清除OD的使用記錄:OD菜單-〉插件-〉文件清除-〉全部文件

退出OD,在OD目錄里有個UDD文件夾,把里面的東西刪除干凈,這樣就清除了OD的歷史記錄。

?

四:脫殼方法之根據堆棧平衡原理找OEP(ESP定律法)

???

??? 堆棧平衡原理找OEP,Lenus寫過一篇文章《尋找真正的入口(OEP)--廣義ESP定律》我會打包給大家,有興趣的可以自己看一下堆棧平衡原理,做免殺自己寫花指令也需要用到這個原理,所以這文章對大家相當有幫助。

?

??? 1.F8單步跟蹤調試在關鍵句的下一句,在OD寄存器窗口ESP突顯為紅色

??? 2.在OD命令行下輸入(dd ESP突顯紅色的地址) 或者 (hr ESP突顯紅色的地址)

??? 3.下硬件訪問斷點

??? 4.F9運行(然后刪除硬件斷點),繼續F8單步向下調試。

?

五:脫殼方法之內存斷點法找OEP(內存鏡像法)

?

??? 1.OD載入程序后,我們直接對code段下內存訪問斷點

??? 2.Shift+F9運行 (code段沒有解壓完畢,所以會不斷得中斷,連續按F9。當然這種方法是不可取的)

?

正確的方法是:我們使用兩次斷點法。

假設我是程序作者,一個程序有code段,data段,rsrc段....依次排列在你的內存空間中。那么我會怎么解碼呢?程序會先將code段解碼,然后再將data段解碼,接著是rsrc段....只要你在data段或者rsrc段下內存訪問斷點,那么中斷的時候code段就已經解壓完畢了。這時我們再對code段下內存訪問斷點,不就可以直接到達OEP了嗎?

?

綜上正確的操作方法是:

1, 1.OD載入程序-->查看-->內存-->在程序塊(屬主名和程序名一樣)的rsrc段F2-->Shift+F9(忽略異常運行到該斷點)-->然后再對code段(一般它的地址是:00401000)F2下斷-->Shift+F9(對于tElock直接就到OEP了,也不再F2-->Shift+9運行到該處了,因為這里對應的就是我們在code段設斷點的地方)。注:兩個斷點不用刪除

?

??? 總結一下:如果我們知道殼在什么地方對code段解壓完畢我們就可以使用內存斷點,找到OEP。如果不知道,那么我們就依靠2次內存斷點去找,如果還不行就用多次內存斷點。總之明白了原理再多次的內存斷點其實都一樣。

?

??? 局限性:當一個殼如果它在JMP到OEP前的一行代碼仍在對code段解壓,那么我們就不能再使用這種辦法了。更貼切得說,是我們沒必要使用這種方法。(如UPX,ASPACK)

?

六:脫殼方法之最后一次異常法

?

??? 1.OD載入程序后

??? 2.設置異常選項:選項——調試設置——異常(一般情況我們忽略所有的異常選項(去掉所有的勾選),當然后面根據猛殼的特點我們可以自己選擇設置異常選項,注意:只有用這種方法是需要設置這里,其它方法一定要全部勾選上,不然不能跟蹤下去的)

??? 3.重載下OD(然后,插件-->隱藏od-->隱藏(不然OD會跑飛的),然后不用重載了),我們按SHIFT+F9,直到程序跑起來為止,我們把按的次數記住

??? 4.再次重載OD,再次按SHIFT+F9,我們按到程序跑起來的前一次。(第一次如果按了21下程序跑起來了,那么我們第二次就按20次,跑起來的前一次)

??? 5.在OD的右下角(堆棧窗口)看見一個"SE句柄",這時我們按CTRL+G,輸入SE句柄前的數值(注:不是地址)!?

??? 6.來到SE句柄的地方我們按F2下斷,F9運行至斷點這,然后再F2取消斷點

??? 7.接著我們F8單步繼續向下調試

?

?

經驗:popad

????? Jmp? XXXX

????? 看到這兩句就應該引起我的注意,特別當jmp 沒注明short時,那么這里很可能就是殼的出口,也即OEP入口。

七:脫殼方法之其他方法

???

八:模擬跟蹤法

???

1.F9運行程序,確定是否有暗樁??闯绦蚰懿荒芘芷饋?#xff0c;如果程序能正常跑起來說明沒有暗樁(有暗樁才能用這種方法)

2,用“脫殼方法之最后一次異常法”(到6)(目的是把暗樁給過掉)

??? 2.打開內存鏡像,找到包含有SFX,imports,relocations的區段

??? 3.命令行下輸入tc eip<區段地址(上面找到的包含有SFX,imports(輸入表),relocations(重定向)的區段的地址)?;剀嚭髸詣痈櫝鯫EP地址。

?

九:根據編譯語言特點找OEP

?

??? (一).delphi程序

??? 1.執行程序。

??? 2.用LordPE脫殼。

??? 3.接著用16進制編輯器(如Hex Workshop,winhex,UE等)打開脫殼程序。

??? 4.搜索文本“runtime”,搜到后,向前查找離“runtime”最近的十六進制數字“55 8B EC”,

??? 數字所在的地址就是程序的OEP。

?

??? (二).Visual C程序

??? 利用Visual C啟動部分的幾個函數GetCommandLineA(W)、GetVersion、GetModuleHandleA(W)、

??? GetStartupInfoA(W) 等來定位程序的OEP。

?

十. 一步到達OEP

???

??? 1.開始按ctrl+f,輸入:popad(適合少數殼,如UPX,ASPACK等)

??? 2.F2下斷,F9運行到此斷點處,再F2取消斷點

??? 3.F8繼續向下調試

十一: “SFX”法

???

??? 1.設置OD,忽略所有異常(去掉所有勾選)

??? 2.切換到SFX選項卡,選擇“字節模式跟蹤實際入口(速度非常慢)”

3.重載程序(自動走到OEP停下來)

(注:用完之后記得還原設置:停在解壓入口)

?

十二: 內存另類斷點法

?

??? 1.OD載入程序

??? 2.在內存鏡像中找到包含code/text(代碼)的區段,雙擊,然后在數據窗口第一個下內存訪問斷點

3.不斷的按F9,直到從程序領空到系統領空,記錄下按了幾下(如:9次)(按得過程注意可能反應比較慢,要按一下等一會兒,即到暫停狀態再按,(文件按鈕下顯示狀態))

??? 4.重載,繼續上面的操作,不同的是我們按8次F9 。

??? 5.然后繼續用單步跟蹤法調試

?

??? Btw:OEP可能會在我們到達的地方的上面,我們可以倒著走,向下跳轉不讓實現,實現向上跳轉。也可以在程序跑起來的前兩次開始F8跟蹤,大家多多實驗。

?

??? 好了,我們今天的課程就到這里,部分資料會打包給大家。大家有空好好復習下,今天給大家留下作業就是用多種方法找到課件中的FSG2.0和TELOCK的OEP。

轉載于:https://www.cnblogs.com/eldn/archive/2012/08/28/2660896.html

總結

以上是生活随笔為你收集整理的第四课 脱壳必备知识要点及方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。