什麼是殼
大家應該先明白“殼”的概念。在自然界中,我想大家對"殼"這東西應該都不會陌生了,植物用它來保護種子,動物用它來保護身體等等。同樣,在一些計算機軟件裏也有一段專門負責保護軟件不被非法修改或反編譯的程序。它們一般都是先於程序運行,拿到控制權,然後完成它們保護軟件的任務。就像動植物的殼一般都是在身體外面一樣理所當然(當然後來也出現了所謂的“殼中帶籽”的殼)。由於這段程序和自然界的殼在功能上有很多相同的地方,基於命名的規則,大家就把這樣的程序稱爲“殼”了。就像計算機病毒和自然界的病毒一樣,其實都是命名上的方法罷了。
殼的作用
1 寫好一個程序後,不想讓別人隨便更改其中的版權信息,我們可以加殼對其進行保護防止被修改。
2 可以利用壓縮殼減少程序容量,方便程序傳播。
3 幫助木馬病毒進行免殺,我們可以直接加殼免殺,也可以脫殼對其代碼進行修改從而躲過殺毒軟件的查殺。
脫殼的基礎知識
1 殼是怎麼裝載的?
殼自從加到程序上以後就連在一起了,即對程序進行保護,防止被修改,也就是殼把程序給包裹起來了,而且原程序的數據也被壓縮了。
裝載的時候通常是先執行殼後再跳到真正的原程序OEP(程序入口點),這時開始運行原先沒加殼的程序。
運行順序:執行帶殼文件——執行殼——執行到程序入口點——運行未加殼的程序。
2 殼的分類
殼出於程序作者想對程序資源壓縮、註冊保護的目的,殼一般分爲壓縮殼和加密殼兩類。
壓縮殼:一般只對文件進行壓縮處理,既壓縮區段和一些資源壓縮,以減少文件體積爲目的
如:ASPack、UPX、PECompact等
加密殼:跟壓縮殼正好相反,一般是犧牲減少體積爲代價,對文件進行加密處理,用上各種反跟蹤技術保護程序不被調試、脫殼,
如:ASProtect、Armadillo、EXECryptor等
但隨着加殼技術的發展,這兩類殼之間的界限越來越模糊,很多加殼軟件既有壓縮功能也有保護性能,而且現在很多加密殼達到殼中帶肉,肉中帶殼的地步了。
3 OEP (程序入口點)
OEP:Original Entry Point ,程序加殼前真正的入口點。
4 脫殼的基本步驟
查殼(PEID、FI、PE-SCAN)--->尋找OEP(OD)--->脫殼/Dump(LordPE、PeDumper、OD自帶的脫殼插件、PETools)--->修復(Import REConstructor)
常用脫殼方法
1 單步跟蹤法
(1)用OD載入,點“不分析代碼”
(2).單步向下跟蹤F8,實現向下的跳。也就是說向上的跳不讓其實現(通過F4)
(3)遇到程序往回跳的(包括循環),我們在下一句代碼處按F4(或者右健單擊代碼,選 擇斷點——>運行到所選)
(4)綠色線條表示跳轉沒實現,不用理會,紅色線條表示跳轉已經實現
(5)如果剛載入程序,在附近就有一個CALL的,我們就F7跟進去,不然程序很容易跑 飛,這樣很快就能到程序的OEP
(6)在跟蹤的時候,如果運行到某個CALL程序就運行的,就在這個CALL中F7進入
(7)一般有很大的跳轉(大跨段),比如 jmp XXXXXX 或者 JE XXXXXX 或者有RETN 的一般很快就會到程序的OEP
注:在有些殼無法向下跟蹤的時候,我們可以在附近找到沒有實現的大跳轉,右鍵-->“跟隨”,然後F2下斷,Shift+F9運行停在“跟隨”的位置,再取消斷點,繼續F8單步跟蹤。一般情況下可以輕鬆到達OEP
2 ESP定律法
ESP定理脫殼(ESP在OD的寄存器中,我們只要在命令行下ESP的硬件訪問斷點,就會一下來到程序的OEP了!)
(1)開始就點F8,注意觀察OD右上角的寄存器中ESP有沒突現(變成紅色)(這只是一 般情況下,更確切的說我們選擇的ESP值是關鍵句之後的第一個ESP值)
(2)在命令行下:dd XXXXXXXX(指在當前代碼中的ESP地址,或者是hr XXXXXXXX), 按回車
(3)選中下斷的地址,斷點--->硬件訪--->WORD斷點
(4)按一下F9運行程序,直接來到了跳轉處,按下F8,到達程序OEP
3 內存鏡像法
(1)用OD打開軟件
(2)點擊選項——調試選項——異常,把裏面的忽略全部√上。CTRL+F2重載下程序
(3)按ALT+M,打開內存鏡象,找到程序的第一個.rsrc.按F2下斷點,然後按SHIFT+F9運 行到斷點,接着再按ALT+M,打開內存鏡象,找到程序的第一個.rsrc.上面的.CODE(也 就是00401000處),按F2下斷點。然後按SHIFT+F9(或者是在沒異常情況下按F9), 直接到達程序OEP
4 一步到達OEP
(1)開始按Ctrl+F,輸入:popad(只適合少數殼,包括UPX,ASPACK殼),然後按下F2, F9運行到此處
(2)來到大跳轉處,點下F8,到達OEP
5 最後一次異常法
(1)用OD打開軟件
(2)點擊選項——調試選項——異常,把裏面的√全部去掉!CTRL+F2重載下程序
(3)一開始程序就是一個跳轉,在這裏我們按SHIFT+F9,直到程序運行,記下從開始按SHIFT+F9到程序運行的次數m
(4)CTRL+F2重載程序,按SHIFT+F9(這次按的次數爲程序運行的次數m-1次)
(5)在OD的右下角我們看見有一個"SE 句柄",這時我們按CTRL+G,輸入SE 句柄前的地址
(6)按F2下斷點,然後按SHIFT+F9來到斷點處
(7)去掉斷點,按F8慢慢向下走
(8)到達程序的OEP
6 模擬跟蹤法
(1)先試運行,跟蹤一下程序,看有沒有SEH暗樁之類
(2)ALT+M打開內存鏡像,找到(包含那一列中出現SFX,imports,relocations或者SFX,輸 入表,重定位)
(3)若地址爲00xxxxxx在命令行下輸入tc eip<00xxxxxx,回車,提示正在跟蹤
7 SFX法
(1)設置OD,忽略所有異常,也就是說異常選項卡里面都打上勾
(2)切換到SFX選項卡,選擇“字節模式跟蹤實際入口(速度非常慢)”,確定
(3)重載程序(如果跳出是否“壓縮代碼?”選擇“否”,OD直接到達OEP)
特別說明:本文轉載自http://blog.csdn.net/qiurisuixiang/article/details/7648695,感謝原作者辛勤奉獻,若造成侵權,請通知我刪除。