找Entry Point的又一方法 -----針對Asprotect v1.0加殼的程式 (7千字)

看雪資料發表於2000-08-03

找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之類的工具?那兒有相關文章?


〖宣告〗
說一下我寫文章的目的,我希望大家把它當作是一種技術交流,不要當作教學一類。因為許多觀點還只是我一家之言,我不想誤導初學者。

相關文章