手工修復(fù)引入表是破解加殼軟件最難的一道工序,一向是頂尖高手的專利,令我等菜鳥(niǎo)往往望而卻步,而不敢奢望越雷池半步!那么有沒(méi)有簡(jiǎn)單一些的方法呢?通過(guò)本人的實(shí)踐,終于找到了這條捷徑。我的做法可以分為以下幾步:
1、確定程序的OEP,并脫殼。 2、使未脫殼程序處于正常運(yùn)行態(tài),使用ImportREC或LordPE檢查是否所有的API都可識(shí)別,并記錄下不可識(shí)別API的列表及其函數(shù)入口地址。 3、重新啟動(dòng)未脫殼程序,并使之中斷在OEP,用前面記錄到的資料在所有不可識(shí)別API的入口設(shè)執(zhí)行斷點(diǎn),盡可能嘗試軟件所有的功能,通過(guò)跟蹤查清每一個(gè)不可識(shí)別API的名稱及實(shí)際入口地址,并加以記錄。 4、再次啟動(dòng)未脫殼程序,并使之中斷在OEP,用上一步確定的實(shí)際API的入口地址逐一替換相應(yīng)的未識(shí)別API入口地址,然后使程序處于正常運(yùn)行態(tài),使用ImportREC或LordPE進(jìn)行檢查,這時(shí)所有的API就都能識(shí)別了。API識(shí)別完成后,對(duì)已脫殼的程序進(jìn)行FixDump,整個(gè)修復(fù)過(guò)程就完成了。
下面讓我們一起來(lái)親手搞定目前比較兇悍的加殼保護(hù)軟件之一--SVKP1.32(當(dāng)前版本,看雪工具有介紹)。
使用工具:(1)、SoftICE 2.6 根據(jù)http://www.chat001.com/forum/crackforum/251195.html自行制作的修改版 (2)、ImportREC 1.6 (http://www.pediy.com/tools/PE_tools/Rebuilder/Import REC/ucfir16f.zip) (3)、LordPE DLX(http://www.pediy.com/tools/PE_tools/Lordpe/LPE-DLX.ZIP) (4)、UltraEdit 10.10a(http://www.ttdown.com/SoftDown.asp?ID=6718)
目標(biāo)程序: SVK Protect 1.32 (http://www.anticracking.szm.sk/svkp_setup.exe)
安裝目標(biāo)程序,裝載SoftICE。
1、下斷點(diǎn)“bpint 1”,然后啟動(dòng)SVKP.EXE,程序中斷于 001B:07BABC57 CD01 INT 01 下命令“bd 0”關(guān)閉斷點(diǎn),并使用命令“r eip 07BAEE11”修改指令指針,以便躲過(guò)SEH陷阱,再下命令“g 07D31FA5”,使程序中斷于07D31FA5處(當(dāng)然,你也可以使用命令“g 00401000”使程序直接停在OEP處),使用F8鍵單步跟蹤,要不了幾步就可以到達(dá)程序的OEP:00401000 處了。記錄下此值,并記錄下從OEP開(kāi)始的幾行指令及相應(yīng)十六進(jìn)制編碼,下匯編命令“a eip”修改入口指令為“JMP EIP”然后用命令“x”使程序退出SoftICE并在OEP處進(jìn)入死循環(huán)。
2、下面需要從內(nèi)存中Dump出程序。啟動(dòng)LordPE,用鼠標(biāo)指針點(diǎn)選SVKP.EXE進(jìn)程,點(diǎn)鼠標(biāo)右鍵,在彈出的菜單中點(diǎn)選“Correct Image Size”項(xiàng)前先修正映像尺寸。然后在相同的菜單中點(diǎn)選“Dump Full”以Dump出脫過(guò)殼的程序,命名為“SVKP_Dump.exe”。然后還在相同菜單下點(diǎn)選“Burn Process”殺死在內(nèi)存之中處于死循環(huán)狀態(tài)的程序。此后用LordPE的PE Editor功能調(diào)入脫過(guò)殼的SVKP_Dump.exe,修改其OEP的RVA為00001000,保存退出。
3、下面需要復(fù)原SVKP_Dump.exe在OEP處的指令。使用UltraEdit載入SVKP_Dump.exe,使用十六進(jìn)制碼搜索功能搜索以下字節(jié)串
eb fe f3 4b 00
找到后修改為:
68 1d f3 4b 00
改好后存盤(pán)退出。至此,脫殼程序SVKP_Dump.exe修改完畢,剩下的工作就是修復(fù)引入表IAT了。
4、啟動(dòng)ImpotREC,在進(jìn)程列表中選取SVKP.EXE,修改相應(yīng)OEP的RVA為00001000,點(diǎn)擊“IAT Auto Search”按鈕,再點(diǎn)擊“Get Impots”按鈕,逐一檢查API的識(shí)別情況。最后發(fā)現(xiàn),有5個(gè)API程序無(wú)法識(shí)別,對(duì)應(yīng)的入口分別是:
(1) 07D37656
(2) 07D49E52
(3) 07D49E82
(4) 07D333DD
(5) 07D32070
5、重新啟動(dòng)加殼程序,使之停在OEP處,下斷點(diǎn):
(1)、“bpx 07D37656”
(2)、“bpx 07D49E52”
(3)、“bpx 07D49E82”
(4)、“bpx 07D333DD”
(5)、“bpx 07D32070”
然后讓程序繼續(xù)執(zhí)行,分別從斷點(diǎn)處開(kāi)始跟蹤,看看程序調(diào)用的究竟是哪個(gè)API,然后再返回到調(diào)用處看看:
(1) 00401005 CALL [004C521C] -- 07D37656 <-- SVKP API
(2) 00402F04 CALL [004C51A8] -- 07D49E52 <-- KERNEL32!CopyFileA
(2) 0040300B CALL [004C51A8] -- 07D49E52 <-- KERNEL32!CopyFileA
(3) 00402F58 CALL [004C51B0] -- 07D49E82 <-- KERNEL32!CreateFileMappingA
(3) 00403694 CALL [004C51B0] -- 07D49E82 <-- KERNEL32!CreateFileMappingA
(4) 00401086 CALL [004C51F8] -- 07D333DD <-- KERNEL32!GetModuleHandleA
(5) 004011A8 CALL [004C5200] -- 07D32070 <-- KERNEL32!ExitProcess
現(xiàn)在情況就比較清楚了,第一個(gè)API是用于為傳入的地址裝載固定的文本內(nèi)容,只在程序開(kāi)始時(shí)調(diào)用,不是很重要,我們?yōu)樗付ㄒ粋(gè)調(diào)用形式相當(dāng)?shù)腁PI--KERNEL32!GetVersionExA作為替代,其它的API已經(jīng)清楚了。
6、再次啟動(dòng)加殼程序,使之停在OEP處,用識(shí)別出來(lái)的API入口地址替換原來(lái)無(wú)法識(shí)別的API入口地址。在本人的系統(tǒng)下,這些識(shí)別出來(lái)的API的對(duì)應(yīng)地址分別是:
(1)、KERNEL32!GetVersionExA -- 77E6A9C3
(2)、KERNEL32!CopyFileA -- 77E7DA46
(3)、KERNEL32!CreateFileMappingA -- 77E68492
(4)、KERNEL32!GetModuleHandleA -- 77E66C42
(5)、KERNEL32!ExitProcess -- 77E78F94
需要做的工作就是把這些新的入口地址填到相應(yīng)的內(nèi)存單元,就像這樣:
序號(hào) 內(nèi)存地址 修改前 修改后
===============================================
(1)、[004C521C] 07D37656 77E6A9C3
(2)、[004C51A8] 07D49E52 77E7DA46
(3)、[004C51B0] 07D49E82 77E68492
(4)、[004C51F8] 07D333DD 77E66C42
(5)、[004C5200] 07D32070 77E78F94
===============================================
為此,分別下命令:
(1)、 “e 004C521C C3 A9 E6 77”
(2)、 “e 004C51A8 46 DA E7 77”
(3)、 “e 004C51B0 92 84 E6 77”
(4)、 “e 004C51F8 42 6C E6 77”
(5)、 “e 004C5200 94 8F E7 77”
以完成此項(xiàng)修改。
完成此項(xiàng)工作后,下命令“r eip 0040102E”,把EIP從00401000更改為0040102E,讓程序繼續(xù)執(zhí)行。按照前面的第4項(xiàng)操作,你會(huì)發(fā)現(xiàn),所有的API都可以正常識(shí)別出來(lái)了。這時(shí),用鼠標(biāo)點(diǎn)選“Fix Dump”按鈕,在彈出的文件選擇窗中,用Browse功能選取前面已經(jīng)脫過(guò)殼的SVKP_Dump.EXE,點(diǎn)確定就Ok了。
7、由于KERNEL32!GetVersionExA是代用的,所以還需要考慮修改后給程序流向帶來(lái)的影響。
001B:00401000 681DF34B00 PUSH 004BF31D
001B:00401005 FF151C524C00 CALL [004C521C]
001B:0040100B 85C0 TEST EAX,EAX
001B:0040100D 751F JNZ 0040102E
我們看到,修改前:
001B:00401005 FF151C524C00 CALL [004C521C]
總是返回EAX=1,而修改后又總是返回EAX=0,這就改變了程序的實(shí)際流向,必須補(bǔ)救,措施就是把
001B:0040100D 751F JNZ 0040102E
修改為
001B:0040100D EB1F JMP 0040102E
Ok,你都照做了嗎?大功告成!試著啟動(dòng)一下程序看看,是不是很酷?
|