手工脫殼 Advanced Administrative Tools 4.0a (8千字)
版權宣告:本文可自由轉載和引用,但請勿用於商業目的。轉載時請保持完整。
寫作目的:我已很久沒有破解軟體,在偶然的機會里看到了一些看學學苑的脫殼教程,
隨即順手找了這個軟體練習一下。沒想到竟碰上一個大難題,足足用了我
一個星期的時間。我先用 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
-全文完-
相關文章
- 脫殼 ----- AATools v4.0.0.596 (全稱:Advanced
Administrative Tools)2000-08-09
- 脫Advanced Email Extractor PRO的殼 (19千字)2001-08-19AI
- Asprotect 1.2x 加殼的 Advanced Direct
Remailer 2.17 脫殼 (3千字)2002-06-20REMAI
- 脫Remote Administrator v2.0的殼 (8千字)2001-06-24REM
- 脫殼----對用pecompact加殼的程式進行手動脫殼
(1千字)2000-07-30
- FTPrint的脫殼(asprotect) (2千字)2001-02-05FTP
- telock脫殼總結 (12千字)2001-09-27
- 先分析,再脫殼(二) (13千字)2003-09-04
- 脫Crunch/PE -> BitArts的殼。 (3千字)2002-05-03
- jdpack的脫殼及破解 (5千字)2002-06-25
- WinKawaks 1.45脫殼筆記
(10千字)2002-08-12筆記
- HTMLZip 1.0 beta 的脫殼 (3千字)2001-02-03HTML
- 一點脫殼經驗。(7千字)2001-04-20
- PicturesToExe3.51的脫殼 (2千字)2001-04-22REST
- The Bat! 1.39脫殼筆記 (1千字)2000-03-12BAT筆記
- ASPROtect 1.22加殼的ahaview2.0脫殼 (5千字)2002-03-24View
- ArtCursors 3.03 ASPR殼軟體脫殼後修整記 (10千字)2015-11-15
- 脫Flashfxp 1.3 build 780的殼 (10千字)2001-08-15UI
- 脫PicturesToExe v3.60的殼 (1千字)2001-09-15REST
- 脫殼----對用Petite2.2加殼的程式進行手動脫殼的一點分析
(5千字)2000-07-27
- 用Armadillo標準加殼的程式的脫殼和引入表修復方案---OLLYDBG (8千字)2015-11-15
- 股市風暴4.0的外殼分析與脫殼方法(一) (7千字)2001-06-10
- aspr脫殼總結(部分適用於其他殼保護) (3千字)2001-09-14
- 手動脫殼的教程(由petite v2.2加殼) (4千字)2001-11-26
- 對PECompact加殼的DLL脫殼的一點分析 (7千字)2000-08-17
- 睡不著,帖一個:aspr程式的脫殼修復體會
(8千字)2015-11-15
- 殼的工作原理脫殼2013-04-10
- 不脫殼破解極光多能鬧鐘
(16千字)2003-04-14
- EZIP1.0脫殼手記 ――娃娃/[CCG] (3千字)2001-11-16
- 對Asprotect脫殼的一點總結
(20千字)2000-08-12
- Lock98主程式脫殼筆記 (1千字)2015-11-15筆記
- Armadillo 2.52加殼原理分析和改進的脫殼方法
(12千字)2015-11-15
- 壹次脫殼法――Armadillo 雙程式標準殼 快速脫殼2015-11-15
- VBExplorer.exe脫殼教程
附脫殼指令碼2015-11-15指令碼
- 用OD對Aspr加殼程式的手動脫殼及修復 (7千字)2015-11-15
- 轉載:Petite 脫殼“標準”解決方法 (1千字)2001-02-06
- ASProtect 1.23
b18脫殼淺談 (5千字)2015-11-15
- ExeStealth 常用脫殼方法 + ExeStealth V2.72主程式脫殼2015-11-15