殼的載入過程

2022-03-13 21:51:33 字數 909 閱讀 4431

參考文章:

在一些計算機軟體裡有一段專門負責保護軟體不被非法修改或反編譯的程式。它們一般都是先於程式執行,拿到控制權,然後完成它們保護軟體的任務

由於這段程式和自然界的殼在功能上有很多相同的地方,基於命名的規則,就把這樣的程式稱為"殼"了。

殼分為加密殼和壓縮殼。

1、儲存入口引數

加殼程式初始化時儲存各個暫存器的值,外殼程式執行完畢,再恢復各個暫存器的值,通常用pushad/popad,pushfd/popfd指令來對保護與恢復現場環境

2、獲取殼自己所需要使用的api位址

一般外殼的輸入表主要是getprocaddress,getmodulehandle和loadlibrary這幾個api函式

loadlibrary:將dll檔案映像對映到呼叫程序的位址空間中

getmodulehandle:獲得dll模組的控制代碼

getprocaddress:獲得函式的位址

3、解密原程式各個區塊的資料

按照區塊加密按照區塊解密

4、iat的初始化

加殼時,殼會自己構造乙個輸入表,並將pe頭中的輸入表指標指向自建的輸入表。pe裝載器對自建的輸入表進行填寫,原來的輸入表由殼來填寫。

殼將新輸入表結構從頭到尾掃瞄一遍,對每乙個dll引入的所有函式獲取位址,填入iat表中

5、重定位項的處理

加殼的dll比加殼的exe修正時多乙個重定位表,因為是4gb空間中,dll沒有佔住原來的imagebase位址

6、hook-api

殼一般都修改了原程式的輸入表,自己模仿裝載器來填充輸入表。在填充過程中,外殼就可以填充hook-api的**位址,間接獲得程式的控制權

7、跳到程式原入口點(oep)

正常的話也就是跳到imagebase + addressofentrypoint

殼的載入與脫殼簡單介紹

簡單殼的載入過程 1 儲存入口引數 初始化時會儲存各暫存器的值。通常用pushad popad pushfd popfd指令對來儲存與恢復現場環境。2 獲取殼本身需要使用的api位址 loadlibrary函式原型 hmodule loadlibrary lpctstr lplibfilename ...

程序的載入過程

假如有乙個可執行程式,它有自己的大小。將可執行程式載入到記憶體空間有各種方法,以下是我們便於理解的一種方法。如上圖,如果想再載入乙個程式進去,理論上空間夠用,但實際上放不進去,因此這種管理方案浪費的記憶體較大,會產生外部碎片。因此我們可以使用頁表來對記憶體進行管理,下圖是使用頁表的方法。頁表 作業系...

類的載入過程

類的載入過程 1 在建立物件時,會先判斷物件所屬的型別 類 在記憶體中是否存在,如果存在則直接使用 如果不存在,則把類載入到記憶體中的方法區下 2 在把類 class 載入到方法區時,分兩種情況 2.1 從.class檔案的上面向下依次載入內容 2.2 靜態的內容載入到方法區的靜態區域下 非靜態內容...