手工脫殼 Advanced Administrative Tools 4.0a (8千字)

看雪資料發表於2000-06-06

版權宣告:本文可自由轉載和引用,但請勿用於商業目的。轉載時請保持完整。
寫作目的:我已很久沒有破解軟體,在偶然的機會里看到了一些看學學苑的脫殼教程,
      隨即順手找了這個軟體練習一下。沒想到竟碰上一個大難題,足足用了我
      一個星期的時間。我先用 ProcDump 的 script 脫掉了殼,後來發現不能
      執行,隨後又看了很多文章,敖了好多夜,才最後解決這個問題。
      我想,cracker 的精神就是共享軟體、共享知識、共享快樂和驕傲。
      這也就是我寫作本文的唯一目的。
寫作日期:新世紀的第一個端午節,6th June, 2000.

脫殼軟體:AATools 4.0a build 4.0.0.596
檔案大小: 752,128 bytes
軟體功能:我沒太注意,只為練習脫殼。
發行公司:G-lock software, http://www.glocksoft.com
脫殼日期:June 3rd, 2000

破解環境:Windows Me (English Version), MMX 200, 64M.
使用工具:Trw2000 V1.21, ProcDump 1.6.2, topo, UltraEdit 7.0, W32dsm89.
---------------------------------------------------------------------------

首先用 ProcDump 看一下 AATools.exe 的 PE 頭。
Entry Point    : 00222001
Size of Image    : 00239000
Image Base     : 00400000

現在執行 trw2k, 起始程式碼如下:
---------    AATOOLS!.data        -----------------------
:00622001 60        PUSHA
:00622002 E801000000    CALL 00622008
:00622007 90        NOP

按 F8 跟蹤,只見這程式費勁了心思、不斷的在記憶體中動態生成程式碼,
從.data 轉換到一段段無名的空間,最後終於變換到 .CODE, 出現下列程式碼:
---------    AATOOLS!.CODE+1754C0    -----------------------
:005764C0 55                      push ebp
:005764C1 8BEC                    mov ebp, esp
:005764C3 83C4F4                  add esp, FFFFFFF4
:005764C6 53                      push ebx
:005764C7 B8705E5700              mov eax, 00575E70
:005764CC E8CF0EE9FF              call 004073A0
:005764D1 8B1D84A85700            mov ebx, dword ptr [0057A884]

經過不斷試驗,確定此時程式已完全脫殼。cs:5764c0 就是程式的新入口點。
由於我沒有註冊的 trw2k, 所以手工脫殼,
E CS:EIP EB FE 90
G
然後執行 ProcDump 脫殼。檔案大小應為 2135K.
(如果將 ProcDump 中的 rebuild new import table 選項選中的話,脫殼後的檔案
大小為 2138K, 同用 script 脫殼的大小一樣)

這時 PE 頭變為:
Name    Virtual Size    Virtual Offset    Raw Size    Raw Offset
CODE    00176000    00001000    001755B8    00000600
DATA    00004000    00177000    00003B30    00175C00
BSS    00002000    0017B000    00000000    0017B000
.idata    00004000    0017D000    00000B04    00179800
.tls    00001000    00181000    00000000    00181000
.rdata    00001000    00182000    00000010    0017A400
.reloc    00019000    00183000    00000000    0017A600
.rsrc    00086000    0019C000    00085BD0    0017A600
.data    00016000    00222000    000158AC    00200200
.data    00001000    00238000    00000000    00215C00

將脫殼後檔案中的 EB FE 90 改回 55 8B EC,然後將 Entry Point 改為 1764C0.
但此時檔案還是不能執行。

再透過 trw2k 跟蹤,
:004073A0 50                      push eax
:004073A1 6A00                    push 00000000
:004073A3 E8F8FEFFFF              call 004072A0
:004073A8 BA00715700              mov edx, 00577100
:004073AD 52                      push edx
:004073AE 8905DCB45700            mov dword ptr [0057B4DC], eax
:004073B4 894204                  mov dword ptr [edx+04], eax
:004073B7 C7420800000000          mov [edx+08], 00000000
:004073BE C7420C00000000          mov [edx+0C], 00000000
:004073C5 E88AFFFFFF              call 00407354
:004073CA 5A                      pop edx
:004073CB 58                      pop eax
:004073CC E827C8FFFF              call 00403BF8
:004073D1 C3                      ret

其中:
:0057D1C0 00 00 00 00 00 00 00 00 00 00 00 00 8C 54 3B 01
:0057D1D0 98 54 3B 01 A4 54 3B 01 B0 54 3B 01 BC 54 3B 01

:004072A0 FF25E4D25700            jmp dword ptr [0057D2E4]

在 cs:0057d2e4 資料為:
:0057D2E0 14 57 3B 01 20 57 3B 01

cs:013b5720 處程式碼為:
:013B5720 E9C91FBBBE          JMP KERNEL32!GetModuleHandleA
:013B5725 1000

:013B572C E99E1FBBBE          JMP KERNEL32!GetModuleFileNameA
:013B5731 1000

繼續跟蹤會發現一段特別的程式碼:
:004013D0 FF258CD25700          jmp dword ptr [0057D28C]

在 cs:0057d28c 資料為:
:0057D28C C4 56 3B 01

:013B56C4 68CE563B01          PUSH DWORD 013B56CE
:013B56C9 E8720F2CFF          CALL 00676640
:013B56CE EB2F

從 PE 頭可知,cs:57d000 - cs:57d000 + b04 為 idata 的資料,
可見從 cs:57d1cc 開始為 first_thunk 庫, 而 cs:013bxxxx 為跳轉表。
(我不知道專門的術語,請指正)
再跟蹤 CALL 00676640, 發現這是一段解碼程式,在很多地方都被呼叫。
而且其內部用了很多硬碼,如:
mov dword ptr [0067xxxx], eax
call 0066xxxx
push 0066xxxx

透過 PE 頭可知:
Size of Image : 00239000
Image Base    : 00400000
所以程式所佔地址空間為 00400000 - 00639000。
可見 00676640, 013bxxxx 都是申請的空間,超出了程式的地址空間,
脫殼後都不會被儲存。

這種加殼方法非常難以恢復,以至我已幾乎失去信心。

經過幾天的實驗和摸索,終於找到解決方法。
簡單講,就是擴充套件脫殼後的程式地址空間,然後將上述地址中的資料移回。
我將儲存 0066 和 0067 段,將 013b 段儲存到 0069 段。
(一開始我將 013b 改到 0064 或 0065, 後來發現不行,浪費了很多時間)

具體步驟如下:
---------------------------------------------------------------------------
1、重新脫殼:(必須手動,因為 script 無法存下 )
bpx 5764c0
1.1 Start AATools
1.2 Interrupted by Trw2k
1.3 Quit AATools

重複執行 1.1 - 1.3,直到 cs: 013b56c9 為 call 0067xxxx.
(0068 或 0069 佔用空間太多,運氣好的話有可能為 0066)

下面以 call 00676640 為例,
鍵入下列命令:
W cs:00664000 L1e000 0066.bin
W cs:013b0000 L8000 013b.bin
W cs:00640000 L200 0064.bin
E cs:eip EB FE 90
G
然後再用 ProcDump 脫殼,假設存為 aa.exe。
將 aa.exe 中的 EB FE 90 改回 55 8B EC. Entry Point 改為 1764c0.
經過觀察,動態申請的006X 記憶體段大小為固定的 1E000 大,013b 為 8000。
00676640 和 00664000 的偏移好像是固定的(請自試之)。
0064 段是後來跟蹤時發現的。

---------------------------------------------------------------------------
2、用 topo, 在aa.exe 中加入大小為 458822 的段,這時 PE 頭變為:
Name    Virtual Size    Virtual Offset    Raw Size    Raw Offset
CODE    00176000    00001000    001755B8    00000600
DATA    00004000    00177000    00003B30    00175C00
BSS    00002000    0017B000    00000000    0017B000
.idata    00004000    0017D000    00000B04    00179800
.tls    00001000    00181000    00000000    00181000
.rdata    00001000    00182000    00000010    0017A400
.reloc    00019000    00183000    00000000    0017A600
.rsrc    00086000    0019C000    00085BD0    0017A600
.data    00016000    00222000    000158AC    00200200
.data    00001000    00238000    00000000    00215C00
.topo0    00070046    00238000    00070200    00215C00

Size of Image : 2c,b000

這時,.topo0 中就有了 00660000 - 006A0000 的空間。

---------------------------------------------------------------------------
3、使用 UltraEdit 7.0 改換地址。

3.1 將 .idata 段的所有 013b 改為 0069。
(最好先從aa.exe 中抽出存入 idata.bin 中)

3.2 將 013b.bin 中的地址改換。

:013B5720 E9C91FBBBE    (3.2.1)      JMP KERNEL32!GetModuleHandleA
:013B5725 1000
如果 013B 移為 0069 的話,應為
:00695720 E9C91F8DBF
:00695725 1000

:013B56C4 68CE563B01    (3.2.2)      PUSH DWORD 013B56CE
:013B56C9 E8720F2CFF    (3.2.3)      CALL 00676640
:013B56CE EB2F
改為
:006956C4 68CE566900          PUSH DWORD 006956CE
:006956C9 E8720FFEFF          CALL 00676640
:006956CE EB2F

具體實施如下:
3.2.1 從 be ac 開始,一直到 be bf, ( be ad, be ae, ..., be bb, ... be bf )
    將 ac be 10 改為 7e bf 10
    將 bf be 10 改為 91 bf 10
013b        0069    ( 0069 + 00d2 == 013b )
be ac    ->    bf 7e    (2 places)
...
be bb    ->    bf 8d
...
be bf    ->    bf 91    (1 place)
(由於我漏改了一處 be ac, 程式總是丟擲個Exception, 說 Imagelist1.Bitmap
呼叫出錯,以至於我除錯了很久、很久...很久)

3.2.2 將所有的 013b 改為 0069

3.2.3 將 2c ff, 2b ff 改為 fe ff, fd ff
013b        0069    ( 0069 + 00d2 == 013b )
ff 2c    ->    ff fe
ff 2b    ->    ff fd

3.3 改動 0066.bin,將0067:d800 後所有 013b 改為 0069。
經過跟蹤發現,程式在 0067:d800 - 0067:d9a0 處還有一段 import table 資料。
好在資料已儲存在 0066.bin 中了。
(如果地址不同的話,我估計偏移量應該相同,00664000 - 0067d800 )

---------------------------------------------------------------------------
4、用 UltraEdit 恢復 aa.exe。
Raw Offset    Virtual Offset    Copy Size
0021,5c00    0063,8000
0021,dc00    0064,0000    200
0023,dc00    0066,0000    1,e000
0026,dc00    0069,0000    8000

按照相應的位置和大小,將 0064.bin, 0066.bin, 013b.bin 複製到 aa.exe 中。

---------------------------------------------------------------------------
5、至此程式已完全脫殼,執行無誤。
但我發現只能在 Windows Me 下執行,不能在 Win2k Pro 執行。(同機不同硬碟)
另外,在 PWin98, 16M 機器上也不能執行。
我只能接觸到這兩種機器,其他的請自試驗。
估計是要改正 PE 頭,使之能夠在 NT 下執行。

---------------------------------------------------------------------------
6、總結:
據網友說AATools 用的是一種新的 Asprotect , 此種保護實在是非常難於脫殼。
經過我的實踐,相信我的方法基本上已經可以解掉此類加殼方式。
Cracking 其實沒有什麼神秘之處,只要知道了基本方法,剩下的只是耐心和毅力。

另:一開始我用的是 trw2k v1.21,後來剛好碰上新出的 v1.22。
新版本穩定多了,非常好用。只可惜還是要提示,註冊費也太貴。不爽而破之。:-p

-全文完-

相關文章