上節課程我主要介紹了什么是pe,本次課程我們主要來講一下殼,這也是破解軟件的必修課程,也是逆向分析里面的必修功課。
在一些計算機軟件里有一段專門負責保護軟件不被非法修改或反編譯的程序。它們一般都是先于程序運行,拿到控制權,然后完成它們保護軟件的任務。由于這段程序和自然界的殼在功能上有很多相同的地方,基于命名的規則,就把這樣的程序稱為“殼”了。殼分為私密殼和壓縮殼。
殼的示意圖
![]() |
殼的加載過程
1)獲取殼所需要使用的API地址
如果用PE編輯工具查看加殼后的文件,會發現未加殼的文件和加殼后的文件的輸入表不一樣,加殼后的輸入表一般所引入的DLL和API函數很少,甚至只有Kernel32.dll以及GetProcAddress這個API函數。
殼實際上還需要其他的API函數來完成它的工作,為了隱藏這些API,它一般只在殼的代碼中用顯式鏈接方式動態加載這些API函數。
2)解密原程序的各個區塊(Section)的數據
殼出于保護原程序代碼和數據的目的,一般都會加密原程序文件的各個區塊。在程序執行時外殼將會對這些區塊數據解密,以讓程序能正常運行。
殼一般是按區塊加密的,那么在解密時也按區塊解密,并且把解密的區塊數據按照區塊的定義放在合適的內存位置。
如果加殼時用到了壓縮技術,那么在解密之前還有一道工序,就是解壓縮。這也是一些殼的特色之一,比如說原來的程序文件未加殼時1~2M大小,加殼后反而只有幾百K。
3)重定位
文件執行時將被映像到指定內存地址中,這個初始內存地址稱為基地址(ImageBase)。
對于EXE的程序文件來說,Windows系統會盡量滿足。例如某EXE文件的基地址為0x400000,而運行時Windows系統提供給程序的基地址也同樣是0x400000。在這種情況下就不需要進行地址“重定位”了。由于不需要對EXE文件進行“重定位”,所以加殼軟件把原程序文件中用于保存重定位信息的區塊干脆也刪除了,這樣使得加殼后的文件更加小巧。有些工具提供“Wipe Reloc”的功能,其實就是這個作用。
不過對于DLL的動態鏈接庫文件來說,Windows系統沒有辦法保證每一次DLL運行時都提供相同的基地址。這樣“重定位”就很重要了,此時殼中也需要提供進行“重定位”的代碼,否則原程序中的代碼是無法正常運行起來的。從這點來說,加殼的DLL比加殼的EXE更難修正。
4)HOOK-API
程序文件中的輸入表的作用是讓Windows系統在程序運行時提供API的實際地址給程序使用。在程序的第一行代碼執行之前,Windows系統就完成了這個工作。
殼一般都修改了原程序文件的輸入表,然后自己模仿Windows系統的工作來填充輸入表中相關的數據。在填充過程中,外殼就可填充HOOK-API代碼的地址,這樣就可間接地獲得程序的控制權。
5)跳轉到程序原入口點(OEP)
從這個時候起殼就把控制權交還給原程序了,一般的殼在這里會有明顯的一個“分界線”。但現在的猛殼己沒這界限了,殼里有肉,肉里有殼。
一般殼的加載過程如圖所示
![]() |
加殼軟件介紹
加殼軟件按照其加殼目的和作用,可分為兩類:一是壓縮(Packers),二是保護(Protectors)。壓縮這類殼主要目的是減小程序體積,如ASPacK、UPX和PECompact等。另一類是保護程序,用上了各種反跟蹤技術保護程序不被調試、脫殼等,其加殼后的體積大小不是其考慮的主要因素,如ASProtect、Armadillo、EXECryptor等。
隨著加殼技術的發展,這兩類軟件之間的界線越來越模糊,很多加殼軟件除具有較強的壓縮性能,同時也有了較強的保護性能。
各類加殼軟件,其壓縮算法一般不是自己實現的,大多是調用其他的壓縮引擎。目前壓縮引擎種類比較多,不同的壓縮引擎有不同特點,如一些對圖像壓縮效果好,一些對數據壓縮效果好。而加殼軟件選擇壓縮引擎有一個特點,在保證壓縮比的條件下,壓縮速度慢些關系不是太大,但解壓速度一定要快,這樣加了殼的EXE文件運行起來速度才不會受太大的影響。
常用壓縮殼介紹
1). ASPacK
主頁:http://www.aspack.com/
ASPack是款Win32可執行文件壓縮軟件,可壓縮Windows 32位可執行文件(.exe)以及庫文件(.dll、.ocx),文件壓縮比率高達40%~70%。
2). UPX
主頁:http://upx.sourceforge.net/
UPX是一個以命令行方式操作的可執行文件經典免費壓縮程序,壓縮算法自己實現,速度極快。
3). PECompact
主頁:http://www.bitsum.com/
PECompact同樣也是一款能壓縮可執行文件的工具(支持EXE、DLL、SCR、OCX等文件)。相比同類軟件,PECompact提供了多種壓縮項目的選擇,用戶可以根據需要確定哪些內部資源需要壓縮處理。同時,該軟件還提供了加解密的插件接口功能。