找回密码
 注册
搜索
热搜: 回贴

Awave Studio v7.0的破解之SMC---C-pen,Awave,补丁技术

2010-1-30 18:28| 发布者: admin| 查看: 134| 评论: 0|原作者: 玄霄


Awave Studio v7.0的破解之SMC---C-pen,Awave,补丁技术
2008年06月23日 星期一 下午 09:26
一. 前言: 用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


最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 15:22 , Processed in 0.192965 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部