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 |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏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.