對Asprotect脫殼的一點總結 (20千字)

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

對Asprotect脫殼的一點總結

作者:        (職位空缺)上次忘了留下聯絡電話,這次補上,歡迎各位垂詢,小弟我在此靜候佳音。熱線電話:818-9481818。...你知道這是哪兒的電話號碼。.......公廁電話......... @#$@#$ 燻倒 @#$@#$....
寫作日期:    2000-08-11

【宣告】
我寫文章以交流為主,希望大家在轉載時能保持文章的完整性。

【前言】

從我知道的情況來看,對Asprotect加殼的程式大致可以分為三類:(這種分類方法不具有權威性,只是我自己為了區別而已)

1、這類程式只檢測SICE,SIWVID,SIWDEBUG,記憶體中可以得到完整的import table。一次跟蹤可完成脫殼。
2、這類程式檢測SICE,SIWVID,SIWDEBUG和BCHK,記憶體中也可以得到完整的import table。一次跟蹤也可完成脫殼。
3、這類程式同 2 ,只是記憶體中無法得到完整的import table。因此需要其他手段來輔助得到import table。可能需要幾次跟蹤完成脫殼。

以上三類程式脫殼方式基本相同。因此我把跟蹤過程中幾個關鍵的特徵說明一下。

【分析】

①尋找合適的中斷進入加殼程式。(我稱為找進入點)
(注:在跟蹤之前,最好用ICEPatch修補你的SoftICE,否則你就要手動跳過防跟蹤程式碼了)

對於 1 類程式,一般可以用以下方式進入:
Ctrl-D中斷,進入SoftICE。下指令
bpx CreateFileA do "p ret"
然後按F5返回Windows,執行加殼程式,中斷在我們所設下的中斷處。

以後的跟蹤可以直接繼續,看見不遠處有 ret 語句還可以按 F12 鍵快速返回到上一層呼叫中。

對於 2 、3 兩類程式,一般可以用以下方式進入(操作方法同上,只是設下的斷點不同)。這次我們設斷點
bpint 3

以後的跟蹤與上有些不同,在《找Entry Point的又一方法 -----針對Asprotect v1.0加殼的程式》一文中我已有說明,這裡簡要說明一下。

中斷後一般你可以看到類似如下的螢幕:
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]

把游標移到第五個Jmp語句以後,按F7鍵。好,以後的跟蹤和上面的方法相同。

②檢測CRC的地方
在按了幾個 F12後,一般就到了檢測CRC的程式碼地方,這裡我們不需要做什麼,只是讓大家明白,如果你改到了程式某處,在這裡就要關心一下了。

015F:004C6B74  EBF0                JMP      004C6B66
015F:004C6B76  8B45EC              MOV      EAX,[EBP-14]    <--注意此處
015F:004C6B79  3B45F0              CMP      EAX,[EBP-10]    <--注意此處
015F:004C6B7C  7443                JZ        004C6BC1        <--如果比較的結果相同,就跳轉了,否則就到下面顯示File corrupted! 的框框了
015F:004C6B7E  8A155CC94C00        MOV      DL,[004CC95C]
015F:004C6B84  8B45F8              MOV      EAX,[EBP-08]
015F:004C6B87  E848E4FFFF          CALL      004C4FD4
015F:004C6B8C  8945F4              MOV      [EBP-0C],EAX
015F:004C6B8F  837DF400            CMP      DWORD PTR [EBP-0C],00
015F:004C6B93  742C                JZ        004C6BC1
015F:004C6B95  8D85E4FEFFFF        LEA      EAX,[EBP-011C]
015F:004C6B9B  8D95E9FEFFFF        LEA      EDX,[EBP-0117]

大家注意其中三句的特徵,以後跟蹤時就知道這裡是比較CRC的地方就行了。對於做inline patch的朋友就要記住了。

③獲得 import table 和 Entry Point
在按過幾下 F12 鍵後,就會來到類似如下程式碼的地方,這裡我以ARPR.EXE來做例子,來一段段的分析一下,許多Asprotect加殼的程式都有這樣一段,熟悉了特徵以後,再對Asprotect脫殼你也可以很輕鬆了。

015F:004C6EAB  E828FAFFFF          CALL      004C68D8
015F:004C6EB0  33C0                XOR      EAX,EAX            <--你來到此處,一般 XOR EAX,EAX 是特徵.
015F:004C6EB2  5A                  POP      EDX
015F:004C6EB3  59                  POP      ECX
015F:004C6EB4  59                  POP      ECX
015F:004C6EB5  648910              MOV      FS:[EAX],EDX
015F:004C6EB8  EB11                JMP      004C6ECB            <--跳到下一段
015F:004C6EBA  E9E900FFFF          JMP      004B6FA8
015F:004C6EBF  33C0                XOR      EAX,EAX
015F:004C6EC1  E89EEFFFFF          CALL      004C5E64
015F:004C6EC6  E87903FFFF          CALL      004B7244

以後我們重點關注幾個Call呼叫,以後再跟蹤這類Asprotect加殼的程式就有經驗了。

015F:004C6ECB  33C0                XOR      EAX,EAX
015F:004C6ECD  55                  PUSH      EBP
015F:004C6ECE  68086F4C00          PUSH      004C6F08
015F:004C6ED3  64FF30              PUSH      DWORD PTR FS:[EAX]
015F:004C6ED6  648920              MOV      FS:[EAX],ESP
015F:004C6ED9  8B4508              MOV      EAX,[EBP+08]
015F:004C6EDC  8B00                MOV      EAX,[EAX]
015F:004C6EDE  50                  PUSH      EAX
015F:004C6EDF  B804464C00          MOV      EAX,004C4604
015F:004C6EE4  50                  PUSH      EAX
015F:004C6EE5  6A00                PUSH      00
015F:004C6EE7  8B4508              MOV      EAX,[EBP+08]
015F:004C6EEA  8D4824              LEA      ECX,[EAX+24]
015F:004C6EED  8B4508              MOV      EAX,[EBP+08]
015F:004C6EF0  8D500C              LEA      EDX,[EAX+0C]
015F:004C6EF3  8B4508              MOV      EAX,[EBP+08]
015F:004C6EF6  8B4008              MOV      EAX,[EAX+08]
015F:004C6EF9  E842F0FFFF          CALL      004C5F40            <--注意這個Call呼叫
015F:004C6EFE  33C0                XOR      EAX,EAX
015F:004C6F00  5A                  POP      EDX
015F:004C6F01  59                  POP      ECX
015F:004C6F02  59                  POP      ECX
015F:004C6F03  648910              MOV      FS:[EAX],EDX
015F:004C6F06  EB13                JMP      004C6F1B            <--跳到下一段
015F:004C6F08  E99B00FFFF          JMP      004B6FA8
015F:004C6F0D  66B80B00            MOV      AX,000B
015F:004C6F11  E84EEFFFFF          CALL      004C5E64
015F:004C6F16  E82903FFFF          CALL      004B7244

在以上要注意的Call呼叫處我們可以停下來,下指令
d 401000    (說明: 401000由來為 <Image Base>+<First Section RVA> )
我們可以看到在沒有執行這個Call呼叫之前,資料視窗顯示的為 ?? ??。這說明這段程式碼還沒有載入到記憶體中。如果按 F10鍵執行這個呼叫過後,資料視窗就會顯示各種十六進位制資料。這說明這個Call呼叫的基本功能為載入資料。

(按上段)
015F:004C6F1B  33C0                XOR      EAX,EAX
015F:004C6F1D  55                  PUSH      EBP
015F:004C6F1E  68716F4C00          PUSH      004C6F71
015F:004C6F23  64FF30              PUSH      DWORD PTR FS:[EAX]
015F:004C6F26  648920              MOV      FS:[EAX],ESP
015F:004C6F29  8B4508              MOV      EAX,[EBP+08]
015F:004C6F2C  8B00                MOV      EAX,[EAX]
015F:004C6F2E  50                  PUSH      EAX
015F:004C6F2F  B8485E4C00          MOV      EAX,004C5E48
015F:004C6F34  50                  PUSH      EAX
015F:004C6F35  B85C5E4C00          MOV      EAX,004C5E5C
015F:004C6F3A  50                  PUSH      EAX
015F:004C6F3B  6A00                PUSH      00
015F:004C6F3D  B8645E4C00          MOV      EAX,004C5E64
015F:004C6F42  50                  PUSH      EAX
015F:004C6F43  B8A4894B00          MOV      EAX,004B89A4
015F:004C6F48  50                  PUSH      EAX
015F:004C6F49  8B4508              MOV      EAX,[EBP+08]
015F:004C6F4C  8B4020              MOV      EAX,[EAX+20]
015F:004C6F4F  50                  PUSH      EAX
015F:004C6F50  8B4508              MOV      EAX,[EBP+08]
015F:004C6F53  8D4824              LEA      ECX,[EAX+24]
015F:004C6F56  8B4508              MOV      EAX,[EBP+08]
015F:004C6F59  8B500C              MOV      EDX,[EAX+0C]
015F:004C6F5C  8B4508              MOV      EAX,[EBP+08]
015F:004C6F5F  8B4008              MOV      EAX,[EAX+08]
015F:004C6F62  E81DF1FFFF          CALL      004C6084            <--注意這個Call呼叫
015F:004C6F67  33C0                XOR      EAX,EAX
015F:004C6F69  5A                  POP      EDX
015F:004C6F6A  59                  POP      ECX
015F:004C6F6B  59                  POP      ECX
015F:004C6F6C  648910              MOV      FS:[EAX],EDX
015F:004C6F6F  EB13                JMP      004C6F84            <--跳到下一段
015F:004C6F71  E93200FFFF          JMP      004B6FA8
015F:004C6F76  66B80C00            MOV      AX,000C
015F:004C6F7A  E8E5EEFFFF          CALL      004C5E64
015F:004C6F7F  E8C002FFFF          CALL      004B7244

我們再來關注一下上面這個要注意的Call呼叫。如果你用 F10 鍵帶過這個Call呼叫。會發現資料視窗的內容改變了。好我們再來看看 idata Section所在位置的情況,下指令
d 418000    (注:ARPR.EXE的Image Base為 400000,idata Section 的 RVA 為 18000)
可以看到資料視窗顯示的全是 00,向下翻頁,仍然是 00,這說明這個Call呼叫的功能可能是解壓還原始碼,並且初始化 idata Section。

(接上段)
015F:004C6F84  B84B894B00          MOV      EAX,004B894B
015F:004C6F89  40                  INC      EAX
015F:004C6F8A  890530DA4C00        MOV      [004CDA30],EAX
015F:004C6F90  B82B894B00          MOV      EAX,004B892B
015F:004C6F95  890534DA4C00        MOV      [004CDA34],EAX
015F:004C6F9B  FF0534DA4C00        INC      DWORD PTR [004CDA34]
015F:004C6FA1  33C0                XOR      EAX,EAX
015F:004C6FA3  55                  PUSH      EBP
015F:004C6FA4  6805704C00          PUSH      004C7005
015F:004C6FA9  64FF30              PUSH      DWORD PTR FS:[EAX]
015F:004C6FAC  648920              MOV      FS:[EAX],ESP
015F:004C6FAF  B8485E4C00          MOV      EAX,004C5E48
015F:004C6FB4  50                  PUSH      EAX
015F:004C6FB5  B8AC694B00          MOV      EAX,004B69AC
015F:004C6FBA  50                  PUSH      EAX
015F:004C6FBB  A130DA4C00          MOV      EAX,[004CDA30]
015F:004C6FC0  50                  PUSH      EAX
015F:004C6FC1  A134DA4C00          MOV      EAX,[004CDA34]
015F:004C6FC6  50                  PUSH      EAX
015F:004C6FC7  B8645E4C00          MOV      EAX,004C5E64
015F:004C6FCC  50                  PUSH      EAX
015F:004C6FCD  B894954B00          MOV      EAX,004B9594
015F:004C6FD2  50                  PUSH      EAX
015F:004C6FD3  B874954B00          MOV      EAX,004B9574
015F:004C6FD8  50                  PUSH      EAX
015F:004C6FD9  B834904B00          MOV      EAX,004B9034
015F:004C6FDE  50                  PUSH      EAX
015F:004C6FDF  8B4508              MOV      EAX,[EBP+08]
015F:004C6FE2  8B4020              MOV      EAX,[EAX+20]
015F:004C6FE5  50                  PUSH      EAX
015F:004C6FE6  B9E0944B00          MOV      ECX,004B94E0
015F:004C6FEB  8B4508              MOV      EAX,[EBP+08]
015F:004C6FEE  8B5014              MOV      EDX,[EAX+14]
015F:004C6FF1  8B4508              MOV      EAX,[EBP+08]
015F:004C6FF4  8B00                MOV      EAX,[EAX]
015F:004C6FF6  E8A5F5FFFF          CALL      004C65A0            <--注意這個Call呼叫
015F:004C6FFB  33C0                XOR      EAX,EAX            <--這裡一般就是Dump import table的地方
015F:004C6FFD  5A                  POP      EDX
015F:004C6FFE  59                  POP      ECX
015F:004C6FFF  59                  POP      ECX
015F:004C7000  648910              MOV      FS:[EAX],EDX
015F:004C7003  EB13                JMP      004C7018            <--跳到下一段
015F:004C7005  E99EFFFEFF          JMP      004B6FA8
015F:004C700A  66B80D00            MOV      AX,000D
015F:004C700E  E851EEFFFF          CALL      004C5E64
015F:004C7013  E82C02FFFF          CALL      004B7244

我們來看看上面這個要注意的Call呼叫有什麼作用。如果你用 F10 鍵帶過這個Call呼叫,再看看資料視窗的變化,
我們向下翻頁看看,這次不再是 00,變成各種資料。這說明這個Call呼叫的功能可能是還原 idata Section,因此在該呼叫後的 XOR EAX,EAX就是我們Dump出 import table的地方。對於前面劃分出的三類程式中前兩類,都可以在此處看到完整的 import table,是Dump出 import table的時候了,可以下指令
/dump <Image Base + idata Section RVA> <idata Section Size> <FileName>    (這是ICEDump 1.61的指令用法)
而對於第三類程式則要用其他方法。(補充說明:對於第三類程式的 import table重建問題由於我也沒有找到一種統一的方法。只能不同情況不同對待。因此以後單獨寫文說明。)

如果你喜歡用 bpm 跟蹤 idata Section的變化來做進入點。那麼一般在按幾個 F12鍵後,就在處了。

(接上段)
015F:004C7018  33C0                XOR      EAX,EAX
015F:004C701A  55                  PUSH      EBP
015F:004C701B  6838704C00          PUSH      004C7038
015F:004C7020  64FF30              PUSH      DWORD PTR FS:[EAX]
015F:004C7023  648920              MOV      FS:[EAX],ESP
015F:004C7026  8B4508              MOV      EAX,[EBP+08]
015F:004C7029  E8D6FCFFFF          CALL      004C6D04            <--注意這個Call呼叫
015F:004C702E  33C0                XOR      EAX,EAX
015F:004C7030  5A                  POP      EDX
015F:004C7032  59                  POP      ECX
015F:004C7033  648910              MOV      FS:[EAX],EDX
015F:004C7036  EB13                JMP      004C704B            <--跳到下一段
015F:004C7038  E96BFFFEFF          JMP      004B6FA8
015F:004C703D  66B81100            MOV      AX,0011
015F:004C7041  E81EEEFFFF          CALL      004C5E64
015F:004C7046  E8F901FFFF          CALL      004B7244

如果我們用 F10 鍵帶過這個Call呼叫,會發現資料視窗的內容又有所變化。不過這次我們看到的資料都比較大。如果你進入此呼叫跟蹤會發現它的作用就是獲取idata Section中的各個函式的指標放入此處,如果你對可執行檔案的載入機制有所瞭解的話,那麼就知道這是加殼程式在做Windows的工作,把各個Fircc轉換成真正函式入口指標。因此過了此處,你再就無法獲得"乾淨"的import table了。

(接上段)
015F:004C704B  33C0                XOR      EAX,EAX
015F:004C704D  55                  PUSH      EBP
015F:004C704E  6884704C00          PUSH      004C7084
015F:004C7053  64FF30              PUSH      DWORD PTR FS:[EAX]
015F:004C7056  648920              MOV      FS:[EAX],ESP
015F:004C7059  B8645E4C00          MOV      EAX,004C5E64
015F:004C705E  50                  PUSH      EAX
015F:004C705F  8B4508              MOV      EAX,[EBP+08]
015F:004C7062  8B4810              MOV      ECX,[EAX+10]
015F:004C7065  8B4508              MOV      EAX,[EBP+08]
015F:004C7068  8B5004              MOV      EDX,[EAX+04]
015F:004C706B  8B4508              MOV      EAX,[EBP+08]
015F:004C706E  8B00                MOV      EAX,[EAX]
015F:004C7070  E833F6FFFF          CALL      004C66A8            <---注意此Call呼叫
015F:004C7075  A22CDA4C00          MOV      [004CDA2C],AL
015F:004C707A  33C0                XOR      EAX,EAX
015F:004C707D  59                  POP      ECX
015F:004C707E  59                  POP      ECX
015F:004C707F  648910              MOV      FS:[EAX],EDX
015F:004C7082  EB13                JMP      004C7097            <--跳到下一段
015F:004C7084  E91FFFFEFF          JMP      004B6FA8
015F:004C7089  66B80E00            MOV      AX,000E
015F:004C708D  E8D2EDFFFF          CALL      004C5E64
015F:004C7092  E8AD01FFFF          CALL      004B7244

對於此Call呼叫是什麼作用,我現在還說不出來。如果你用 F10 鍵帶來,一點事沒有。但是如果你是一個好奇心太強的人,按 F8 鍵進入看個究竟的話,那麼我恭喜你,你進入了 Asprotect 的圈套。也許你會在帶過某個Call呼叫時程式執行了。因此你一定以為其中有 Entry Point ,於是重新來過,又進入那個Call呼叫看看,如此反覆,也許你會某一層中發現 Entry Point,果真如此,那麼我十分欽佩你的精神。我在跟蹤到第四層時依然沒有找到,就放棄了。至今我還沒有弄明白這種圈套是怎麼實現的。不過Asprotect作者一定很高興他寫的程式碼一行也沒有浪費。

(接上段)
015F:004C7097  8B4508              MOV      EAX,[EBP+08]
015F:004C709A  8D4818              LEA      ECX,[EAX+18]
015F:004C709D  8B4508              MOV      EAX,[EBP+08]
015F:004C70A0  8B10                MOV      EDX,[EAX]
015F:004C70A2  8B4508              MOV      EAX,[EBP+08]
015F:004C70A5  8B401C              MOV      EAX,[EAX+1C]
015F:004C70A8  E887F6FFFF          CALL      004C6734            <---注意此Call呼叫
015F:004C70AD  5F                  POP      EDI
015F:004C70AE  5E                  POP      ESI
015F:004C70AF  5B                  POP      EBX
015F:004C70B0  5D                  POP      EBP
015F:004C70B1  C20400              RET      0004

如果你是個懶人,直接到此。那麼我說你真有福氣。這個Call呼叫一定要按 F8 鍵進入。其中你可以找到 Entry Point。

④獲取整個記憶體映象
在進入Call呼叫後,對於前兩類程式和後一類程式的情況有所不同

(注:這裡以跟蹤BrickShooter時擷取的螢幕和跟蹤ARPR時擷取的螢幕做一比較)

跟蹤BrickShooter的情況(代表前兩類程式,以下簡稱 ㈠)
015F:0056EB4A  8BC0                MOV      EAX,EAX
015F:0056EB4C  55                  PUSH      EBP
015F:0056EB4D  8BEC                MOV      EBP,ESP
015F:0056EB4F  83C4F8              ADD      ESP,-08
015F:0056EB52  53                  PUSH      EBX
015F:0056EB53  8BDA                MOV      EBX,EDX
015F:0056EB55  8945FC              MOV      [EBP-04],EAX
015F:0056EB58  8B01                MOV      EAX,[ECX]
015F:0056EB5A  8945F8              MOV      [EBP-08],EAX
015F:0056EB5D  6A04                PUSH      04
015F:0056EB5F  B944565700          MOV      ECX,00575644
015F:0056EB64  8D45F8              LEA      EAX,[EBP-08]
015F:0056EB67  BA04000000          MOV      EDX,00000004
015F:0056EB6C  E803E7FFFF          CALL      0056D274            <--Call呼叫
015F:0056EB71  015DF8              ADD      [EBP-08],EBX
015F:0056EB74  EB01                JMP      0056EB77            <--JMP跳轉語句

跟蹤ARPR的情況(代表後一類程式,以下簡稱 ㈡)
015F:004C6732  8BC0                MOV      EAX,EAX
015F:004C6734  55                  PUSH      EBP
015F:004C6735  8BEC                MOV      EBP,ESP
015F:004C6737  83C4F0              ADD      ESP,-10
015F:004C673A  53                  PUSH      EBX
015F:004C673B  56                  PUSH      ESI
015F:004C673C  57                  PUSH      EDI
015F:004C673D  894DF0              MOV      [EBP-10],ECX
015F:004C6740  8955F4              MOV      [EBP-0C],EDX
015F:004C6743  8945FC              MOV      [EBP-04],EAX
015F:004C6746  33C0                XOR      EAX,EAX
015F:004C6748  55                  PUSH      EBP
015F:004C6749  6871674C00          PUSH      004C6771
015F:004C674E  64FF30              PUSH      DWORD PTR FS:[EAX]
015F:004C6751  648920              MOV      FS:[EAX],ESP
015F:004C6754  33C9                XOR      ECX,ECX
015F:004C6756  B201                MOV      DL,01
015F:004C6758  B8088A4B00          MOV      EAX,004B8A08
015F:004C675D  E8AE3CFFFF          CALL      004BA410            <--第一個Call呼叫
015F:004C6762  E86D0AFFFF          CALL      004B71D4            <--第二個Call呼叫
015F:004C6767  33C0                XOR      EAX,EAX
015F:004C6769  5A                  POP      EDX
015F:004C676A  59                  POP      ECX
015F:004C676B  59                  POP      ECX
015F:004C676C  648910              MOV      FS:[EAX],EDX
015F:004C676F  EB0A                JMP      004C677B            <--JMP跳轉語句

對比我們可以發現,㈠ 中只有一個Call呼叫就跟著一個JMP跳轉語句。㈡ 中有兩個Call呼叫才跟著一個JMP跳轉語句。
對於 ㈠ 在JMP跳轉過後,就可以很快找到Entry Point。(當然這以後要按 F8 鍵跟蹤為妙) 對於 ㈡ 則不同,請記住這個特徵,如果有兩個連續的Call呼叫,在跟蹤時,在第二個Call呼叫處按 F8進入看看,如果你發現類似以下程式碼

015F:004B71D2  8BC0                MOV      EAX,EAX
015F:004B71D4  5A                  POP      EDX
015F:004B71D5  54                  PUSH      ESP
015F:004B71D6  55                  PUSH      EBP
015F:004B71D7  57                  PUSH      EDI
015F:004B71D8  56                  PUSH      ESI
015F:004B71D9  53                  PUSH      EBX
015F:004B71DA  50                  PUSH      EAX
015F:004B71DB  52                  PUSH      EDX
015F:004B71DC  54                  PUSH      ESP
015F:004B71DD  6A07                PUSH      07
015F:004B71DF  6A01                PUSH      01
015F:004B71E1  68CEFAED0E          PUSH      0EEDFACE
015F:004B71E6  52                  PUSH      EDX
015F:004B71E7  E914E3FFFF          JMP      KERNEL32!RaiseException
015F:004B71EC  C3                  RET

那麼這就是我在《找Entry Point的又一方法 -----針對Asprotect v1.0加殼的程式》中所介紹的異常地方了。按該文可以繼續跟蹤找到Entry Point。在經過三個異常後,會發現同 ㈠ 一樣的程式碼特徵,只有一個Call呼叫和JMP語句了,那麼以後你可以放心大膽地跟蹤了,沒有什麼陷阱了。(當然在Call呼叫處不要用F10帶過,那可能這只是一個簡單的JMP語句的變形而已)

在Entry Point處我們可以下指令得到全部記憶體映象
/dump <Image Base> <Image Size> <FileName>    (注:此為ICEDump 1.61用法)

以上介紹了跟蹤部分的所有要注意的地方,以及Asprotect加殼程式的一點特徵。下面說一下我們要做的修補工作。
(至於你用 ProcDump 還是 PE Editor 隨你的愛好,我一般用 PEditor,它太棒了。簡直就是為脫殼設計的)

首先,把 各個Section的 Raw Offset 改成 Virtual Offset 大小, Raw Size 改成 Virtual Size大小。

然後,把 Entry Point 改成你發現的大小 。比如我發現的ARPR.EXE的Entry Point為401000,由於Image Base為400000,所以Entry Point就改為 1000,(因為 401000-400000=1000)。

然後,再把 import table 的 RVA改成 idata Section的 RVA,Size改成 idata Section的Size大小。

最後,我們還有一樣工作要做,就是要把 我們得到的記憶體映象檔案中的idata Section部分用我們前面方法得到的idata Section檔案替換掉。你可以用Hex WorkShop來做這項工作,它做起來很方便。

【後記】
因為我跟蹤的Asprotect加殼的程式不算多,所以很可能以偏概全。不過對於跟蹤某些Asprotect加殼的程式你可以依此做一參考。

相關文章