2017 年 1 月 1 日,大家昨晚有沒有開心地去跨年看煙火呢?
新年快樂,祝大家新的一年都能荷包滿滿、情侶們感情升溫、單身的都能很快地找到另一半。
一起來積極嗨,消極掰
跨完年的隔天我們還是要繼續把病毒分析學好學滿。
New Year Resolution 就可以加個:今年不再中毒啦!
今天來談不管是正常軟體還是惡意軟體都會使用到的程式金鐘罩-殼[Packer]
甚麼是殼呢?
殼:在動物,植物中,為保護本身而包覆住本體的外部結構
同樣的,在原本的程式碼外圍,用一段程式碼包住,以保護原本程式碼不被輕易修改或反編譯的,也稱之為殼。
殼的用途?
一般而言,殼會在軟體被載入後先執行,來對原本的程式碼解密或還原,解殼後才會進入到原本程式真正要開始執行的地方(Orginal Entry Point;OEP)。由於是在被載入執行後才進行還原,如此便能夠增加反編譯的困難,防止程式過於容易被靜態分析後破解或修改。加殼的目的包括了合法軟體對版權的保護以及電腦病毒防止被分析。
一開始,殼是以對程式加密保護,防止被破解為目的。但是對於病毒的"開發者們"而言,為病毒加殼也就讓防毒分析變得難以"破解"。當然,許多防毒公司對於大眾化的,商用化的殼都有一定的解殼之道,所以由強大的駭客們自製的私有殼也就層出不窮。
對於小而精巧的 DOS 檔而言,對程式加密的確很重要。但對體積較大的 exe 檔而言,壓縮也成為了一個重要的需求。依據需求的不同,從原本單純的加密殼,也就發展到了壓縮殼。
既然殼這麼多,有沒有甚麼辦法能夠知道程式是否被加殼呢?我們可以利用一些簡單的工具來幫我們判斷,像是PEiD、Exeinfo PE 等等。
PEiD
PEiD 十分強大,能夠偵測許多被打包,掩蔽以及編譯的 PE 檔,還能顯示出該程式的入口點以及 subsystem 等資訊。但是對於私有殼就沒有辦法提供精準的判斷。
PEiD 對 calc.exe 進行偵測:
載點
PEiD http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/PEiD-updated.shtml
有哪些殼可以選擇呢?
接下來我們就來介紹幾個比較常見的壓縮殼,加密殼以及簡單介紹何謂私有殼。
1. 壓縮殼:
壓縮殼的目的就是讓軟體的體積減小。需要提供一定的兼容性及穩定性,確保壓縮後的檔案能在不同的平台解壓縮,且能夠正確解壓縮回原檔案。
2. UPX:
UPX 是一個以 command line 方式操作的免費壓縮軟體,使用一種叫做 UCL 的壓縮算法。UCL 最大的好處就是在壓縮及解壓縮的過程中不需要額外的內存,UPX 目有 DOS、Linux 以及 Windows 版本。
左圖為原來的 calc.exe 拉到 Bintext 後所能粹取出來的字串。右圖可以看到對 calc.exe 加了 UPX 後,Text size 明顯變小,且在左圖能看到的 dll 等字串也變成許多已被加密的不可讀字串。
3. WinRAR:
是僅有的幾個可以讀寫 RAR 檔案的軟體之一。它能夠進行資料修復,自訂壓縮後分割檔,設定密碼等。他使用進階加密標準 AES 進行 128 位元加密。AES 的好處在於在他只需要很少的記憶體便能實作加密,而且其安全性達到保護機密資訊的標準。所以如果對一個有設定密碼的 RAR 壓縮檔想進行破解幾乎是不可能的。
對 123.txt 做 rar 壓縮後用 Hiew 觀察其內容。在 123.rar 中看到除了檔名 123.txt 及內容 123456 外還增加了部分的內容。而如果對 123.txt 作壓縮並設定密碼,則只能看到檔名 123.txt,原本檔案的內容則是完全被更改隱蔽了。
4. 加密殼:
不同的加密殼能達到的效果也不太相同。有些加密殼單純是為了防止程式遭到反編譯破解,也有另一些加密殼提供程式的註冊,使用次數以及時間限制。
5. ASProtect:
同時擁有壓縮,加密,CRC 校正等保護措施。他使用了許多效力強大的加密演算法以確保程式保密性,若開發者想要使用註冊機制,他也提供了 RSA 1024 作為註冊的 key generator。在其加殼過程中也可以加入開發者自己寫的 DLL 來增加程式被反編譯的困難度。
6. Armadillo:
是一款應用面很廣的商業殼,可以為程式加上使用時間,次數以及啟動畫面等設定,他的保護功能其中一項稱為 Nanomite
。
Nanomite 技術能夠標記某些程式區段,將這些區段做混淆並寫入記憶體中。對於原本應該是這些程式碼所在的地方則改為 jump。在壓縮前殼再將這些 jump 改為 int 3(op code 為 0xCC)的程式中斷點並紀錄這些標記。如此達到加密
與隱蔽性
的目的,因此 Nanomite 也被稱為 CC 保護
。
Import table Elimination 也是 Armadillo 使用的技術之一。 由於分析師能夠依據程式 import table 裡的 APIs 猜測到這隻程式的意圖,破壞原本程式的 import table 就能夠增加反編譯的困難。這項技術在私有殼中也十分常見。
7. 私有殼:
病毒開發者們為了應付防毒公司對其病毒的追殺,自然而然就產生出了保護病毒的私有殼。簡單的殼例如使用一個 key 以及一種運算(如 and、or、xor、add 等)對主要程式碼處的 byte / word / dword 作修改,如此一來即使將程式載入 IDA 也因為程式碼被殼修改過而無法順利解析,需要以人工方式或動態工具執行後才能看到原本程式碼的內容。
複雜的殼甚至可以在殼中加殼,第一階段殼解析完後的程式碼帶有部分原本要執行的程式碼以及另一階段殼。要產生出複雜的私有殼,對病毒開發者而言必定是會花不少心力,但對病毒公司而言反編譯並解析出原本的程式碼所需投入的時間也跟著增加。
當然,防毒公司不可能因為病毒是私有殼而就束手無策的讓客戶被肆意感染,
有了加殼就有脫殼,下一篇我們就來示範簡單脫殼。
希望有興趣的讀者也能夠點個追蹤,有任何問題或有想多了解的地方也可以回覆在文章底下唷,謝謝你們XDDDD!
參考資料:
《 加密與解密(第三版) 》 - 段剛 編著
Wiki: https://zh.wikipedia.org/wiki/%E5%8A%A0%E6%AE%BC%E5%A3%93%E7%B8%AE
Apriorit: https://www.apriorit.com/white-papers/293-nanomite-technology