早上到论坛发现cxlrb兄发布了一个伪装壳,下来测试下效果 加了DEL的测试不成功 加VC 6.0测试OK 既然可以加壳成功 那我们来分析一下为什么有些失败呢 我们先来分析下这个伪装壳是如何实现的
Hide PE v1.1 Cracked by Flashback
该伪装壳有有两个选项 我们先来选Asp来实现伪装(试验品为VC写的一程序)
代码:
伪装后代码如下: 00433B45 >/$ 68 01404900 PUSH HideWiza.00494001 ; (Initial CPU selection) 00433B4A |. E8 01000000 CALL HideWiza.00433B50 ; F7 00433B4F \. C3 RETN ; 这里就可以返回 00433B50 $ C3 RETN 返回到这里: 00494001 BA 453B4300 MOV EDX,HideWiza.<模块入口点> ; 将OEP送EDX 准备SMC 00494006 B8 558BEC6A MOV EAX,6AEC8B55 0049400B 8902 MOV DWORD PTR DS:[EDX],EAX 0049400D 83C2 04 ADD EDX,4 00494010 B8 FF6818EE MOV EAX,EE1868FF 00494015 8902 MOV DWORD PTR DS:[EDX],EAX 00494017 83C2 04 ADD EDX,4 0049401A B8 45006880 MOV EAX,80680045 0049401F 8902 MOV DWORD PTR DS:[EDX],EAX 00494021 83C2 F8 ADD EDX,-8 00494024 - FFE2 JMP EDX ; OEP
我们再仔细分析下程序是如何对OEP的修改 仔细观察地址 就会发现其实是做了一个SMC而已
代码:
00433B45 >/$ 55 PUSH EBP ; OEP 00433B46 |? 8BEC MOV EBP,ESP 00433B48 |? 6A FF PUSH -1 00433B4A |. 68 18EE4500 PUSH HideWiza.0045EE18 00433B4F \. 68 808F4300 PUSH HideWiza.00438F80 对照上文中的SMC代码 00433B45 >55 8B EC 6A FF 68 18 EE 45 00 68 80 Ujh.h.
那程序是再哪里添加了ASP的特征码呢?我们查看一下fly大哥制作的PEsign
[ASProtect V2.X Registered -> Alexey Solodovnikov * Sign.By.fly]
signature = 68 01 ?? ?? ?? E8 01 00 00 00 C3 C3
ep_only = true
而这个代码 正是程序被修改后的OEP入口点的代码:
代码:
00433B45 >/$ 68 01404900 PUSH HideWiza.00494001 ; (Initial CPU selection) 00433B4A |. E8 01000000 CALL HideWiza.00433B50 ; F7 00433B4F \. C3 RETN ; 这里就可以返回 00433B50 $ C3 RETN 正好和ASP的特征码吻合:68 01 40 49 00 E8 01 00 00 00 C3 C3
我们再来验证看一下 看一下Del加伪装壳无法运行的问题所在:
代码:
以MP3音频录音机为例: 004E6D58 > $ 68 01305C00 PUSH MP3_Audi.005C3001 004E6D5D E8 DB E8 004E6D5E 01 DB 01 004E6D5F 00 DB 00 004E6D60 . 0000C3C3 DD C3C30000 我们按照上方我们分析作者伪装ASP的意图来格式化代码: 004E6D58 > $ 68 01305C00 PUSH MP3_Audi.005C3001 004E6D5D E8 01000000 CALL MP3_Audi.004E6D63 ; 问题在这里 004E6D62 C3 RETN 004E6D63 C3 RETN 返回到来到这里: 005C3001 1000 ADC BYTE PTR DS:[EAX],AL 005C3003 0000 ADD BYTE PTR DS:[EAX],AL 005C3005 0202 ADD AL,BYTE PTR DS:[EDX] 005C3007 0030 ADD BYTE PTR DS:[EAX],DH 005C3009 8210 BF ADC BYTE PTR DS:[EAX],-41 005C300C 06 PUSH ES 005C300D 092A OR DWORD PTR DS:[EDX],EBP 005C300F 8648 86 XCHG BYTE PTR DS:[EAX-7A],CL 005C3012 F7 ??? ; 未知命令 005C3013 0D 010702A0 OR EAX,A0020701 005C3018 8210 B0 ADC BYTE PTR DS:[EAX],-50 005C301B 3082 10AC0201 XOR BYTE PTR DS:[EDX+102AC10],AL 005C3021 0131 ADD DWORD PTR DS:[ECX],ESI 005C3023 0B30 OR ESI,DWORD PTR DS:[EAX] 005C3025 0906 OR DWORD PTR DS:[ESI],EAX 005C3027 05 2B0E0302 ADD EAX,2030E2B
先COPY原程序OEP的代码:004E6D58 >55 8B EC 83 C4 F0 53 B8 50 67 4E 00 UgN.瑁
然后找到一个以地址低位为01的空白区段地址
004E6F01 00 DB 00
代码:
OEP修改如下: 004E6D58 > 68 016F4E00 PUSH MP3Recor.004E6F01 004E6D5D E8 01000000 CALL MP3Recor.004E6D63 004E6D62 C3 RETN 004E6D63 C3 RETN 然后我们写SMC数据: 004E6F01 BA 586D4E00 MOV EDX,MP3Recor.<模块入口点> 004E6F06 B8 558BEC83 MOV EAX,83EC8B55 004E6F0B 8902 MOV DWORD PTR DS:[EDX],EAX 004E6F0D 83C2 04 ADD EDX,4 004E6F10 B8 C4F053B8 MOV EAX,B853F0C4 004E6F15 8902 MOV DWORD PTR DS:[EDX],EAX 004E6F17 83C2 04 ADD EDX,4 004E6F1A B8 50674E00 MOV EAX,MP3Recor.004E6750 004E6F1F 8902 MOV DWORD PTR DS:[EDX],EAX 004E6F21 83C2 F8 ADD EDX,-8 004E6F24 FFE2 JMP EDX

OK 这下跑起来了 PEiD测壳:ASProtect V2.X Registered -> Alexey Solodovnikov * Sign.By.fly [Overlay] *
只是对程序被伪装后为何有些成功有些失败感兴趣而已 无他 Only Game ~~