最近練習脫殼,將用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