Obsidium V1.25加壳VB程序的脱壳——超级自动注册申请王 V1.9
            
           
             
下载页面:  http://www2.skycn.com/soft/21992.html
软件大小:  2894 KB
软件语言:  简体中文
软件类别:  国产软件 / 试用版 / 网络辅助
应用平台:  Win9x/NT/2000/XP
加入时间:  2005-04-12 16:54:38
下载次数:  26267
推荐等级:  ***
开 发 商:  http://www.5it.cn
软件介绍: “超级自动注册申请王”是一款能够自动注册QQ号、UC号、YamQQ号、赢财通QQ号、MyIM号、联众游戏大厅、游戏茶苑大厅、E话通号、KuGoo号、PP点点通帐号、浩方游戏平台号、免费相册、诸多免费邮箱、免费二级域名……管理所注册的号码密码……等等等等诸多的功能于一身的强大软件。
             
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教
             
【调试环境】:WinXP、flyODBG、PEiD、LordPE、ImportREC
             
————————————————————————————————— 
【脱壳过程】:
          
         
Obsidium新版一直没看,有兄弟提出这个程序,看看不算难,所以记录了一下。
—————————————————————————————————
一、Obsidium V1.25的反跟踪

             
用OllyDbg修改版来调试,设置OllyDbg忽略所有异常选项。
用IsDebug插件去掉OllyDbg的调试器标志。用UnhExcFlt.DLL插件先Patch一下。
     
0066E000    E8 0E000000     call 0066E013
//进入Ollydbg后暂停在这
0066E005    8B5424 0C       mov edx,dword ptr ss:[esp+C]
0066E009    8382 B8000000 0>add dword ptr ds:[edx+B8],0D
0066E010    33C0            xor eax,eax
0066E012    C3              retn

如果没有使用UnhandledExceptionFilter插件Patch,可以如下修改。
Ctrl+G:UnhandledExceptionFilter

7C862B8A    68 48020000     push 248
7C862B8F    68 E035867C     push kernel32.7C8635E0
7C862B94    E8 32F9F9FF     call kernel32.7C8024CB
7C862B99    A1 CC36887C     mov eax,dword ptr ds:[7C8836CC]
7C862B9E    8945 E4         mov dword ptr ss:[ebp-1C],eax
7C862BA1    8B5D 08         mov ebx,dword ptr ss:[ebp+8]
7C862BA4    899D 88FEFFFF   mov dword ptr ss:[ebp-178],ebx
7C862BAA    C785 B8FEFFFF 0>mov dword ptr ss:[ebp-148],4
7C862BB4    33FF            xor edi,edi
7C862BB6    89BD C4FEFFFF   mov dword ptr ss:[ebp-13C],edi
7C862BBC    89BD 94FEFFFF   mov dword ptr ss:[ebp-16C],edi
7C862BC2    8B03            mov eax,dword ptr ds:[ebx]
7C862BC4    F640 04 10      test byte ptr ds:[eax+4],10
7C862BC8    74 0A           je short kernel32.7C862BD4
7C862BCA    FF30            push dword ptr ds:[eax]
7C862BCC    6A FF           push -1
7C862BCE    FF15 FC13807C   call dword ptr ds:[<&ntdll.NtTerminateProcess>]
7C862BD4    8B03            mov eax,dword ptr ds:[ebx]
7C862BD6    BE 050000C0     mov esi,C0000005
7C862BDB    3930            cmp dword ptr ds:[eax],esi
7C862BDD    75 1A           jnz short kernel32.7C862BF9
7C862BDF    8378 14 01      cmp dword ptr ds:[eax+14],1
7C862BE3    75 14           jnz short kernel32.7C862BF9
7C862BE5    FF70 18         push dword ptr ds:[eax+18]
7C862BE8    E8 87FCFFFF     call kernel32.7C862874
7C862BED    83F8 FF         cmp eax,-1
7C862BF0    75 07           jnz short kernel32.7C862BF9
7C862BF2    0BC0            or eax,eax
7C862BF4    E9 5F080000     jmp kernel32.7C863458
7C862BF9    89BD DCFEFFFF   mov dword ptr ss:[ebp-124],edi
7C862BFF    57              push edi
7C862C00    6A 04           push 4
7C862C02    8D85 DCFEFFFF   lea eax,dword ptr ss:[ebp-124]
7C862C08    50              push eax
7C862C09    6A 07           push 7
7C862C0B    E8 FDB3FAFF     call kernel32.GetCurrentProcess
7C862C10    50              push eax
7C862C11    FF15 AC10807C   call dword ptr ds:[<&ntdll.NtQueryInformationProcess>]
7C862C17    85C0            test eax,eax
7C862C19    0F8C A2000000   jl kernel32.7C862CC1
7C862C1F    39BD DCFEFFFF   cmp dword ptr ss:[ebp-124],edi
//修改为:   mov dword ptr ss:[ebp-124],0
7C862C25    0F84 96000000   je kernel32.7C862CC1
//修改为:   jmp 7C862CC1

Obsidium V1.25专门针对WinXP下三环调试器设置了一个检测。
Ctrl+G:CheckRemoteDebuggerPresent

7C859902    8BFF            mov edi,edi
7C859904    55              push ebp
7C859905    8BEC            mov ebp,esp
7C859907    837D 08 00      cmp dword ptr ss:[ebp+8],0
7C85990B    56              push esi
7C85990C    74 35           je short kernel32.7C859943
7C85990E    8B75 0C         mov esi,dword ptr ss:[ebp+C]
7C859911    85F6            test esi,esi
7C859913    74 2E           je short kernel32.7C859943
7C859915    6A 00           push 0
7C859917    6A 04           push 4
7C859919    8D45 08         lea eax,dword ptr ss:[ebp+8]
7C85991C    50              push eax
7C85991D    6A 07           push 7
7C85991F    FF75 08         push dword ptr ss:[ebp+8]
7C859922    FF15 AC10807C   call dword ptr ds:[<&ntdll.NtQueryInformationProcess>]
7C859928    85C0            test eax,eax
7C85992A    7D 08           jge short kernel32.7C859934
7C85992C    50              push eax
7C85992D    E8 49FAFAFF     call kernel32.7C80937B
7C859932    EB 16           jmp short kernel32.7C85994A
7C859934    33C0            xor eax,eax
7C859936    3945 08         cmp dword ptr ss:[ebp+8],eax
7C859939    0F95C0          setne al
7C85993C    8906            mov dword ptr ds:[esi],eax
7C85993E    33C0            xor eax,eax
7C859940    40              inc eax
//修改为:   nop
7C859941    EB 09           jmp short kernel32.7C85994C
7C859943    6A 57           push 57
7C859945    E8 76F9FAFF     call kernel32.7C8092C0
7C85994A    33C0            xor eax,eax
7C85994C    5E              pop esi
7C85994D    5D              pop ebp
7C85994E    C2 0800         retn 8

OK,现在就可以在OllyDbg修改版里面正常运行起来了。


—————————————————————————————————
二、搞定输入表


超级自动注册申请王是VB写的程序,许多壳对VB保护不佳。Obsidium也没有对这个程序使用上特色重定位功能,因此我们直接去搞定输入表了。
修改完上面几处去除反跟踪后,Ctrl+G:IsProcessorFeaturePresent

7C80ACB2    8BFF            mov edi,edi
7C80ACB4    55              push ebp
7C80ACB5    8BEC            mov ebp,esp
7C80ACB7    8B45 08         mov eax,dword ptr ss:[ebp+8]
7C80ACBA    83F8 40         cmp eax,40
7C80ACBD    73 0B           jnb short kernel32.7C80ACCA
7C80ACBF    0FB680 7402FE7F movzx eax,byte ptr ds:[eax+7FFE0274]
7C80ACC6    5D              pop ebp
7C80ACC7    C2 0400         retn 4
//在函数末尾下断,避开壳的检测。Shift+F9中断后取消断点

在PE Header下面的第2区段设置内存访问断点。Shift+F9中断下来取消断点

00B68155    893E            mov dword ptr ds:[esi],edi
//中断在这里

Ctrl+F在整个段块搜索命令:test word ptr ds:[esi],20
找到在00B67FCE处,下面我们来Patch,以获得正确输入表函数。

00B67FC8    8B75 10         mov esi,dword ptr ss:[ebp+10]
00B67FCB    8B7D 0C         mov edi,dword ptr ss:[ebp+C]
00B67FCE    66:F706 2000    test word ptr ds:[esi],20
//Patch ①:test word ptr ds:[esi],8  ★
00B67FD3    74 46           je short 00B6801B
//Patch ②:jne 00B6801B  ★
00B67FD5    66:F706 0200    test word ptr ds:[esi],2
00B67FDA    75 1F           jnz short 00B67FFB
00B67FDC    66:C706 0400    mov word ptr ds:[esi],4
00B67FE1    8B45 14         mov eax,dword ptr ss:[ebp+14]
00B67FE4    6A 01           push 1
00B67FE6    6A 00           push 0
00B67FE8    FF76 04         push dword ptr ds:[esi+4]
00B67FEB    6A 00           push 0
00B67FED    FF75 18         push dword ptr ss:[ebp+18]
00B67FF0    FF50 50         call dword ptr ds:[eax+50]
00B67FF3    85C0            test eax,eax
00B67FF5    74 38           je short 00B6802F
//Patch ③:je 00B6801B  ★
00B67FF7    8907            mov dword ptr ds:[edi],eax
//正确函数写入   这里可以看看[edi]地址,以确定IAT RVA和Size
//第一次EDI=00401000
00B67FF9    EB 20           jmp short 00B6801B
00B67FFB    66:C706 0400    mov word ptr ds:[esi],4
00B68000    8B45 14         mov eax,dword ptr ss:[ebp+14]
00B68003    0FB756 02       movzx edx,word ptr ds:[esi+2]
00B68007    6A 01           push 1
00B68009    52              push edx
00B6800A    6A 00           push 0
00B6800C    FF76 04         push dword ptr ds:[esi+4]
00B6800F    FF75 18         push dword ptr ss:[ebp+18]
00B68012    FF50 50         call dword ptr ds:[eax+50]
00B68015    85C0            test eax,eax
00B68017    74 16           je short 00B6802F
//Patch ④:je 00B6801B  ★
00B68019    8907            mov dword ptr ds:[edi],eax
00B6801B    83C6 08         add esi,8
00B6801E    83C7 04         add edi,4
00B68021    FF4D 08         dec dword ptr ss:[ebp+8]
00B68024    75 A8           jnz short 00B67FCE
00B68026    33C0            xor eax,eax
00B68028    40              inc eax
00B68029    5F              pop edi
00B6802A    5E              pop esi
00B6802B    5D              pop ebp
00B6802C    C2 1400         retn 14

在00B6802C处下断,Shift+F9后输入表处理完毕
在00401000处向下查看,可以发现结束地址是004012C4
运行ImportREC,选择这个进程,填入RVA=00001000、Size=000002C4,获取输入表后发现有一个无效指针
00404D10    FF25 44114000   jmp dword ptr ds:[401144]

VB的东东一般加密的特殊函数是DllFunctionCall。
当然,也可以跟踪得出。跟踪原版这里会来到如下地方:

006767F7    55              push ebp
//这几条指令其实是把DllFunctionCall函数的挪移到壳里执行
006767F8    8BEC            mov ebp,esp
006767FA    83EC 0C         sub esp,0C
006767FD    56              push esi
006767FE    9C              pushfd
006767FF    F0:FF0D D266670>lock dec dword ptr ds:[6766D2]
00676806    9D              popfd
00676807    E9 14389965     jmp 6600A020; MSVBVM60.6600A020

6600A019    55              push ebp
//DllFunctionCall
6600A01A    8BEC            mov ebp,esp
6600A01C    83EC 0C         sub esp,0C
6600A01F    56              push esi
6600A020    8D45 F4         lea eax,dword ptr ss:[ebp-C]
//从壳里直接跳到这里
6600A023    57              push edi
6600A024    50              push eax
6600A025    8D45 FC         lea eax,dword ptr ss:[ebp-4]
6600A028    8365 FC 00      and dword ptr ss:[ebp-4],0
6600A02C    50              push eax
6600A02D    8D45 F8         lea eax,dword ptr ss:[ebp-8]
6600A030    50              push eax
6600A031    6A 00           push 0
6600A033    FF75 08         push dword ptr ss:[ebp+8]
6600A036    E8 42000000     call 6600A07D 


—————————————————————————————————
三、OEP


Obsidium没有对这个东东重定位,所以直接Alt+M打开内存查看窗口
在PE Header下面的第2区段设置内存访问断点。Shift+F9中断下来

004050AD    E8 EEFFFFFF     call SuperAut.004050A0 ; jmp to MSVBVM60.ThunRTMain
//直接中断在这里。这是OEP处的第2条指令

看看堆栈:
0013FFC0   004054C4  ASCII "VB5!6&vb6chs.dll"

Obsidium的Stolen OEP Code一直不算强。很容易就得到OEP处第一条指令
004050A8    68 C4544000     push SuperAut.004054C4 ; ASCII "VB5!6&vb6chs.dll"
004050AD    E8 EEFFFFFF     call SuperAut.004050A0 ; jmp to MSVBVM60.ThunRTMain

运行LordPE,完全Dump这个进程。
修正ImportREC里面的OEP RVA=000050A8,FixDump,脱壳完成了。


—————————————————————————————————
四、关于破解


这个东东的注册信息保存在注册表中,重启验证。
去掉时间限制很简单,BP rtcMsgBox,改几个跳转就行了。

             
—————————————————————————————————                                
         ,     _/ 
        /| _.-~/            \_     ,        青春都一晌
       ( /~   /              \~-._ |\
       `\\  _/                \   ~\ )          忍把浮名 
   _-~~~-.)  )__/;;,.          \_  //'
  /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        换了破解轻狂
 `~ _( ,_..--\ (     ,;'' /    ~--   /._`\ 
  /~~//'   /' `~\         ) /--.._, )_  `~
  "  `~"  "      `"      /~'`\    `\\~~\   
                         "     "   "~'  ""
    
              UnPacKed By :  fly
               2005-04-29 23:00