找Entry Point的又一方法 -----針對Asprotect v1.0加殼的程式
【前言】
這幾天我在搗鼓對Asprotect加殼程式的脫殼,結果戰況慘烈。花了N個鐘頭,所獲甚少。急瘋的時候,就差向Asprotect作者索要程式原始碼了(當然也想過綁架他,可路費俺花不起)。從跟蹤幾個加殼程式的情況來看,發現它們的脫殼難度不同,雖然在用FileInfo檢測的時候都報告ASProtect
+ ASPack v1.084加殼。(看來這種"偵察兵"工具也該加緊升級了!!!)
由於Asprotect加殼的程式大多都有防跟蹤的程式碼,已知的有檢測SICE,SIWVID,SIWDEBUG,BCHK。(想了解手動跳過防跟蹤的方法請看國外大師的文章)這裡我可不想每次都把時間花在這上面。我用ICEPatch修補了SoftICE。
以下以Asprotect加殼過的ARPR v1.0為例吧。(注:從我跟蹤的Azpr v3.10、AATool v4.0的情況來看,都與此類似。你也可以用Asprotect
v1.0加殼一個程式來試試)
樣例檔案: arpr.exe (ARPR v1.0的主程式檔案)
加殼方式: ASProtect + ASPack v1.084
檢測工具: FileInfo
除錯工具: SoftICE v4.05,ICEPatch v2.0
目標: 找到Entry Point
作者: ljttt
日期: 2000-08-03
一、粗步確定Entry Point的所在的Call呼叫的方法
首先,要找個比較好的入口進入arpr.exe。由於修補了SoftICE,所以就以這種防跟蹤的部分為我們設斷點進入的地方。
1、設斷點
bpint 3
(注:對於只檢測NTICE等防跟蹤的加殼程式,可以設斷點 bpx CreateFileA,以後類似。不同的地方可能是以後要多按幾個F12吧)
這時,一般你可以看到類似如下的螢幕:
015F:004BF23C CC
INT 3
<--你中斷在此
015F:004BF23D EB02
JMP 004BF241
015F:004BF23F E9025DEB02 JMP
03374F46
015F:004BF244 E9FF33C05A JMP
5B0C2648
015F:004BF249 59
POP ECX
015F:004BF24A 59
POP ECX
015F:004BF24B 648910 MOV
FS:[EAX],EDX
015F:004BF24E EB0A
JMP 004BF25A
015F:004BF250 E91305FFFF JMP
004AF768 <--注意這個跳轉語句,int 3過後就要到這裡繼續了。
015F:004BF255 E8AA07FFFF CALL
004AFA04
015F:004BF25A 8A1518514C00 MOV
DL,[004C5118]
015F:004BF260 8B45F8 MOV
EAX,[EBP-08]
2、把游標移到第五個Jmp語句以後,按F7鍵。好,我們過了第一道陷井。然後按三次F12。然後開始按F10跟蹤,
直到出現如下類似螢幕
015F:004BF842 EB13
JMP 004BF857 <--跳轉了
015F:004BF844 E91FFFFEFF JMP
004AF768
015F:004BF849 66B80E00 MOV
AX,000E
015F:004BF84D E8D2EDFFFF CALL
004BE624
015F:004BF852 E8AD01FFFF CALL
004AFA04
015F:004BF857 8B4508 MOV
EAX,[EBP+08] <--跳到此處
015F:004BF85A 8D4818 LEA
ECX,[EAX+18]
015F:004BF85D 8B4508 MOV
EAX,[EBP+08]
015F:004BF860 8B10
MOV EDX,[EAX]
015F:004BF862 8B4508 MOV
EAX,[EBP+08]
015F:004BF865 8B401C MOV
EAX,[EAX+1C]
015F:004BF868 E887F6FFFF CALL
004BEEF4 <---哈哈,目標。這就是Entry
Point所在的Call呼叫。
015F:004BF86D 5F
POP EDI
015F:004BF86E 5E
POP ESI
015F:004BF86F 5B
POP EBX
015F:004BF870 5D
POP EBP
015F:004BF871 C20400 RET
0004
這裡有個竅門,在按完三個F12後,在SoftICE程式碼視窗用PageDown向下翻頁,找最早出現的ret的語句前的Call呼叫處,按F7鍵可以快速來到Entry
Point所在的Call呼叫。這樣不用按F10一步步地跟蹤,不過如果要找import table時,就要一步步的來。
二、找寶貝-------Entry Point
【注】我遇到的Asprotect加殼的程式在跟蹤到Entry Point入口的Call呼叫以後,內部跟蹤時有很大不同,簡單的,不遠處就發現了。難的,其中還有陷井。Asprotect
v1.0加殼的程式就是這種情況。arpr.exe也一樣。而Thumbnailer就沒有這樣的危險。
如果你繼續跟蹤,可能會在一個Call呼叫中發現這種情況。
015F:004AF992 8BC0
MOV EAX,EAX
015F:004AF994 5A
POP EDX
015F:004AF995 54
PUSH ESP
015F:004AF996 55
PUSH EBP
015F:004AF997 57
PUSH EDI
015F:004AF998 56
PUSH ESI
015F:004AF999 53
PUSH EBX
015F:004AF99A 50
PUSH EAX
015F:004AF99B 52
PUSH EDX
015F:004AF99C 54
PUSH ESP
015F:004AF99D 6A07
PUSH 07
015F:004AF99F 6A01
PUSH 01
015F:004AF9A1 68CEFAED0E PUSH
0EEDFACE
015F:004AF9A6 52
PUSH EDX
015F:004AF9A7 E914E3FFFF JMP
KERNEL32!RaiseException
015F:004AF9AC C3
RET
看到了吧,這是一個異常,Asprotect留下的陷井。如果沒有特別的方法,跟蹤就此中斷了,雖然離Entry Point不遠了。(我為此頭痛了好幾天)經過幾天的奮鬥,我找到的以下方法可以繼續跟蹤。
在JMP KERNEL32!RaiseException處(其實你也可以不用進入此Call呼叫中,只要在此Call呼叫前的mov fs:[eax],esp指令後就行了。)
1、下指令
db fs:0
顯示如下
0EE7:00000000 D0 FD 5C 00 00 00 5D 00-00 F0 5B 00 F6 38 77 29 ..\...]...[..8w)
0EE7:00000010 00 00 00 00 00 00 00 00-3C A7 5D 81 01 00 FF FF ........<.].....
0EE7:00000020 00 00 00 00 B1 5D 78 C1-8F 29 00 00 C4 A7 5D 81 .....]x..)....].
0EE7:00000030 4C A5 5D 81 48 69 00 80-?? ?? ?? ?? ?? ?? ?? ?? L.].Hi..........
0EE7:00000040 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ................
2、注意前四個位元組,看到了嗎,前四個位元組為 D0、FD、5C、00。當成長整數,也就是005CFDD0。好了,我們下指令
dd 015F:005CFDD0
(注:這裡下指令 dd 005CFDD0不行,我試過,必須要加你跟蹤時的程式所在段選擇符,就是SoftICE螢幕中程式碼部分最左邊看到的015F:xxxx字樣)
顯示如下
015F:005CFDD0 005CFF68 004BEF31 005CFDF8 004ACAF0
h.\.1.K...\...J.
015F:005CFDE0 00489AEC 004BF654 0045CC6F 00400000
..H.T.K.o.E...@.
015F:005CFDF0 004BE624 005CFE1C 005CFE0C 004BF86D
$.K...\...\.m.K.
3、這裡注意第四-八個位元組,也就是004BEF31。我們下指令
u 004BEF31
(注:這裡可以省略段選擇符)
顯示如下
015F:004BEF31 E93208FFFF JMP
004AF768 <--關鍵!
015F:004BEF36 E8C90AFFFF CALL
004AFA04
015F:004BEF3B 33C0
XOR EAX,EAX
4、看到了嗎Jmp 004AF768,好就在此處下斷點
bpx 4AF768
5、好了,準備工作做完,就再不怕Asprotect給我們下的異常陷井了。按F5繼續,三次以後(因為我跟蹤的情況只有三次異常陷井),還是中斷在我們設好的斷點處。
以後跟蹤的時候,就沒有什麼難點了,OK,Entry Point離你近在咫尺了。
(注:如果你有了經驗,可以還可以進一步簡化跟蹤步驟。找到它要到的地方,直接按F7,就不用那麼多步驟。這也是我前面直接按F7的原因。當然那是我 N *
N次戰鬥後的一點收穫。這裡我想讓大家瞭解一下原因,就寫得詳細一點。如果想了解以上方法的原理,到綠盟處下載第十期的月刊。看看WebCrazy寫的《 Windows
NT/2000內部資料結構探究》一文,如果還不懂,問問WebCrazy吧,抱歉!我只懂這一點兒。如果沒有WebCrazy大蝦的文章,恐怕我還在Asprotect的陷井中兜圈子。唉,Asprotect連CIH病毒中的一些技術都用進去了。不知道以後還有什麼變化。不會把二維變形病毒中的技術也用進去吧,寫個什麼變形引擎之類的,ou,我這不是沒事找抽嗎?)
【後記】
由於手頭上收集的Asprotect加殼程式不多,所以沒法更多的驗證。dr0老兄要我說說,就寫了此文。
對Asprotect加殼程式的脫殼花了我很長時間。就有些問題向RuFeng兄寫信問過,(不過他現在正在開發偵錯程式,打擾他實在抱歉)也沒有下文。cloudnumber9兄這些天也沒碰上。沒辦法,自力更生處理了一部分問題。不過我還有許多問題要向各位請教?(老毛病了)看在我寫文章勞心勞力勞神的份上,知道的就請告訴我。歡迎交流!!!
1、Asprotect v1.0加殼的程式的import table怎樣重建,我用ProcDump得到的不完整,無法使用?手動脫殼也不成功。cloudnumber9兄說國外都已經出了修正工具?那兒有下載?
2、怎樣寫UnAspack之類的工具?那兒有相關文章?
〖宣告〗
說一下我寫文章的目的,我希望大家把它當作是一種技術交流,不要當作教學一類。因為許多觀點還只是我一家之言,我不想誤導初學者。