寫這篇文章的目的是想讓大家了解如何利用現(xiàn)有的工具來(lái)優(yōu)化脫殼后的程序。 因?yàn)橐屆摎?yōu)化過(guò)的程序可以用漢化工具正常漢化的話,要求要稍微高一些,我就基于優(yōu)化后的文件可正常用漢化工具漢化這樣的目標(biāo)來(lái)講解。這篇文章主要是為新手服務(wù)的,所以肯定比較羅唆,高手可以略過(guò)。
這篇文章中我采用 dwing 的 WinUpack 0.39 final 講述。采用 WinUpack 來(lái)講解的原因主要是這款殼把 PE 頭搞得很讓人郁悶,修復(fù)其它脫殼后的程序不需要修復(fù) PE 文件頭,而修復(fù) WinUpack 卻要考慮修復(fù) PE 頭的問(wèn)題,而且這個(gè)殼加殼后把原程序的各個(gè)區(qū)段都合并了,修復(fù)的步驟要多一些,這樣也方便大家了解的更詳細(xì)一點(diǎn)。我準(zhǔn)備分兩部分來(lái)講述,第一部分我采用 WinUpack 0.39 final 來(lái)給我自己用 MASM 寫的一個(gè)示例程序加殼,然后來(lái)進(jìn)行脫殼優(yōu)化,第二部分直接講解 WinUpack 0.39 final 中的那個(gè)中文版 WinUpackC.exe 的脫殼優(yōu)化。其實(shí)本來(lái)直接寫 WinUpackC.exe 的脫殼優(yōu)化就可以了,不過(guò)我開(kāi)始的時(shí)候沒(méi)準(zhǔn)備寫 WinUpack 主程序的脫殼,寫到后來(lái)才發(fā)現(xiàn)用自己寫的示例程序加殼后再談脫殼后的優(yōu)化,有點(diǎn)自說(shuō)自話的感覺(jué),所以臨時(shí)決定加一個(gè) WinUpack 主程序的脫殼優(yōu)化。
一、示例程序的脫殼優(yōu)化
1、脫殼
這里的目標(biāo)程序是我用 MASM 寫的一個(gè)對(duì)話框的簡(jiǎn)單例子,我采用 WinUpack 的默認(rèn)選項(xiàng)把原程序 test.exe 加殼,加殼后的程序名為 test1.exe,大小由原來(lái)的 6.5K 變?yōu)?4.4K。因?yàn)?WinUpack 給程序加殼時(shí)修改了 PE 頭的緣故,普通 OD 可能加載不了用 winUpack 加殼后的程序,所以我們換用看雪兄修改的 OllyICE 載入加殼后的 test1.exe,會(huì)出現(xiàn)一個(gè)“32 位可執(zhí)行文件格式錯(cuò)誤或未知”的錯(cuò)誤對(duì)話框,不用管,點(diǎn)確定,又出現(xiàn)一個(gè)“無(wú)法在內(nèi)存中分配 XXXXX 字節(jié)”的錯(cuò)誤對(duì)話框,繼續(xù)點(diǎn)確定,我們停在這里:
|
WinUpack 的殼比較好脫,F(xiàn)8 到上面的第二條指令時(shí),ESI 所顯示的值就是存放 OEP 的地址。我這里在信息窗口中看到的是以下內(nèi)容:
|
現(xiàn)在我在反匯編窗口中按 CTR+G 直接來(lái)到地址 00401000 處,按 F4,就停在 OEP 處了:
|
現(xiàn)在我們用 LordPE 完全轉(zhuǎn)存 test1.exe 的進(jìn)程,另存為 dumped.exe,現(xiàn)在可以看到這個(gè) dumped.exe 大小有 64K 了。不要關(guān) OD,打開(kāi) ImportREC,選擇進(jìn)程 test1.exe,OEP 填入 1000,選“自動(dòng)查找 IAT”,會(huì)有一個(gè)“發(fā)現(xiàn)一些信息”的對(duì)話框,點(diǎn)確定,再點(diǎn)“獲取輸入表”,現(xiàn)在我們就得到了完整的輸入表了。我們先來(lái)保存一下樹(shù)文件,另存為 test_tree.txt。不要關(guān) OD 和 ImportREC,讓它們都暫時(shí)開(kāi)在那,先復(fù)制一份我們剛才用 LordPE 完全轉(zhuǎn)存出來(lái)的 dumped.exe 備份。
2、根據(jù)對(duì)齊值分析區(qū)段中的內(nèi)容
在開(kāi)始之前,我們先了解一下對(duì)齊的一些概念:文件區(qū)塊有兩種對(duì)齊值,一種是磁盤文件中的,另一種是內(nèi)存中的。PE文件被映射到內(nèi)存時(shí),區(qū)塊總是至少以一個(gè)頁(yè)邊界為開(kāi)始,在x86系統(tǒng)中,每個(gè)內(nèi)存頁(yè)的大小是4K,也就是0x1000字節(jié),所以在x86系統(tǒng)中,PE文件區(qū)塊的內(nèi)存對(duì)齊值一般等于0x1000,每個(gè)區(qū)塊按0x1000之倍數(shù)內(nèi)存偏移位置開(kāi)始。另一種是磁盤對(duì)齊值,這個(gè)實(shí)例磁盤對(duì)齊值是0x1000,每個(gè)區(qū)塊按0x1000之倍數(shù)的文件偏移位置開(kāi)始。有時(shí)為了使磁盤文件更小些,你可以用0x200對(duì)齊值。
有了上面的預(yù)備知識(shí),我們現(xiàn)在用 LordPE 的 PE 編輯器打開(kāi) dumped.exe 來(lái)看看。
現(xiàn)在我們點(diǎn)擊一下區(qū)段按鈕,看看各個(gè)區(qū)段中有什么內(nèi)容。
因?yàn)樯厦嫖覀円呀?jīng)看到文件塊對(duì)齊是 1000H,我們就按 1000H 大小的倍數(shù)來(lái)在16進(jìn)制編輯器中選擇塊,分析數(shù)據(jù)中是否有區(qū)段。先在16進(jìn)制編輯器中查看一下第一個(gè)區(qū)段。
偏移 2000 是第二個(gè)區(qū)段開(kāi)始的地方。有人可能要問(wèn)你怎么知道這是原來(lái)的第二個(gè)區(qū)段開(kāi)始處?呵呵,因?yàn)槲仪懊婵吹轿募?duì)齊粒度為 1000,所以我在16進(jìn)制編輯器中主要注意與 1000 的倍數(shù)對(duì)應(yīng)的偏移地址。當(dāng)我翻到偏移地址為 2000 時(shí),在這個(gè)地址的上面是由一大片 0 填充的,到這個(gè)地址后又開(kāi)始有數(shù)據(jù)了,所以我確定偏移 2000 處應(yīng)該是另一個(gè)區(qū)段的開(kāi)始處。如果你在16進(jìn)制編輯器中看到一大片 0 后突然看見(jiàn)有數(shù)據(jù),你再根據(jù)文件對(duì)齊粒度注意一下數(shù)據(jù)的開(kāi)始地址,一般就可以確定是否已到另一個(gè)區(qū)段了。由16進(jìn)制窗口中查看到的信息,我們可以確定 WinUpack 把我們?cè)瓉?lái)的區(qū)段都合并了,現(xiàn)在我們要把它們分離出來(lái)。
3、分離區(qū)段
要說(shuō)明一下,分離區(qū)段和下面的一節(jié)修正 PE 頭在其他脫殼文件的優(yōu)化中并不是必須的,這里主要針對(duì) WinUpack 的殼。現(xiàn)在關(guān)掉 LordPE,用 WinHEX 打開(kāi) dumped.exe,ALT+G,填入偏移 1000,轉(zhuǎn)到相應(yīng)位置,在偏移 1000 處點(diǎn)右鍵,選擇定義選塊,輸入相應(yīng)數(shù)據(jù)后點(diǎn)確定。
在選好的選塊上右鍵選擇復(fù)制選塊->進(jìn)入新文件,另存為 text.bin。
其實(shí)這個(gè)偏移 1000H,長(zhǎng)度 1000H 的段不保存也無(wú)所謂,這里主要是讓大家熟悉一下保存的方法。同樣,我們把起始偏移為 3000H,大小為 1000H 的那個(gè)段也另存為 data.bin。有人可能要問(wèn)了,你為什么不把起始偏移為 2000H,大小為 1000H 的那個(gè)區(qū)段也保存下來(lái)?呵呵,因?yàn)槲抑肋@里是原來(lái)的放輸入表信息的那個(gè)段,現(xiàn)在已經(jīng)被破壞了,我就不要了。同樣,偏移 4000H 以后的段我也不保存了,那里是資源段,因?yàn)樵谛拚^(guò)程中我可能要用另外的 RVA 地址來(lái)重建資源,所以不保存了。現(xiàn)在我們?cè)?WinHEX 中再定義一個(gè)選塊,從偏移 2000H 直到文件尾,選中后刪除這個(gè)選塊。
4.修正PE頭
現(xiàn)在我們還要做一件事,因?yàn)?WinUpack 把 PE 頭搞得太亂,我們要找個(gè)正常的替換一下。這里我選擇 XP_SP2 下的記事本,用 WinHEX 打開(kāi)記事本,從文件開(kāi)始偏移為 0 的地方選擇一個(gè)大小為 1000H 的選塊,右鍵選擇復(fù)制選塊->以十六進(jìn)制數(shù)值方式,現(xiàn)在轉(zhuǎn)到我們正在 WinHEX 中編輯的 dumped.exe,定位到文件開(kāi)始偏移處,右鍵選擇剪貼板數(shù)據(jù)->寫入(從當(dāng)前位置覆寫),把記事本的文件頭粘貼過(guò)來(lái)。
完成上述工作后保存 dumped.exe,現(xiàn)在文件大小變成 8K 了,用 PETools 的 PE 編輯器來(lái)打開(kāi)這個(gè)文件,進(jìn)行一些修改。先點(diǎn)擊文件頭按鈕。
把區(qū)段數(shù)由 3 改成 1 后確定,再點(diǎn)擊可選頭按鈕。
改一下上面的鏡像基址為 00400000,點(diǎn)擊確定。這里可以參考原來(lái)備份的 dumped.exe 文件來(lái)修改(我前面已經(jīng)說(shuō)過(guò)要備份原來(lái)的那個(gè) dumped.exe 文件用作參考,你不會(huì)沒(méi)備份吧?)。
5、修正及添加區(qū)段
現(xiàn)在點(diǎn)擊區(qū)段按鈕,修改一下區(qū)段的一些屬性。因?yàn)榍懊嫖覀円呀?jīng)把區(qū)段改為 1 了,現(xiàn)在打開(kāi)區(qū)段后,只看到一個(gè) .text 區(qū)段。在這個(gè)區(qū)段上右擊,選擇編輯區(qū)段頭。
因?yàn)槲覀儸F(xiàn)在的 .text 段是從偏移 1000H 開(kāi)始的,大小為 1000H,所以我們要把上面的虛擬偏移和 RAW 偏移都改成 1000,虛擬大小和 RAW 大小也要改成 1000。在彈出的對(duì)話框上進(jìn)行設(shè)置。
完成上述修改后點(diǎn)確定,回到區(qū)段編輯器中,現(xiàn)在我們要添加一個(gè)大小為 1000H 的段,用來(lái)存放輸入表。這里可能大家也有疑問(wèn):你是知道原來(lái)的輸入表段大小為 1000H,如果你不知道呢?你知道要添加多大的一個(gè)區(qū)段?其實(shí)我這里添加區(qū)段的大小是根據(jù) ImportREC 的新建輸入表信息中的大小來(lái)的。
我們可以在 ImportREC 中看到新建輸入表的大小是 18CH,根據(jù)區(qū)段的對(duì)齊粒度 1000H,我這里就選大小為 1000H,已經(jīng)夠用了。這里要留一點(diǎn)余量,有時(shí)脫一些殼修復(fù)時(shí),余量留的過(guò)小則修復(fù)的輸入表不完全,這時(shí)可以從文件中刪除這個(gè)區(qū)段,再按 1000H 的對(duì)齊粒度新建一個(gè)大一點(diǎn)的區(qū)段,重新修復(fù)輸入表。現(xiàn)在繼續(xù)我們前面的話題,在區(qū)段編輯器中右鍵點(diǎn)擊,選擇添加區(qū)段菜單項(xiàng),在彈出的對(duì)話框上進(jìn)行設(shè)置。
PETools 默認(rèn)添加區(qū)段的名稱是 .NewSH,為了便于識(shí)別這個(gè)段是用于存放輸入表信息的,我們把名稱選為 idata。其他的 RAW 數(shù)據(jù)及虛擬數(shù)據(jù)大小我們都填 1000,選擇用 0x00 填充區(qū)段,現(xiàn)在點(diǎn)確定,一個(gè)新區(qū)段就添加進(jìn)來(lái)了。
我們可以看出 .idata 段的虛擬偏移是 13000,這肯定不正確,我們應(yīng)該保證各個(gè)段的虛擬地址都是連續(xù)的。.text 段的虛擬偏移是 1000H,虛擬大小是 1000H,這樣虛擬偏移 + 虛擬大小 = 1000H + 1000H = 2000H,可知下一個(gè)區(qū)段的虛擬偏移應(yīng)該是 2000H。同樣道理 RAW 偏移也應(yīng)該是連續(xù)的,雖然有時(shí)候我們看到有類似這樣的:第一個(gè)區(qū)段:RAW 偏移:400H,RAW 大小:1D0;第二個(gè)區(qū)段:RAW 偏移:600H,RAW 大小:1B8,這樣看起來(lái)好像并不連續(xù)啊。因?yàn)?400 + 1D0 = 5D0,下一個(gè)區(qū)段應(yīng)該從 5D0 開(kāi)始才對(duì)。但如果你用16進(jìn)制工具打開(kāi)文件看一下就知道了。這種情況是文件粒度按 200H 對(duì)齊,區(qū)段中的實(shí)際數(shù)據(jù)沒(méi)有 200,這里顯示的只是實(shí)際的數(shù)據(jù)大小,剩下的按 200H 對(duì)齊的部分用 0x00 填充了。所以下一個(gè)區(qū)段還是按文件對(duì)齊粒度設(shè)置偏移的。同樣,文件對(duì)齊粒度是其他數(shù)值時(shí)也存在這種情況。說(shuō)了這么多,大家應(yīng)該也明白了,編輯一下 .idata 的區(qū)段頭,把虛擬偏移 13000 改成 2000。至于后面那個(gè)特征值為什么可以改成 C0000040,我就不多說(shuō)了,在編輯區(qū)段的時(shí)候點(diǎn)一下特征值后面那個(gè) ... 按鈕,上面應(yīng)該可以看到詳細(xì)的說(shuō)明。
6、修正輸入表
現(xiàn)在我們的前期工作暫告一個(gè)段落,保存好我們的修改退出 PETools,現(xiàn)在輪到 ImportREC 上場(chǎng)了。你的 ImportREC 應(yīng)該沒(méi)關(guān)吧?我們把添加一個(gè)新的節(jié)前面的勾去掉,在新建輸入表信息中 RVA 填 00002000(就是我們新建的那個(gè) ,idata 段的偏移地址),點(diǎn)擊修復(fù)轉(zhuǎn)存文件,選擇我們剛才修改的 dumped.exe 進(jìn)行修復(fù),得到 dumped_.exe。
7、修正資源
到這還有兩個(gè)重要的事別忘了,一個(gè)是我們保存的那個(gè)數(shù)據(jù)段(data.bin)要放進(jìn)程序里來(lái),還有個(gè)就是資源還沒(méi)有。現(xiàn)在我們先把資源弄出來(lái)。拿出 dREAMtHEATER 兄的 FixRes,選擇我們?cè)瓉?lái)備份的那個(gè) dumped.exe,使用 FixRes 的 Dump 功能,把資源段按我們定義的 RVA Dump 出來(lái)。
因?yàn)榍懊孢€有一個(gè)數(shù)據(jù)段 RVA 是 3000,大小是 1000,所以我們把新建資源段的 RVA 設(shè)為 4000。按上面那樣設(shè)置好后我們就可以點(diǎn)擊 Dump Resource 按鈕來(lái) Dump 資源了,文件被保存為 rsrc.bin。
8、裝配文件
現(xiàn)在進(jìn)入最后的裝配工作了,用 LordPE 的 PE 編輯器打開(kāi) dumped_.exe,點(diǎn)擊區(qū)段按鈕,進(jìn)入?yún)^(qū)段編輯功能中。
現(xiàn)在我們要把磁盤上的 data.bin 和 rsrc.bin 都添加到程序中來(lái),右鍵選擇從磁盤載入段,按順序添加 data.bin 和 rsrc.bin,添加好后改一下區(qū)段名和標(biāo)志。
現(xiàn)在退出區(qū)段編輯,點(diǎn)目錄按鈕,修正一下資源及其他的目錄。在這個(gè)程序中輸入表目錄已經(jīng)不需要我們?cè)俑牧耍覀円牡木褪琴Y源目錄的 RVA 及大小,把其他沒(méi)用到的目錄 RVA 和 大小清零。我們?cè)儆靡粋€(gè) LordPE 的 PE 編輯器打開(kāi)備份的 dumped.exe 文件來(lái)做參考。
9、修正可選頭及最終優(yōu)化
保存以上工作后關(guān)掉 LordPE,我們可以看到 dumped_.exe 的圖標(biāo)已經(jīng)出來(lái)了,說(shuō)明資源已經(jīng)修復(fù)。現(xiàn)在再用 PETools 的 PE 編輯器打開(kāi) dumped_.exe(這里換 PETools 的原因是因?yàn)?PETools 編輯 PE 頭的功能比較強(qiáng)),點(diǎn)擊可選頭按鈕,進(jìn)入可選頭編輯器。現(xiàn)在主要要修改的就是代碼基址和數(shù)據(jù)基址,代碼基址一般就是第一個(gè)區(qū)段(我們這里是 .text 段)的 RVA,所以這里應(yīng)該填 1000,數(shù)據(jù)基址一般指除了代碼外的部分開(kāi)始的 RVA,我們這里代碼部分 RVA 是 1000,大小是 1000,加起來(lái)就知道除了代碼外的數(shù)據(jù) RVA 是 2000,就是我們第二個(gè)段 .idata 的 RVA。修改完這些內(nèi)容后最后要糾正一下鏡像大小,否則程序還是不能運(yùn)行。
代碼大小和已初始化數(shù)據(jù)大小改不改都無(wú)所謂,我是為了好看點(diǎn)把它改了。一般的代碼大小就是指 .text 段的大小,.text 段后面所有段的大小加起來(lái)就可以作為已初始化數(shù)據(jù)大小。全部改完后點(diǎn)鏡像大小后面的那個(gè)“?”按鈕,糾正一下鏡像大小,現(xiàn)在就可以保存退出 PETools 了。
到這基本工作已經(jīng)完成了,修復(fù)后的 dumped_.exe 大小為 20K,運(yùn)行一下,一切正常。不過(guò)這里的 20K 大小還和我們?cè)瓉?lái)的 6.5K 有差距,如果手工修改的話我們可以先把文件對(duì)齊的粒度設(shè)為 200,再用16進(jìn)制工具打開(kāi)程序,把按照 200H 倍數(shù)對(duì)齊的各個(gè)區(qū)段的多余的全是 0 的部分刪掉,再根據(jù)保留下來(lái)的部分調(diào)整一下區(qū)段的 RAW 偏移和大小。當(dāng)然你可以用 PETools 或 LordPE 的重建功能來(lái)重建一下程序,也會(huì)完成上述功能。不過(guò)我們這里是希望能用漢化工具正常漢化的,所以我們不能用 PETools 或 LordPE 的重建功能來(lái)重建程序, 因?yàn)樗鼈冎亟ǖ某绦螂m然可以正常使用,也比較小,但若用來(lái)漢化是很容易出錯(cuò)的。這里還是不要手工來(lái)調(diào)整了,我們直接用一下 PE Optimizer 這個(gè)工具來(lái)優(yōu)化程序一下,這個(gè)工具優(yōu)化出來(lái)的程序基本上和手工修改的差不多。優(yōu)化后我們?cè)倏匆幌麓笮。?0K->6.5K,呵呵,和我們?cè)瓉?lái)的程序一樣大。
二、 WinUpack 主程序的脫殼及優(yōu)化
如果文章寫到這里收工的話,估計(jì)會(huì)有人說(shuō)你自己編個(gè)程序,再加個(gè)殼來(lái)談脫殼后的優(yōu)化,你完全可以對(duì)照原程序來(lái)進(jìn)行啊。OK,那我們就來(lái)個(gè)沒(méi)有對(duì)照的,冒著被 dwing 狂扁的危險(xiǎn),我就拿 WinUpack 0.39 final 中的那個(gè)中文版 WinUpackC.exe 來(lái)開(kāi)刀。不過(guò) dwing 要來(lái)了,大家要掩護(hù)我逃跑啊,呵呵。
WinUpackC.exe 脫殼我就不多說(shuō)了,OEP 是 0040A4BE,直接在 OD 中 CTR+G 轉(zhuǎn)到地址 0040A4BE,F(xiàn)4 運(yùn)行到這,就可以用 LordPE 完全轉(zhuǎn)存了。我們還是把轉(zhuǎn)存后的文件保存為 dumped.exe。現(xiàn)在不要關(guān) OD,在 ImportREC 中選擇 WinUpackC.exe 的進(jìn)程,輸入 OEP:A4BE,選自動(dòng)查找 IAT,可以得到正確的輸入表,大小是 00000B18。保存一下樹(shù)文件備用。讓 OD 和 ImportREC 都開(kāi)在那,現(xiàn)在我們用 LordPE 的16進(jìn)制編輯區(qū)段功能來(lái)觀察一下第一個(gè)區(qū)段中的內(nèi)容。具體怎么分析原來(lái)區(qū)段的起始地址我前面已經(jīng)說(shuō)過(guò)了,此處只談結(jié)果。經(jīng)分析可知偏移 1000-AFFF應(yīng)該是代碼段,大小為 A000;B000-DFFF 應(yīng)該是數(shù)據(jù)段,E000-FFFF 應(yīng)該是另一個(gè)段;功能我不是很清楚 ,可能原來(lái)也用于存放輸入表信息的。我就把它和前面的 B000-DFFF 一起當(dāng)成數(shù)據(jù)段,這樣數(shù)據(jù)段就大小就是10000 - B000 = 5000;10000-11FFF 應(yīng)該是資源段;12000-12FFF 包含了部分輸入表的信息,應(yīng)該是加殼后搞出來(lái)的。不過(guò)這個(gè)段對(duì)我們毫無(wú)作用,不作考慮。現(xiàn)在對(duì)我們有用的就是偏移 1000-FFFF 的部分,這里有兩個(gè)區(qū)段。根據(jù) ImportREC 中所顯示的輸入表大小 00000B18 及前面兩個(gè)段用到的偏移,我們只要在偏移 10000 處添加一個(gè)大小為 1000 的段用來(lái)存放輸入表信息就可以了。因此資源段我們應(yīng)該讓它從 11000 開(kāi)始。分析完了就可以開(kāi)工了,先把 dumped.exe 復(fù)制一份留作參考,WinHEX 上場(chǎng),ALT+G 轉(zhuǎn)到偏移 10000 處,從此處開(kāi)始選擇一個(gè)直到文件結(jié)尾的塊,刪除。我們還是借用一下 XP_SP2 記事本的文件頭,把記事本偏移 0-FFF,大小為 1000 的內(nèi)容復(fù)制過(guò)來(lái),覆蓋到 dumped.exe 的對(duì)應(yīng)位置。全部完成后保存 dumped.exe。現(xiàn)在由 PETools 上場(chǎng),用其 PE 編輯器打開(kāi) dumped.exe,先把區(qū)段數(shù)改為 2,再修正一下鏡像基址為 00400000,然后轉(zhuǎn)到區(qū)段編輯器,根據(jù)我們上面分析的兩個(gè)區(qū)段的偏移及大小調(diào)整區(qū)段的虛擬偏移、大小;RAW 偏移、大小。完成后再新建一個(gè)區(qū)段用來(lái)保存輸入表信息,偏移是 10000,大小為 1000,再修改一下特征值。
現(xiàn)在關(guān)掉 PETools,我們開(kāi)始用 ImportREC 來(lái)修正輸入表。去掉添加一個(gè)新的節(jié)前面的勾,在新建輸入表信息中填入 RVA:00010000,點(diǎn)修復(fù)轉(zhuǎn)存文件,選擇我們修改過(guò)的 dumped.exe 來(lái)修復(fù),完成后我們得到 dumped_.exe。到這就要開(kāi)始把資源加進(jìn)去了。 FixRes 上,選我們?cè)瓉?lái)備份的那個(gè) dumped.exe,新建 RVA 為 11000,文件對(duì)齊為 200,Dump 資源為 rsrc.bin。
再讓 LordPE 上場(chǎng)吧(有人要說(shuō)了,這么多工具換來(lái)?yè)Q去你也不嫌累?這個(gè)...是比較累,本來(lái)是打算自己寫一個(gè)工具來(lái)減小工作量的。不過(guò)因?yàn)樘珣校軐⒕途蛯⒕土耍S?LordPE 打開(kāi)修正過(guò)輸入表的那個(gè) dumped_.exe,點(diǎn)區(qū)段按鈕,在區(qū)段編輯窗口中右鍵選擇從磁盤載入段,把我們前面 Dump 的那個(gè) rsrc.bin 添加進(jìn)來(lái)。編輯一下區(qū)段。
現(xiàn)在關(guān)掉區(qū)段編輯,點(diǎn)擊目錄按鈕,再用 LordPE 打開(kāi)備份的 dumped.exe 進(jìn)行參考,我們來(lái)編輯一下 dumped_.exe 的目錄,主要是調(diào)整一下資源目錄的 RVA 和大小,把其他一些沒(méi)用到的目錄 RVA 和 大小清零。
完成后退出 LordPE,再用 PETools 打開(kāi) dumped_.exe,編輯可選頭中的一些內(nèi)容及調(diào)整鏡像大小。
保存我們所做的工作,退出 PETools,現(xiàn)在 dumped_.exe 文件大小是 72.5K。運(yùn)行一下 dumped_.exe,呵呵,正常運(yùn)行了。把 dumped_.exe 復(fù)制一份保存為復(fù)件 dumped_.exe,用 dumped_.exe 給復(fù)件 dumped_.exe 用默認(rèn)選項(xiàng)加個(gè)殼看看, 72.5K->27.3K,原版未脫殼前是 26.6K,看來(lái)還是有差距啊。不管了,用 PE Optimizer 來(lái)優(yōu)化一下 dumped_.exe,72.5K->59.5K,收工。
WinUpack 加殼時(shí)合并了區(qū)段,而一些其他的殼給程序加殼時(shí)并沒(méi)有合并區(qū)段,也沒(méi)有破壞 PE 頭,這樣脫殼后的程序優(yōu)化起來(lái)要簡(jiǎn)單一點(diǎn),可以省掉前面的到脫殼后的第一個(gè)段中判斷區(qū)段及修正 PE 頭的步驟,只要把有用的段給保存下來(lái),沒(méi)用的去掉,選好位置重建輸入表和資源,再裝配起來(lái)就可以了。要想優(yōu)化后的程序可以用漢化工具漢化的話,一般都要把資源放在最后一個(gè)區(qū)段,否則容易出錯(cuò)。而對(duì)應(yīng) DLL 這樣的文件修復(fù)時(shí)要考慮重定位和輸出表,重定位可以采用 ReloX 來(lái)修復(fù),同樣可以指定位置重建。輸出表可以采用看雪兄的工具 PeMove 來(lái)挪移,同樣這個(gè)工具也可以挪移重定位表。關(guān)于 DLL 這類文件的脫殼后優(yōu)化我就不講了,基本方法類似。


