【破解作者】 青锋剑客[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月作于马里首都巴马科。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课