一、手動(dòng)加殼
殼是一種較為特殊的軟件师脂。殼分為兩類担孔,一類是壓縮殼,另一類是加密殼吃警。當(dāng)然糕篇,還有介于兩者之間的混合殼。下面先來(lái)手動(dòng)為一個(gè)可執(zhí)行文件加一層外殼酌心,需要準(zhǔn)備的工具有C32ASM拌消、LordPE、添加節(jié)表工具和OD安券。
首先用LordPE查看可執(zhí)行文件墩崩,并對(duì)需要的幾個(gè)數(shù)據(jù)做一個(gè)簡(jiǎn)單的記錄,如圖1所示侯勉。
在LordPE中鹦筹,需要查看幾個(gè)對(duì)于我們需要的數(shù)據(jù),包括PE文件的入口RVA址貌、映像地址和代碼節(jié)的相關(guān)數(shù)據(jù)铐拐。有了這些數(shù)據(jù)以后就可以通過(guò)C32ASM對(duì)代碼進(jìn)行加密了。用C32ASM以十六進(jìn)制的方式打開可執(zhí)行文件练对,然后從代碼節(jié)的文件偏移開始選擇遍蟋,也就是從1000h的位置開始選擇,一直選到4fffh的位置螟凭。然后單擊右鍵虚青,在彈出的快捷菜單上選擇“修改數(shù)據(jù)”命令,在“修改數(shù)據(jù)”對(duì)話框中選擇“異或”算法來(lái)對(duì)代碼節(jié)進(jìn)行加密螺男,如圖2所示棒厘。
使用0x88來(lái)對(duì)代碼節(jié)進(jìn)行異或加密,單擊“確定”按鈕后代碼節(jié)被修改下隧。保存以后使用添加節(jié)表的軟件對(duì)可執(zhí)行文件添加一個(gè)新的節(jié)绊谭,如圖3所示。
添加新的節(jié)區(qū)以后使用OD對(duì)可執(zhí)行文件添加一些代碼汪拥,用OD打開可執(zhí)行程序,來(lái)到00408000地址處篙耗,添加如下代碼:
以上代碼的作用是將上面修改的代碼節(jié)內(nèi)容還原迫筑,然后進(jìn)行保存宪赶。用LordPE修改該可執(zhí)行文件的入口和代碼節(jié)的屬性,如圖4脯燃、圖5和圖6所示搂妻。
運(yùn)行修改過(guò)的可執(zhí)行文件,可以正常運(yùn)行辕棚。
下面整理一下思路欲主,以方便我們寫代碼。最開始用LordPE查看了將要用到的一些PE信息逝嚎,然后用C32ASM對(duì)代碼節(jié)進(jìn)行了簡(jiǎn)單的異或加密扁瓢,接下來(lái)新添加了一個(gè)節(jié)并在新節(jié)中寫入了還原代碼節(jié)的解密指令,最后用LordPE修改了文件的入口地址补君、代碼節(jié)屬性和新添加節(jié)的屬性引几。對(duì)照一下前后兩個(gè)文件的不同之處,如圖7所示挽铁。
從圖中可以看出這兩個(gè)PE文件的差別伟桅,相信大家對(duì)此已經(jīng)沒(méi)有不理解的地方了。下面開始手動(dòng)打造一個(gè)這樣簡(jiǎn)單的加殼軟件叽掘。
二楣铁、編寫簡(jiǎn)單的加殼工具
其實(shí)不按照上面的步驟進(jìn)行也可以,只要步驟是合理的就可以了更扁。我們主要有4個(gè)函數(shù)需要實(shí)現(xiàn)盖腕,分別是獲取PE信息GetPeInfo()、添加新節(jié)AddSection()疯潭、加密代碼節(jié)Encode()和寫入解密代碼WriteDecode()赊堪。我們主要看兩個(gè)函數(shù)的代碼,分別是Encode()和WriteDecode()竖哩。
00408000 > 60 PUSHAD
00408001 B8 00104000 MOV EAX,HelloWor.00401000
00408006 8030 88 XOR BYTE PTR DS:[EAX],88
00408009 40 INC EAX
0040800A 3D 464B4000 CMP EAX,HelloWor.00404B46
0040800F ^ 75 F5 JNZ SHORT HelloWor.00408006
00408011 61 POPAD
00408012 B8 41104000 MOV EAX,HelloWor.00401041
00408017 FFE0 JMP EAX
在虛擬地址和匯編指令的中間部分就是匯編指令對(duì)應(yīng)的機(jī)器碼哭廉,將其取出并定義為C語(yǔ)言的數(shù)組,定義如下:
這個(gè)機(jī)器碼在解密的過(guò)程中要根據(jù)實(shí)際的PE信息進(jìn)行修改相叁,修改的位置有3處遵绰,分別是代碼節(jié)的起始虛擬地址、代碼節(jié)的結(jié)束虛擬地址和程序的原始入口點(diǎn)增淹,代碼如下:
這就是解密代碼椿访,大家可以找個(gè)用VC寫的程序來(lái)進(jìn)行測(cè)試。在這里使用Release版的helloworld測(cè)試通過(guò)虑润。
這個(gè)殼屬于袖珍版的殼成玫,嚴(yán)格來(lái)說(shuō),算不上是一個(gè)殼,但是這個(gè)殼在免殺領(lǐng)域是有用的哭当,也就是把定位到的特征碼進(jìn)行加密猪腕,然后再寫入解密代碼從而隱藏特征碼。一個(gè)真正的殼會(huì)對(duì)導(dǎo)入表钦勘、導(dǎo)出表陋葡、資源、TLS彻采、附加數(shù)據(jù)等相關(guān)的部分進(jìn)行處理腐缤。加密殼會(huì)加入很多反調(diào)試的功能,而且還會(huì)讓殼和可執(zhí)行文件融合在一起肛响,達(dá)到“骨肉相連”的程度來(lái)增加脫殼的難度岭粤。