之前,花了三、四天的時(shí)間寫了一個(gè)壓縮殼,Mark一下。
我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、姜堰ssl等。為數(shù)千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的姜堰網(wǎng)站制作公司
簡單說下邏輯:
1、MFC實(shí)現(xiàn)的UI交互部分:展示殼的功能,獲取被加殼程序的路徑,顯示加殼進(jìn)度。
2、加殼功能Pack導(dǎo)出為一個(gè)dll,MFC部分動(dòng)態(tài)加載。
3、殼的本體Stub,把數(shù)據(jù)段、只讀數(shù)據(jù)段合并到代碼段,添加到被加殼程序的最后。
簡單說下功能:
1、支持反調(diào)試,檢查PEB可以過x64dbg,NtQueryInformationProcess可以過StrongOD。
2、加密代碼段,用的AES加密庫。大概思路:遍歷區(qū)段頭表,找到.text區(qū)段頭表,通過PointerToRawData字段加上被加殼程序讀取到內(nèi)存中的首地址,找到.text段在內(nèi)存中的位置;通過SizeOfRawData得到它的文件大??;調(diào)用AES加密庫。
3、壓縮代碼段,大概思路:通過.text段頭表找到.text段,調(diào)用壓縮庫壓縮。申請內(nèi)存空間,大小=PE頭+已壓縮.text+其他區(qū)段。依次從內(nèi)存空間把文件拷貝過去:PE頭、已壓縮.text段、其他區(qū)段,重組PE文件。同時(shí),修改.text的SizeOfRawData、修改其他區(qū)段的PointerToRawData。
4、檢測虛擬機(jī),大概思路:動(dòng)態(tài)獲取遍歷進(jìn)程的幾個(gè)函數(shù),在殼里面檢測虛擬機(jī)相關(guān)的進(jìn)程。
5、IAT加密,大概思路:遍歷被加殼程序的導(dǎo)入表,獲取API函數(shù)地址,動(dòng)態(tài)加密。申請內(nèi)存空間,寫入解密和跳轉(zhuǎn)的shellcode。IAT表地址改為指向這個(gè)內(nèi)存空間。
6、重定位,有多處需要重定位。
6.1、Stub.dll的.text段需要進(jìn)行重定位,因?yàn)槟J(rèn)加載基址從0x10000000變成了0x400000。
6.2、要想被加殼程序支持重定位,需要把被加殼程序的重定表重定向Stub.dll的.reloc段。因?yàn)闅こ绦騼?yōu)先執(zhí)行,利用系統(tǒng)自動(dòng)完成殼部分的重定位。在殼程序中,手動(dòng)完成目標(biāo)程序的重定位。
7、TLS,需要在殼程序中定義一個(gè)TLS變量,佯裝使用一下,編譯的時(shí)候生成TLS相關(guān)的信息。然后,手動(dòng)調(diào)用被加殼程序的TLS回調(diào)函數(shù)才能成功。
8、在碼云有一個(gè)工程:https://gitee.com/shihuozhiyu/SimplePack
9、有一個(gè)腦圖: