第四课 脱壳必备知识要点及方法
???????????????????????????? 第四課? 脫殼必備知識要點及方法
?
??? 今天所要講的是這高級篇中最為關鍵,最為重要的一課,希望大家能認真學習,反復推敲,舉一反三學習脫殼的各種方法,當然有的時候可能需要幾種方法一起使用,今后我們也會一點一點接觸到,今天我們先學習大體的幾種脫殼法。
?
一:常見脫殼調試法
?
二:預備知識
???
??? 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
總結
以上是生活随笔為你收集整理的第四课 脱壳必备知识要点及方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ExtJS 4 Beta 2预览:Ext
- 下一篇: 幽默集锦