脱壳(中) 脱壳的方法
那些年我們一起脫過的衣裳-脫殼(中)
珈藍夜宇?·?2015/10/29 10:420x01 我能在萬花從中脫去殼的衣裳!(續(xù))
3.3ESP定律法
3.3.1ESP定律介紹
ESP定律法是脫殼的利器,是國外友人發(fā)現(xiàn)的。有了ESP定律,可以方便我們脫掉大多數(shù)的壓縮殼。可謂是本世紀(jì)破解界中最偉大的發(fā)現(xiàn)之一。這里只簡單的看一下狹義ESP定律的原理。
當(dāng)我們用OD載入之后開始就是 pushad 基本上就可以使用ESP定律脫殼了
3.3.2以老版菜刀為例:
首先查殼,還是UPX的殼
1.使用OD載入之后開頭是pushad,那么我們可以初步判斷可以使用ESP進行脫殼
那么,我們該怎么判斷到底能不能用ESP定律脫殼呢?
按下F8(單步步過),既然叫做ESP定律,那么肯定跟右上角寄存器窗口,中的ESP有必然的聯(lián)系的
2.可以看到到了這一步,只有ESP是紅色的(不用管EIP),那就可以使用ESP定律。
選擇ESP---||->右鍵---||->數(shù)據(jù)窗口中跟隨
這時我們可以看到數(shù)據(jù)窗口,變成了下圖所示
3.在HEX數(shù)據(jù)中選擇任意一段(網(wǎng)上總有人說選一個字節(jié),選兩個字節(jié),選四個字節(jié)),其實實際上選多少個都可以,但是只要從第一個開始選起。然后右鍵---||>斷點---||>硬件訪問---||>在Byte,Word,Dword選擇任意一個都可以。
可以在調(diào)試中的硬件斷點查看自己的斷點
4.然后按下F9運行程序,程序會自己斷下來。斷下來之后就會很快到達OEP,然后單步跟蹤法一步一步向下
遇到向上跳轉(zhuǎn)則在它的下一行按F4(運行到此處)
下面看到一個大跳轉(zhuǎn),跳轉(zhuǎn)過去就是OEP了
004AE9C4 - E9 DF6FFBFF jmp caidao.004659A85.到達OEP之后就可以開心的脫殼啦~(和單步跟蹤法脫殼操作相同)
再介紹一種非常簡單的方法,用插件下硬件斷點
在ESP右鍵選擇 HW break [ESP] 她會自動下下硬件斷點,之后直接按下F9運行程序再F8就到達OEP了
3.4兩次斷點法
還是以菜刀為例吧,我保證是最后一次了%>.<%
1.選項---||>調(diào)試設(shè)置---||>異常 全部打上√,也就是忽略所有的異常
2.按鍵盤上的“ALT+M”組合鍵打開OD的內(nèi)存窗口
3.如圖,我們首先找到自己程序名的 .rsrc區(qū)段 按F2下斷點 然后 Shift+F9 就會回到反匯編窗口
然后再按"ALT+M" 然后找到程序的第一個.rsrc.上面的.CODE(也 就是00401000處),按F2下斷點。
然后按SHIFT+F9就到達OEP或者到達了OEP的附近了,然后再用單步跟蹤法就可以到達OEP了
然后怎么脫殼我就不說了。我用了三種方法脫下UPX,只是想證明脫殼是可以用很多種方法脫殼的。而不是總是看到xxx殼用什么方法去脫啊?這些問題。。。。。。
3.5一步到達OEP
1.首先必備的就是查殼嘛~ ASPack的殼
2.首先將程序加載進OD 按F9開始執(zhí)行
在堆棧窗口可以看到 拖到最下邊
3.然后慢慢向上找,因為我們的程序名稱就叫ASPack,所以我們在向上找的第一個程序名稱中,選中它,然后右鍵---||-->反匯編窗口中跟隨
在反匯編窗口中按Ctrl+A(分析代碼)
然后呢就能在堆棧窗口中可以看到一個括號將程序名稱括起來了,這是一個段.
4.然后需要在段中找到段首,也就是這個括號的開頭.找到返回到xxx(代表程序名稱)這一行,選擇反匯編窗口中跟隨.
5.然后我們在反匯編窗口中向上找,肯定就在這附近,找了一下發(fā)現(xiàn)了OEP
6.那么問題來了,我們程序都還沒有開始調(diào)試,所以我們要怎么樣才能將程序段在這里,然后進行脫殼呢?
選中OEP 的第一行,右鍵---||-->數(shù)據(jù)窗口中跟隨---||-->選擇
7.然后在數(shù)據(jù)窗口中可以看到前面兩個HEX數(shù)據(jù)已經(jīng)被選中了,然后
右鍵---||-->斷點---||-->硬件執(zhí)行
然后查看一下硬件斷點下好了沒有,ok
8.然后重新運行,按下F9執(zhí)行程序,然后就直接在OEP斷下來了,然后使用ollyDump脫殼進程進行脫殼.這個上面已經(jīng)說了,現(xiàn)在我就不多說了
3.6最后一次異常法
在脫殼方法中,最后一次異常法,這是最基礎(chǔ)的脫殼技術(shù)之一。
1.將待脫殼程序載入到OD中,單擊OD的“選項”菜單,在彈出的菜單中單擊“調(diào)試設(shè)置”命令,在隨后彈出的“調(diào)試選項”對話框中切換到“異常”選項卡,清除該選項卡下所有復(fù)選框,也就是不忽略任何異常。
2.按Shift+F9讓程序運行起來,記錄按鍵的次數(shù)。記錄為x。我這里是兩次就讓程序運行起來了,但是你有可能需要十次或者二十次才能運行起來。
3.然后回到OD中,按Ctrl+F2(重新載入程序),按1次Shift+F9。那么為什么按1次呢?上面讓記錄為x,所以這里需要按x-1次。例:如果讓一個步驟按了10次運行起來了,我們在這里就要按9次Shift+F9。
4.在OD右下角窗口中找到“SE句柄”或是“SE處理程序”,右鍵---||-->反匯編窗口中跟隨(如果沒有反匯編窗口中跟隨,可以在反匯編窗口按Ctrl+G 輸入"SE處理程序"前面的地址)。
5.在OD的反匯編窗口中跟隨到上一步記錄下的內(nèi)存地址,并在此內(nèi)存地址處下一個斷點。
6.按鍵盤上的“Shift+F9”組合鍵讓程序運行到上一步下的斷點處,按鍵盤上的“F2”鍵取消此處的斷點。
7.使用單步跟蹤法追蹤(一直按F8,遇到向上的跳轉(zhuǎn)在下面那行按F4(運行到此處))直到到達OEP
然后到了OEP怎么脫殼,在這里我就不說了
3.7模擬跟蹤法
不管要怎樣先查殼再說 nPack的殼
在講到的眾多脫殼方法中,我們首先講了單步跟蹤法脫殼,因為單步跟蹤脫殼法是脫殼技術(shù)中最基礎(chǔ)的方法,在后面其它的一些脫殼方法中總會或多或少的配合單步跟蹤法才能順利完成脫殼工作。便是始終是一次次的按“F8”鍵來單步跟蹤程序,偶爾遇到回跳就跳過執(zhí)行,這樣機械性的操作很是煩人,那么能不能讓機器來代替人力,讓工具幫我們單步跟蹤呢?答案是肯定的,這也就是這節(jié)講的內(nèi)容——模擬跟蹤法。模擬脫殼法就是模擬單步跟蹤來進行查找OEP。
網(wǎng)上的大部分模擬跟蹤法的常見步驟是這樣的:
1、將待脫殼程序載入OD中,先簡單的跟蹤一下程序,看看有沒有SEH暗樁;
2、按鍵盤上的“ALT+F9”打開OD的內(nèi)存窗口,找到“SFX,輸入表,資源”的行,并記錄此行的內(nèi)存地址;
3、在OD的命令行窗口執(zhí)行命令“tc eip<上一步中記錄下的地址”,命令執(zhí)行后就會跟蹤到OEP。
然而這種方法可以是可以,但是可能從早上開始跟蹤,一直跟蹤到晚上都沒有跟蹤完成。網(wǎng)上那些人拿著文章轉(zhuǎn)來轉(zhuǎn)去,也沒見得誰真的去試驗過...效率實在太慢了,那不如我們來幫機器一把?
首先,需要用到的是上面所講到的兩次斷點法,使用兩次斷點法,按照兩次斷點法的最后一次Shift+F9之后
然后ALT+M回到內(nèi)存窗口,然后選中程序名稱的SFX,輸入表.
然后在OD的命令執(zhí)行窗口執(zhí)行命令"tc eip<SFX,輸入表這一行的地址"然后回車,執(zhí)行命令,然后OD就能迅速的到達OEP了。
當(dāng)這里的跟蹤變?yōu)闀和5臅r候,說明OEP已經(jīng)到達了。
那么,這樣就有人說了,如果這樣我都能用兩次斷點法了,我為什么還要用模擬跟蹤法,這樣還有什么存在的意義?
如程序出錯了,或者當(dāng)你找不到OEP的時候就能使用此方法找到OEP。
到了OEP然后改怎樣脫殼我就不說了,上面都寫了好幾次了~
3.8“SFX”法
查殼 0xpack的殼
在OD中,不但可以利用模擬跟蹤來代替單步跟蹤進行脫殼,從而節(jié)省勞動力,還有一種SFX自動脫殼的方法也可以節(jié)省勞動力,并能快速有效的將程序的殼脫掉。
使用SFX自動脫殼法脫殼的常見步驟:
1、將OD設(shè)置為忽略所有異常;
2、在OD的“調(diào)試選項”對話框的“SFX”選項卡中選擇“字節(jié)模式跟蹤實際入口”選項并確定;
3、將程序重新載入OD,然后左下角就會開始跟蹤了,然后過一會兒就會自動斷在OEP了!
3.9出口標(biāo)志法
前面幾個脫殼方法中有一個共同點,就是在單步跟蹤到popad指令后面不遠處的jmp指令的時候,就可以大膽的判斷這個jmp指令的目的地址就是OEP。
原因很簡單,popad指令用于將殼運行之前保存的環(huán)境恢復(fù),使原程序能正常運行。有些殼的popad指令很少,我們就可以查看被這種殼加殼的程序的所有popad指令,找到后面存在jmp指令的popad指令,然后來到其后的jmp指令的目的地址,這很可能就是OEP,然后就可以進行脫殼了。
1.將待脫殼程序載入OD中,在OD的反匯編客人口中單擊鼠標(biāo)右鍵,在彈出的右鍵菜單中單擊“查找”→“所有命令”,在彈出的輸入框中輸入“popad”并按“查找”按鈕,記得去掉整個塊前面的勾啊!!!!
2.當(dāng)遇到第一個popad的時候按下F4(運行到此處),在這里,我的示例程序已經(jīng)運行起來了,這就是我上面所說的"跑飛了",然后重新載入重新按照步驟1.查找popad,因為我們的第一個popad已經(jīng)跑飛了,所以我們不理它。哼!然后按Ctrl+L查找下一個。
然后第二個popad又跑飛了,哼!重新開始,第一個和第二個我都不理你們了!
然后開始第三個popad,依然是跑飛。重來,第一.二.三我都不理你們了,直接按查找4次popad,執(zhí)行這里,沒有"跑飛"其實如果經(jīng)驗豐富的已經(jīng)看出來馬上就到達OEP了。而我還在假裝不知道,然后F8單步跟蹤。
直到到達OEP
然后在這里說一下LordPE+ImpREC脫殼吧,其實我在實戰(zhàn)中很少用OD自帶的插件脫殼的,因為,不是特別好用。
1.首先記住不要關(guān)閉OD,然后打開LoadPE,在最下面選擇程序右鍵---||-->修正鏡像大小
2.然后選擇程序右鍵---||-->完整轉(zhuǎn)存
3.打開ImpRec在下拉框中選中程序
4.然后在OD中將下面箭頭所指處復(fù)制下來
5.然后在下面OEP處填寫剛才復(fù)制的---||-->點擊自動查找TAT---||-->獲取輸入表---||-->點擊無效函數(shù),這里沒有
(如果有,在輸入表函數(shù)信息框內(nèi)選中,然后刪除指針!)
然后點擊右下角的轉(zhuǎn)儲到文件!需要選中那個剛才使用LoadPE完整轉(zhuǎn)存的文件名,然后就脫殼完成!!!
0x02 后續(xù)章節(jié)
以上很多注意的點是我剛學(xué)脫殼時遇到的一系列的問題,我希望大家不要再誤入網(wǎng)上那些隨意轉(zhuǎn)載的文章的那些不明白的東西.下節(jié)教大家如何編寫自動化脫殼插件.
總結(jié)
以上是生活随笔為你收集整理的脱壳(中) 脱壳的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 气象卫星简介
- 下一篇: 为什么面向对象糟透了?