【破解作者】 青锋剑客[FCG][DFCG]
【使用工具】 FileInfo,softice,od 1.10d,LoadPE,ImportREC,winHex
【破解平台】 WinXP+sp1
【软件名称】 XX网站管理系统2005版sp2正式版,2005年8月16日更新,最新版(因为国产软件,隐去软件名)
【软件简介】 现在很多网站在用的,功能强大的网站管理系统。


【软件大小】 315K
【加壳方式】 upx+ASPack
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】
1、近期破解这个软件,用od检查为ASPack,再查为UPX,最后为VB6编写。我最怕VB写的程序了。参考fly写的两篇大作《用Ollydbg手脱UPX加壳的DLL 》和《用Ollydbg手脱ASPack加壳的DLL 》,结果是DLL_Loader.exe加载成功,可在实际运用时总提示没有安装组件。此次失败说明作文件补丁是没戏了。如果大家有什么办法,请告知我。用softice设断点跟踪,好象注册码要4096字符,晕,看来做注册机更没戏。郁闷中想到了SMC。
2、先搞定最外层的ASPack壳,大家知道,ASPack的出口类似以下代码:
   111B53AF     61                   popad
   111B53B0     75 08                jnz short PE_Soft.111B53BA
   111B53B2     B8 01000000          mov eax,1
   111B53B7     C2 0C00              retn 0C
   111B53BA     68 50191B11          push PE_Soft.111B1950
   111B53BF     C3                   retn
   而617508B801000000是可以在磁盘文件中找到的,为此我们就可以拿到控制权,放置调用指令或跳转指令。因是ASP组件,为DLL动态链接库,在利用中要用到重定位。所以在这里我用的是调用指令完成跳转。找一块空地,我找的是4EC50的地方。具体代码如下:
   111B53AF     E8 9C0E0000          call PE_Soft.111B6250
   111B53B4     90                   nop
   111B53B5     90                   nop
   111B53B6     90                   nop

   111B6250     5D                   pop ebp                              重定位,执行后ebp为111B53B4
   111B6251     C745 FB 617508B8     mov dword ptr ss:[ebp-5],B8087561    恢复ASPack出口处代码,以便下次执行时不执行我们所加的代码。只在第一次加载DLL时我们的代码才执行。
   111B6258     C745 FF 01000000     mov dword ptr ss:[ebp-1],1
   111B625F     E8 00000000          call PE_Soft.111B6264                重定位
   111B6264     5A                   pop edx                              执行完后EDX为111B6264
   111B6265     8BC5                 mov eax,ebp
   111B6267     83C0 06              add eax,6
   111B626A     8942 3B              mov dword ptr ds:[edx+3B],eax        为能跳回去做准备,3B与我们加的代码长度有关
   111B626D     8B58 01              mov ebx,dword ptr ds:[eax+1]         内层UPX壳的入口地址
   111B6270     8A03                 mov al,byte ptr ds:[ebx]             搜索UPX的特征码
   111B6272     3C 86                cmp al,86
   111B6274     74 03                je short PE_Soft.111B6279
   111B6276     43                   inc ebx
   111B6277   ^ EB F7                jmp short PE_Soft.111B6270
   111B6279     8B43 01              mov eax,dword ptr ds:[ebx+1]
   111B627C     3D C4C1C010          cmp eax,10C0C1C4
   111B6281   ^ 75 F3                jnz short PE_Soft.111B6276
   111B6283     66:C743 1A EB04      mov word ptr ds:[ebx+1A],4EB         找到后补丁,完成跳转,得到第二层壳的控制权
   111B6289     33C9                 xor ecx,ecx                          把第二层壳的代码传送过去
   111B628B     66:B9 7F00           mov cx,7F
   111B628F     83C2 40              add edx,40
   111B6292     83C3 20              add ebx,20
   111B6295     8A02                 mov al,byte ptr ds:[edx]
   111B6297     8803                 mov byte ptr ds:[ebx],al
   111B6299     42                   inc edx
   111B629A     43                   inc ebx
   111B629B   ^ E2 F8                loopd short PE_Soft.111B6295
   111B629D     61                   popad                                恢复ASPack出口处的代码
   111B629E     68 78563412          push 12345678                        返回
   111B62A3     C3                   retn
   111B62A4     E8 00000000          call PE_Soft.111B62A9                从这往下被传到内层壳空地
   111B62A9     5D                   pop ebp                              UPX壳空地是有的
   111B62AA     66:3E:C745 F5 61E9   mov word ptr ds:[ebp-B],0E961        正常类似:
   111B62B1     3E:8D5D F6           lea ebx,dword ptr ds:[ebp-A]         popad
   111B62B5     3E:035D F7           add ebx,dword ptr ds:[ebp-9]         jmp XXXXXXXX
   111B62B9     83C3 05              add ebx,5                            接下来就是空地了,我们利用之
   111B62BC     3E:895D 53           mov dword ptr ds:[ebp+53],ebx     
   111B62C0     8D93 D4E00A00        lea edx,dword ptr ds:[ebx+AE0D4]   
   111B62C6     C602 E9              mov byte ptr ds:[edx],0E9
   111B62C9     C642 01 34           mov byte ptr ds:[edx+1],34
   111B62CD     C642 02 0A           mov byte ptr ds:[edx+2],0A
   111B62D1     C642 03 00           mov byte ptr ds:[edx+3],0
   111B62D5     C642 04 00           mov byte ptr ds:[edx+4],0
   111B62D9     C642 05 90           mov byte ptr ds:[edx+5],90
   111B62DD     8D93 346F0D00        lea edx,dword ptr ds:[ebx+D6F34]
   111B62E3     C602 E9              mov byte ptr ds:[edx],0E9
   111B62E6     C642 01 34           mov byte ptr ds:[edx+1],34
   111B62EA     C642 02 0A           mov byte ptr ds:[edx+2],0A
   111B62EE     C642 03 00           mov byte ptr ds:[edx+3],0
   111B62F2     C642 04 00           mov byte ptr ds:[edx+4],0
   111B62F6     C642 05 90           mov byte ptr ds:[edx+5],90
   111B62FA     61                   popad
   111B62FB     68 78563412          push 12345678                        
   111B6300     C3                   retn



3、搞定最内层壳。其实内层和外层差不多。以下代码是从上面传过来的。
   111B1AF4    /EB 04                jmp short PE_Soft.111B1AFA
   111B1AF6    |8617                 xchg byte ptr ds:[edi],dl         这4个字节很关键,是要跳到的地方
   111B1AF8    |E5 FF                in eax,0FF
   111B1AFA    \E8 00000000          call PE_Soft.111B1AFF        从这开始。重定位
   111B1AFF     5D                   pop ebp
   111B1B00     66:3E:C745 F5 61E9   mov word ptr ds:[ebp-B],0E961     恢复UPX出口处代码,以便下次执行时不执行我们所加的代码。只在第一次加载DLL时我们的代码才执行。
   111B1B07     3E:8D5D F6           lea ebx,dword ptr ds:[ebp-A]      根据那4个字节计算程序的OEP入口
   111B1B0B     3E:035D F7           add ebx,dword ptr ds:[ebp-9]
   111B1B0F     83C3 05              add ebx,5                         
   111B1B12     3E:895D 53           mov dword ptr ds:[ebp+53],ebx     为能跳到程序的OEP入口做准备
   111B1B16     8D93 D4E00A00        lea edx,dword ptr ds:[ebx+AE0D4]  具体内存补丁代码
   111B1B1C     C602 E9              mov byte ptr ds:[edx],0E9
   111B1B1F     C642 01 34           mov byte ptr ds:[edx+1],34
   111B1B23     C642 02 0A           mov byte ptr ds:[edx+2],0A
   111B1B27     C642 03 00           mov byte ptr ds:[edx+3],0
   111B1B2B     C642 04 00           mov byte ptr ds:[edx+4],0
   111B1B2F     C642 05 90           mov byte ptr ds:[edx+5],90
   111B1B33     8D93 346F0D00        lea edx,dword ptr ds:[ebx+D6F34]
   111B1B39     C602 E9              mov byte ptr ds:[edx],0E9
   111B1B3C     C642 01 34           mov byte ptr ds:[edx+1],34
   111B1B40     C642 02 0A           mov byte ptr ds:[edx+2],0A
   111B1B44     C642 03 00           mov byte ptr ds:[edx+3],0
   111B1B48     C642 04 00           mov byte ptr ds:[edx+4],0
   111B1B4C     C642 05 90           mov byte ptr ds:[edx+5],90
   111B1B50     61                   popad
   111B1B51     68 78563412          push 12345678                  返回到程序的OEP入口
   111B1B56     C3                   retn

【破解心得】:
1、要成功SMC,如果是DLL,必须要用重定位。
2、在什么地方放置我们的代码,在POPAD以前最好,这样无论怎么做,都不会破坏寄存器。
3、做到只在第一次加载DLL时才做补丁。这就要求我们要考虑适当恢复我们破坏的内存区。

【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!


第一次做SMC的东西,写的词不达意,请大家多多包涵。感谢你给看完此文。

青锋剑客2005年9月作于马里首都巴马科。