加殼和脫殼在安全領(lǐng)域非常常見,但原理是什么?
軟件加殼、脫殼是兩種不同的技術(shù)手段,也是兩類人通過這個技術(shù)進行對抗的戰(zhàn)場,加殼是程序開發(fā)者所考慮的,用來保護他的程序。脫殼是攻擊者所考慮的,用來竊取程序里面的信息(或改變程序原來功能...)。不管是加殼還是脫殼都挺專業(yè)(直白點:麻煩且復雜),下文只從宏觀的視角來理解其中的運行原理即可,只是科普了解。
復雜是因為,不同的系統(tǒng)在加載程序的流程不同,且流程鏈條環(huán)節(jié)非常長。
殼的定義
“殼”的具象理解就類似花生殼,用來保護里面的花生仁。人想吃到里面果實,就需要將其剝掉。
軟件也存在這樣類似的東西,這種東西我們也稱之為“殼”,兩者的目標都是一樣的,都是用來保護,而“殼”用來保護可執(zhí)行程序資源,避免被其他人窺探和篡改,但是殼又不會改變或影響原程序的功能。
殼根據(jù)加密和非加密的技術(shù)手段來作分類,一般分為兩類:
- 壓縮殼(非加密)
- 加密殼
無論哪種技術(shù)手段,加殼的流程都是大致是相同的。我們給自身軟件加殼后,就會產(chǎn)生出一個新程序,新程序是由殼和原程序兩部分組成。
系統(tǒng)在執(zhí)行這個新程序的時候,先去執(zhí)行殼程序,由殼對原程序進行解壓(或解密)并還原到內(nèi)存中去,系統(tǒng)將正常執(zhí)行原來的程序。
由此,了解的殼的定義:
新程序(已加殼) = 殼程序 + 加殼流程 + 原程序
加殼原理
開發(fā)人員對原程序加殼的工作流程(加殼原理):
-
壓縮/加密:對原始程序的代碼段、數(shù)據(jù)段等關(guān)鍵部分進行壓縮或加密,使其變成一堆“亂碼”。
-
植入外殼:生成一個外殼程序,并將加密/壓縮后的原始程序數(shù)據(jù)作為一部分附加在這個外殼程序后面。
-
修改入口點:修改生成的可執(zhí)行文件的“程序入口點”(OEP, Original Entry Point),使其指向外殼程序的代碼,而不是原始程序的代碼。

加殼后的程序,在系統(tǒng)里的執(zhí)行流程:
-
用戶雙擊啟動加殼后的程序。
-
操作系統(tǒng)加載器將程序讀入內(nèi)存。此時,內(nèi)存中的代碼是外殼的代碼,原始程序部分仍是加密/壓縮狀態(tài)。
-
CPU 開始執(zhí)行外殼代碼。
-
外殼程序開始工作:
- 檢查自身是否被調(diào)試。
- 解密 或 解壓縮 內(nèi)存中的原始程序數(shù)據(jù)。
- 進行必要的環(huán)境修復(如重建導入表)。
-
外殼程序?qū)?CPU 的執(zhí)行流跳轉(zhuǎn)到原始程序的真正入口點(OEP)。
-
至此,原始程序開始正常運行,和執(zhí)行原程序一樣效果。
脫殼原理
理解了加殼后,脫殼就很好理解了,就是逆回來操作一次。
什么是脫殼?
摘掉殼程序,將加密/壓縮后可執(zhí)行文件還原出來。
脫殼的基本原理:
脫殼的核心思想是 “內(nèi)存轉(zhuǎn)儲”。因為無論外殼多么復雜(加密多完好),它最終都必須在內(nèi)存中將原始程序完整地、可執(zhí)行地還原出來。 脫殼就是要抓住這個瞬間。
脫殼的方法:

對抗與演進
加殼與脫殼就像是一場永無休止的“軍備競賽”。
殼的進化:出現(xiàn)了 VMProtect、Themida 等“強殼”。它們使用虛擬機保護技術(shù),將原始代碼翻譯成自定義的指令集,極大地增加了分析和脫殼的難度。
脫殼技術(shù)的進化:出現(xiàn)了自動脫殼機、腳本、以及更高級的動態(tài)和靜態(tài)分析技術(shù),專門研究反虛擬機保護技術(shù)的人員。
推薦一些大佬的博客:
系統(tǒng)安全基礎(chǔ)專題導航
http://www.rzrgm.cn/17bdw/p/15336209.html
浙公網(wǎng)安備 33010602011771號