脫殼後軟體減肥大法

看雪資料發表於2015-11-15

最近練習脫殼,將用98的記事本用Armadillo 3.10加殼作試驗,52K --> 324K脫殼後檔案大小達到了588K,比脫殼前竟然大了10倍多,於是想將之減肥,檢視雪精華,沒找到這方面的內容。正在學習PE檔案結構,於是自己動手試驗一下。


先看看加殼前檔案的sections

建議裝入地址:      0x00400000
----------------------------------------------------------
節區名稱  節區大小  虛擬地址  Raw_尺寸  Raw_偏移  節區屬性
----------------------------------------------------------
.text     00003FD4  00001000  00004000  00001000  60000020
.data     0000084C  00005000  00001000  00005000  C0000040
.idata    00000E02  00006000  00001000  00006000  40000040
.rsrc     00004FB8  00007000  00005000  00007000  40000040
.reloc    00000AC6  0000C000  00001000  0000C000  42000040

加殼後:
建議裝入地址:      0x00400000
----------------------------------------------------------
節區名稱  節區大小  虛擬地址  Raw_尺寸  Raw_偏移  節區屬性
----------------------------------------------------------
.text     00003FD4  00001000  00000000  00000000  60000020
.data     0000084C  00005000  00000000  00000000  C0000040
.idata    00005E02  00006000  00000000  00000000  40000040
.reloc    00000AC6  0000C000  00000000  00000000  42000040
.text1    00020000  0000D000  00014000  00001000  E0000020
.adata    00010000  0002D000  00005000  00015000  E0000020
.data1    00010000  0003D000  00006000  0001A000  C0000040
.reloc1   00010000  0004D000  00002000  00020000  42000040
.pdata    00030000  0005D000  0002A000  00022000  C0000040
.rsrc     00005000  0008D000  00005000  0004C000  40000040

脫殼後檔案節表:
建議裝入地址:      0x00400000
----------------------------------------------------------
節區名稱  節區大小  虛擬地址  Raw_尺寸  Raw_偏移  節區屬性
----------------------------------------------------------
.text     00003FD4  00001000  00003FD4  00001000  60000020
.data     0000084C  00005000  0000084C  00005000  C0000040
.idata    00005E02  00006000  00005E02  00006000  C0000040
.reloc    00000AC6  0000C000  00000AC6  0000C000  42000040
.text1    00020000  0000D000  00020000  0000D000  E0000020
.adata    00010000  0002D000  00010000  0002D000  E0000020
.data1    00010000  0003D000  00010000  0003D000  C0000040
.reloc1   00010000  0004D000  00010000  0004D000  42000040
.pdata    00030000  0005D000  00030000  0005D000  C0000040
.rsrc     00005000  0008D000  00005000  0008D000  40000040
.mackt    00001000  00092000  00001000  00092000  E0000060

其中.rsrc是檔案資源節,.mackt節是imprec修復輸入表時候新加的節。

容易發現有用的節只有
----------------------------------------------------------
節區名稱  節區大小  虛擬地址  Raw_尺寸  Raw_偏移  節區屬性
----------------------------------------------------------
.text     00003FD4  00001000  00003FD4  00001000  60000020
.data     0000084C  00005000  0000084C  00005000  C0000040
.idata    00005E02  00006000  00005E02  00006000  C0000040 
.rsrc     00005000  0008D000  00005000  0008D000  40000040
.mackt    00001000  00092000  00001000  00092000  E0000060
其他節都是脫殼後留下的無用的垃圾,所以只要將它們刪掉就可以了達到我們減肥的效果了。當然對具體的殼也要刪除的節也不同,具體問題具體分析吧,:)。

Let's go!

第一步:從節表中刪除
先幾下這幾個節的起始位置,幾個節的Raw是從0000C000到0008D000-1
LordPE中PE Edit中在這幾個節點右鍵選"wipe section header",將這幾個節從節表中刪除.


第二步:從檔案中刪除
HexWorkshop開啟該檔案,選擇偏移0000C000到0008D000-1,然後按del刪除。


第三步:調整節表屬性
只是刪除了節表專案和檔案中內容還不行,還要設定好節屬性。

可以透過程式設計實現資源節的RVA調整,使RVA偏移等於檔案偏移,較麻煩,且.mackt存有輸入表資訊很多RVA值不好改動。
我們用簡單的辦法,不動它的RVA地址,只改變它的檔案偏移。
PE Edit中 先點選sections,然後選擇.rsrc節,右鍵edit section header
因為刪除的節首的Raw offset為0000C000,所以現在.rsrc節的節首Raw Offset為0000C000,更改後。

.rsrc下面的節.mackt的Raw_偏移 = .rsrc節的Raw_偏移 + .rsrc節的Raw_尺寸 = 0000C000 + 00005000 = 

00011000 
故更改.mackt 節的Raw_偏移為 00011000 

還沒完,如果呢現在試驗一下,就會報告不是有效的win32程式
還要調整一下.rsrc節上面的這一節.idata的節區大小,保證相鄰節的VA地址是連續的
(.rsrc節的虛擬地址0008D000) - (.idata節的虛擬地址00006000)  = 00087000
所以設定.idata的節區大小為00087000


第四步:調整資料目錄表屬性
由於我們把.reloc節給刪除了,所以還要在資料目錄表中將Relocation Table清0,當然這一步不是必要,
因為exe檔案基本上不會用到這一節的。


儲存,試驗一下,是不是OK了呢,588K --> 72K,比起原先52K雖然還大了一點,但已經比較滿意了。 :D

相關文章