簡單殼的載入過程
1、儲存入口引數:初始化時會儲存各暫存器的值。通常用pushad/popad、pushfd/popfd指令對來儲存與恢復現場環境。
2、獲取殼本身需要使用的api位址
loadlibrary函式原型
hmodule loadlibrary(
lpctstr lplibfilename //dll檔名位址
)返回值:成功則返回模組的控制代碼,失敗則返回「null」。
如果dll檔案已被對映到呼叫程序的位址空間中,可以呼叫getmodulehandlea(w)函式獲得dll模組控制代碼。
getmodulehandle函式原型
hmodule winapi getmodulehandle(
lpctstr lpmodulename 、、dll檔名位址
);
lpctstr lpmodulename
需要獲取控制代碼的模組名。(.dll或.exe檔案),若無字尾,預設為.dll。不必指定所在模組路徑,若需指定,則需用反斜槓\。模組名必須與當前對映到呼叫程序空間的模板名一致。不會獲取使用標誌load_library_as_datafile載入的模組控制代碼。
返回:若成功,則返回指定模組的控制代碼值;反之,返回null。使用getlasterror獲取錯誤資訊。
標頭檔案:winbase.h(包含了windows.h)
lib庫檔案:kernel32.lib
dll庫檔案:kernel32.dll
一旦dll模組被載入,執行緒就可以呼叫getprocaddress函式獲取輸入函式的位址
farproc getprocaddress(
hmodule hmodule, //dll模組控制代碼
lpcstr lpprocname //函式名
);
引數hmodule時呼叫loadlibrary(ex)或getmodulehandle函式的返回值。引數lpprocname可以採用兩種形式:一種是以0結尾的字串位址;另一種是呼叫位址的符號的序號
3、解密源程式各個區塊的資料
為了保護源程式**和資料的目的,殼會加密源程式檔案的各個區塊。在程式執行師,殼將解密這些加密過的區塊資料。
4、iat的初始化
加殼時構造了乙個自建輸入表,並讓pe檔案頭資料目錄表中的輸入表指標指向自建的輸入表,pe裝載器會對自建的輸入表進行填寫。程式的原始輸入表被外殼變形後儲存,iat的填寫會由外殼程式實現。外殼要做的就是講這個變形的輸入表的結構從頭到尾掃瞄一遍,重新獲取每乙個dll引入的所有函式的位址,並將填寫在iat中。
5、重定位項的處理
對於dll的動態鏈結庫檔案來說,因為windows作業系統沒有辦法保證在dll每次執行時都提供相同的基址。此時殼中也要有用於「重定位」的**,否則源程式中的**是無法正常執行的。因此加殼的dll比加殼的exe在修正時多了乙個重定位表。
6、hook api
輸入表的作用是讓windows作業系統在程式執行時將api的實際位址提供給程式使用。殼大都在修改原程式檔案的輸入表後自己模仿windows作業系統的工作流程,向輸入表中填充相關的資料。在填充過程中,外殼可以填充hook api**的位址了,從而間接獲得程式的控制權。
7、跳轉到程式原入口(oep)
加殼與脫殼的原理
加殼一般是指保護程式資源的方法.脫殼一般是指除掉程式的保護,用來修改程式資源.病毒加殼技術與脫殼防毒方法 殼是什麼?脫殼又是什麼?這是很多經常感到迷惑和經常提出的問題,其實這個問題一點也不幼稚。當你想聽說脫殼這個名詞並試著去了解的時候,說明你已經在各個安全站點很有了一段日子了。下面,我們進入 殼 的...
病毒加殼技術與脫殼技術
由於大量的防毒軟體的出現,以及防毒軟體病毒庫的不斷壯大,病毒被查殺的機率也越來越大。所以有些病毒就開始通過加殼的方法來偽裝自己,企圖騙過防毒軟體,蒙混過關。為了做好病毒防禦,我們就該了解什麼是加殼?加殼的對立面是不是脫殼?如何脫殼等?一 什麼是殼 計算機軟體裡有一段專門負責保護軟體不被非法修改或反編...
軟體的殼和殼的含義 概念以及加殼和脫殼方法
pe portable executable 也就是exe和dl 檔案所具有的起壓縮 加密 保護作用的東西。可以用peid等軟體查殼。加殼通過修改程式入口點等壓縮 加密 保護exe和dl.在自然界中,我想大家對殼這東西應該都不會陌生了,由上述故事,我們也可見一斑。自然界中植物用它來保護種子,動物用它...