一. 前言: 用SMC去破解ASProtect的保護實在是一種痛苦的事,不過既然有人有興趣,那我們就來談談吧!在底下的文章,我將假設讀者已對ASProtect的保護有初步的了解,也跟蹤過它,對SMC的技巧有概念,最後先申明一點,因為ASProtect的多層次壓縮,所以你要用SMC的話,一定會很繁雜的,希望你有耐心看完並實作,也希望本文能對你有所幫助。
二. 使用工具: (1)Soft-ICE V.4.01 (2)FrogICE
(3)16進位編輯器(建議使用Hex workshop和Hiew(方便除錯))
三. 本文:
1. ASProtect的保護機制:
(1) 動態位址: 我們要用SMC首先要克服的就是ASProtect的Relocation,它每次運行
的位址都不一樣,而我們的Code是不會變動的,故你必須先了解ASProtect是如何Relocation的,答案是ASProtect調用GetTickCount函數,拿其值去當IMAGE_RELOCATION結構中的RelocCount成員,讀者有興趣可以去查閱IMAGE_RELOCATION結構的相關資訊及編程,在此不加詳述。其程式碼如下:
EAX=GetTickCount
25FFFF0100 AND EAX,0001FFFF
EB04 JMP 0051722F
我們改為:
B811110100 MOV EAX,00011111
EB04 JMP 0051722F
如此RelocCount就會是一個常數,用Hex workshop 打開Awave.exe尋找
25FFFF0100EB04 <-- 將是唯一
改B811110100EB04
如此位址就會固定,不再是變動的了。
(2)多層次壓縮:
A..ASProtect的程式碼 <--我們稱為第一層,這是可以用16進位編輯器直接修改的
地方
B. 解壓部份代碼 <-- 第二層
C. 解壓部份代碼 <-- 第三層
D. 利用第三層代碼解壓第四層代碼 <-- 第四層亦就是ASProtect,Anti-Debugger,
CRC Check,Time Limit,NagScreen等….的地方
E. 利用第四層代碼解壓主程式代碼,Import Table加密等 <-- 第五層
如此層層相扣,不要說它在Import Table作手腳,如此多層次的壓縮,你要用內存補丁(指在有Soft-ICE的環境下)
機乎很難工作。
(3)首先我們要對付的是ASProtect的保護:
這個軟體有3種,Anti-Debugger,BoundsCheck,CRC Check
[Anti-Debugger]:
:005D6184 CALL 005D60D4 <--\\.\SIWDEBUG
:005D6189 TEST AL,AL
:005D618B(753A) JNZ 005D61C7 <-- NOP
:005D618D CALL KERNEL32!GetLastError
:005D6192 CMP EAX,02
:005D6195(7530) JNZ 005D81C7 <-- NOP
:005D6197 MOV EAX,[005DC878]
:005D619C CALL 005D60D4
<-- \\.\SICE
:005D61A1 TEST AL,AL
:005D61A3(7522) JNZ 005D61C7 <-- NOP
:005D61A5 CALL KERNEL32!GetLastError
:005D61AA CMP EAX,02
:005D61AD(7518) JNZ 005D61C7 <-- NOP
:005D61AF MOV EAX,[005DC874]
:005D61B4 CALL 005D60D4 <--
\\.\NTICE
:005D61B9 TEST AL,AL
:005D61BB(750A) JNZ 005D61C7 <-- NOP
:005D61BD CALL KERNEL32!GetLastError
:005D61C2 CMP EAX,02
:005D61C5(7413) JZ 005D61DA <-- JMP
[BoundsCheck]:
:005D6234 MOV EBP,4243484B
:005D6239 JMP 005D623D
:005D623D MOV AX,0004
:005D6241 JMP 005D6244
:005D6244 INT 3
我們只要改EBP的值,就能ByPass BoundsCheck
改:005D6235 4B --> 12
[CRC Check]:
:005D633E MOV EAX,[EBP-14]
:005D6341 CMP EAX,[EBP-10]
:005D6344 JZ 005D6389
改:005D6344 7443 --> EB43
以上就是ASProtect保護的代碼,若你要一個一個的改,可能要改很多Bytes,既然它最
終是要跳至005D6389我們何不來個乾坤大挪移讓它一次跳的夠
改:005D618B E9F9010000 JMP 005D6389
[改主程式的地方]:
找接近OEP的地方來Modify主程式(此時主程式的代碼已被解壓)我找到這個:
:005D607D 8B45F8 MOV EAX,[EBP-08]
:005D6080 EB02 JMP 005D6084
剛好5個BYTES正好符合我們做遠程跳躍
(4) SMC開始:
終於到了最重要亦是最痛苦的時刻了,希望大家能堅持下去,首先我們還須做個工作,就是找個地方(要夠大)來放我們的Code,我們找ASProtect主程式的Section
Section VS
VA RS RO
----------------------------------------------------
Y38d5x 29000 157000
28800 5FE00
我找到 OffSet : 60B00
載入時位址:00557D00
這地方有大量已初值化的00 00供我們使用,Thanks ASProtect!
(A)利用第四層Modify主程式:
主程式的破解改法,我們採用Superboss的改法,維持文章的一貫性
改:004A486D 40 --> 33
還記得先前我們找到的修改主程式的地方吧!
:005D607D 8B45F8 MOV EAX,[EBP-08]
:005D6080 EB02 JMP 005D6084
改:005D607D E97E1CF8FF jmp 00557D00 <-- 跳至我們的家
按F10來到00557D00,下a eip
:00557D00 8B45F8 MOV EAX,[EBP-08] <-- 還原代碼
:00557D03 C6056D484A0033 MOV Byte Ptr [004A486D],33
:00557D0A E975E30700 JMP 005D6084 <-- 跳至原代碼
要到這裏你須先BypassASProtect的保護才行`,測試無誤後,記得抄下機器碼用16進位編輯器去改
(B)利用第三層Modify第四層:
我們用Symbole Loader來載入Awave.exe,別忘了裝載ICEdump或改Section的
Charactics, 否則無法中斷的,還記得先前所說的Anti-Debugger嗎? 我們要Modify它,位址是005D618B 下bpm 005D618B,按F5一次,中斷在:
:005E555B F3A5 REPZ MOVSD
:005E555D 8BC8 MOV ECX,EAX
:005E555F 83E103 AND ECX,03
:005E5562 F3A4 REPZ MOVSB
:005E5564 5E POP ESI
:005E5565 8B8539294400 MOV EAX,[EBP+00442939]
:005E556B 6800800000 PUSH 00008000
:005E5570 6A00
PUSH 00
:005E5572 50
PUSH EAX
走過005E5562,你會發現第四層的代碼已被解壓
改:005E556B 6800800000 PUSH 00008000
為:005E556B E99F27F7FF jmp 00557D0F
:00557D0F 6800800000 push 00008000
:00557D14 C7058B615D00E9F90100 mov dword ptr [005D618B],0001F9E9
:00557D1E C6058F615D0000 mov byte ptr [005D618F],00
:00557D25 C7057D605D00E97E1CF8 mov dword ptr [005D607D],F81C7EE9
:00557D2F C60581605D00FF mov byte ptr [005D6081],FF
:00557D36 E935D80800 jmp 005E5570
恭喜! 又完成了一層,若你尚不了解,建議你畫個流程圖,仔細思考它們的邏輯關係那會幫你了解,OK讓我們繼續吧
( C )利用第二層Modify第三層:
目標: 使:005E556B 6800800000 push 00008000
變成:005E556B E99F27F7FF
jmp 00557D0F
bpm 005E556B,按F5二次,中斷在:
:005E527F F3A4 REPZ MOVSB
:005E5281 8B8539294400 MOV EAX,[EBP+00442939]
:005E5287 6800800000 PUSH 00008000
<-- 我們要Modify的地方
:005E528C 6A00 PUSH 00
原本應該是要JMP至00557D3B,不過我想留些Buffer以防萬一,所以我們JMP至00557D6C
改:005E5287 6800800000 PUSH 00008000
為:005E5287 E9E02AF7FF JMP 00557D6C
:00557D6C 6800800000 push 00008000
:00557D71 C7056B555E00E99F27F7 mov
dword ptr [005E556B],F7279FE9
:00557D7B C6056F555E00FF mov byte ptr [005E556F],FF
:00557D82 E905D50800 jmp 005E528C
(D) 利用第一層Modify第二層:
終於到最後了,不知你有什麼感覺,是不是覺得ASProtect很機車呢?
目標: 使:005E5287 6800800000 push 00008000
變成:005E5287 E9E02AF7FF jmp 00557D6C
bpm 005E5287 按F5一次,中斷在:
:00557698 F3A5 REPZ MOVSD
:0055769A 83C328 ADD EBX,28
:0055769D EBDA JMP 00557679
走過00557698第二層的代碼就會被解壓,但是這一段代碼會走很多次,沒關係我們
有EDI的值當我們的指標,此時EDI=005E5B94
改:0055769A 83C328 ADD EBX,28
:0055769D EBDA JMP 00557679
為:0055769A E9E8060000 JMP 00557D87 ß 這可以直接用Hex workshop來改
:00557D87 83C328 add ebx,28
:00557D8A 81FF945B5E00 cmp edi,005E5B94
:00557D90 0F85E3F8FFFF jnz 00557679
:00557D96 C70587525E00E9E02AF7 mov dword ptr [005E5287],F72AE0E9
:00557DA0 C6058B525E00FF mov byte ptr [005E528B],FF
:00557DA7 E9CDF8FFFF jmp 00557679
四. 后記:很久沒有寫文章了,寫的很雜請原諒,明年可能會到上海發展不
曉得你們歡迎否,噫!台灣真的越來越難混了.
慾海浮沈名利爭
電光石火步此生
紅塵情事揮不盡
觀世不笑是痴人
JOHNSON from Taiwan 2000\12\8
- 标 题:Awave Studio v7.0的破解之SMC--- C-pen
- 作 者:1212
- 时 间:2000-12-8 14:42:19
- 链 接:http://bbs.pediy.com