什么是殼
? ? 大家應(yīng)該先明白“殼”的概念鸦致。在自然界中,我想大家對(duì)"殼"這東西應(yīng)該都不會(huì)陌生了腻惠,植物用它來保護(hù)種子,動(dòng)物用它來保護(hù)身體等等欲虚。同樣集灌,在一些計(jì)算機(jī)軟件里也有一段專門負(fù)責(zé)保護(hù)軟件不被非法修改或反編譯的程序。它們一般都是先于程序運(yùn)行复哆,拿到控制權(quán)欣喧,然后完成它們保護(hù)軟件的任務(wù)。就像動(dòng)植物的殼一般都是在身體外面一樣理所當(dāng)然(當(dāng)然后來也出現(xiàn)了所謂的“殼中帶籽”的殼)梯找。由于這段程序和自然界的殼在功能上有很多相同的地方唆阿,基于命名的規(guī)則,大家就把這樣的程序稱為“殼”了锈锤。就像計(jì)算機(jī)病毒和自然界的病毒一樣驯鳖,其實(shí)都是命名上的方法罷了。
殼的作用
1 寫好一個(gè)程序后久免,不想讓別人隨便更改其中的版權(quán)信息浅辙,我們可以加殼對(duì)其進(jìn)行保護(hù)防止被修改。
2 可以利用壓縮殼減少程序容量阎姥,方便程序傳播记舆。
3 幫助木馬病毒進(jìn)行免殺,我們可以直接加殼免殺呼巴,也可以脫殼對(duì)其代碼進(jìn)行修改從而躲過殺毒軟件的查殺氨淌。
脫殼的基礎(chǔ)知識(shí)
1殼是怎么裝載的?? ??
? ? 殼自從加到程序上以后就連在一起了伊磺,即對(duì)程序進(jìn)行保護(hù)盛正,防止被修改,也就是殼把程序給包裹起來了屑埋,而且原程序的數(shù)據(jù)也被壓縮了豪筝。? ??
? ? 裝載的時(shí)候通常是先執(zhí)行殼后再跳到真正的原程序OEP(程序入口點(diǎn)),這時(shí)開始運(yùn)行原先沒加殼的程序。運(yùn)行順序:執(zhí)行帶殼文件——執(zhí)行殼——執(zhí)行到程序入口點(diǎn)——運(yùn)行未加殼的程序续崖。
2 殼的分類
? ? 殼出于程序作者想對(duì)程序資源壓縮敲街、注冊保護(hù)的目的,殼一般分為壓縮殼和加密殼兩類多艇。
? ?? ???壓縮殼:一般只對(duì)文件進(jìn)行壓縮處理,既壓縮區(qū)段和一些資源壓縮峻黍,以減少文件體積為目的如:ASPack拨匆、UPX姆涩、PECompact等
? ?? ???加密殼:跟壓縮殼正好相反,一般是犧牲減少體積為代價(jià)惭每,對(duì)文件進(jìn)行加密處理骨饿,用上各種反跟蹤技術(shù)保護(hù)程序不被調(diào)試台腥、脫殼,如:ASProtect黎侈、Armadillo置鼻、EXECryptor等
但隨著加殼技術(shù)的發(fā)展,這兩類殼之間的界限越來越模糊蜓竹,很多加殼軟件既有壓縮功能也有保護(hù)性能,而且現(xiàn)在很多加密殼達(dá)到殼中帶肉储藐,肉中帶殼的地步了。?
3 OEP (程序入口點(diǎn))??
OEP:Original Entry Point 蛛碌,程序加殼前真正的入口點(diǎn)。?
4 脫殼的基本步驟
查殼(PEID蔚携、FI克饶、PE-SCAN)--->尋找OEP(OD)--->脫殼/Dump(LordPE、PeDumper矾湃、OD自帶的脫殼插件亡脑、PETools)--->修復(fù)(Import REConstructor)
常用脫殼方法
1 單步跟蹤法
(1)用OD載入,點(diǎn)“不分析代碼”
(2).單步向下跟蹤F8蛙紫,實(shí)現(xiàn)向下的跳途戒。也就是說向上的跳不讓其實(shí)現(xiàn)(通過F4)
(3)遇到程序往回跳的(包括循環(huán)),我們在下一句代碼處按F4(或者右健單擊代碼喷斋,選擇斷點(diǎn)——>運(yùn)行到所選)
(4)綠色線條表示跳轉(zhuǎn)沒實(shí)現(xiàn),不用理會(huì)继准,紅色線條表示跳轉(zhuǎn)已經(jīng)實(shí)現(xiàn)
(5)如果剛載入程序,在附近就有一個(gè)CALL的室谚,我們就F7跟進(jìn)去崔泵,不然程序很容易跑??飛秒赤,這樣很快就能到程序的OEP
(6)在跟蹤的時(shí)候憎瘸,如果運(yùn)行到某個(gè)CALL程序就運(yùn)行的,就在這個(gè)CALL中F7進(jìn)入
(7)一般有很大的跳轉(zhuǎn)(大跨段)幌甘,比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN??的一般很快就會(huì)到程序的OEP
注:在有些殼無法向下跟蹤的時(shí)候,我們可以在附近找到?jīng)]有實(shí)現(xiàn)的大跳轉(zhuǎn)酥诽,右鍵-->“跟隨”,然后F2下斷皱埠,Shift+F9運(yùn)行停在“跟隨”的位置,再取消斷點(diǎn)边器,繼續(xù)F8單步跟蹤。一般情況下可以輕松到達(dá)OEP?
2 ESP定律法? ?
ESP定理脫殼(ESP在OD的寄存器中忘巧,我們只要在命令行下ESP的硬件訪問斷點(diǎn),就會(huì)一下來到程序的OEP了U檀Α)
(1)開始就點(diǎn)F8眯勾,注意觀察OD右上角的寄存器中ESP有沒突現(xiàn)(變成紅色)(這只是一??般情況下婆誓,更確切的說我們選擇的ESP值是關(guān)鍵句之后的第一個(gè)ESP值)
(2)在命令行下:dd XXXXXXXX(指在當(dāng)前代碼中的ESP地址,或者是hr XXXXXXXX)郁轻,??按回車
(3)選中下斷的地址,斷點(diǎn)--->硬件訪--->WORD斷點(diǎn)
(4)按一下F9運(yùn)行程序好唯,直接來到了跳轉(zhuǎn)處燥翅,按下F8,到達(dá)程序OEP?
3內(nèi)存鏡像法
(1)用OD打開軟件
(2)點(diǎn)擊選項(xiàng)——調(diào)試選項(xiàng)——異常森书,把里面的忽略全部√上。CTRL+F2重載下程序
(3)按ALT+M,打開內(nèi)存鏡象凛膏,找到程序的第一個(gè).rsrc.按F2下斷點(diǎn),然后按SHIFT+F9運(yùn)??行到斷點(diǎn)台谍,接著再按ALT+M,打開內(nèi)存鏡象吁断,找到程序的第一個(gè).rsrc.上面的.CODE(也??就是00401000處)趁蕊,按F2下斷點(diǎn)仔役。然后按SHIFT+F9(或者是在沒異常情況下按F9),??直接到達(dá)程序OEP?
4 一步到達(dá)OEP
(1)開始按Ctrl+F,輸入:popad(只適合少數(shù)殼,包括UPX赃泡,ASPACK殼),然后按下F2升熊,??F9運(yùn)行到此處
(2)來到大跳轉(zhuǎn)處,點(diǎn)下F8页屠,到達(dá)OEP?
5 最后一次異常法
(1)用OD打開軟件
(2)點(diǎn)擊選項(xiàng)——調(diào)試選項(xiàng)——異常,把里面的√全部去掉辰企!CTRL+F2重載下程序
(3)一開始程序就是一個(gè)跳轉(zhuǎn),在這里我們按SHIFT+F9牢贸,直到程序運(yùn)行,記下從開始按SHIFT+F9到程序運(yùn)行的次數(shù)m
(4)CTRL+F2重載程序臭增,按SHIFT+F9(這次按的次數(shù)為程序運(yùn)行的次數(shù)m-1次)
(5)在OD的右下角我們看見有一個(gè)"SE 句柄",這時(shí)我們按CTRL+G誊抛,輸入SE 句柄前的地址
(6)按F2下斷點(diǎn)整陌,然后按SHIFT+F9來到斷點(diǎn)處
(7)去掉斷點(diǎn),按F8慢慢向下走
(8)到達(dá)程序的OEP?
6 模擬跟蹤法
(1)先試運(yùn)行蔓榄,跟蹤一下程序,看有沒有SEH暗樁之類
(2)ALT+M打開內(nèi)存鏡像甥郑,找到(包含那一列中出現(xiàn)SFX,imports,relocations或者SFX,輸??入表,重定位)
(3)若地址為00xxxxxx在命令行下輸入tc eip<00xxxxxx伍俘,回車勉躺,提示正在跟蹤
7 SFX法
(1)設(shè)置OD癌瘾,忽略所有異常饵溅,也就是說異常選項(xiàng)卡里面都打上勾
(2)切換到SFX選項(xiàng)卡,選擇“字節(jié)模式跟蹤實(shí)際入口(速度非常慢)”蜕企,確定
(3)重載程序(如果跳出是否“壓縮代碼?”選擇“否”幸乒,OD直接到達(dá)OEP)
接下來我們一起走向逆向?qū)崙?zhàn)