• 标 题:ASProtect V2.0 脱壳——Registry Clean Expert V3.52 UnPacked + 去除自检验
  • 作 者:fly
  • 时 间:004-09-01,04:44
  • 链 接:http://bbs.pediy.com

    
下载页面:  http://www.skycn.com/soft/13222.html
软件大小:  782 KB
软件语言:  英文
软件类别:  国外软件 / 共享版 / 卸载清除
应用平台:  Win9x/NT/2000/XP
加入时间:  2004-08-28 10:18:07
下载次数:  22173
推荐等级:  ***
开 发 商:  http://www.registry-clean.net/
软件介绍:  系统注册表清理工具,可以扫描注册表,找到并修复/删除那些错误或无用的数据,还可以备份/恢复注册表。
             
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
             
【调试环境】:WinXP、Ollydbg V1.10、PEiD、LordPE、ImportREC
             
————————————————————————————————— 
【脱壳过程】:
          
       
又发现一个ASProtect V2.0加壳的程序,所以又捏了个保护没做好的软柿子。
这个东东脱壳后有自校验。脱壳时处理了一下Pre-Dip,使其显示注册名。
————————————————————————————————— 
一、壳代码解压
             
             
首先设置Ollydbg忽略所有的异常选项。
老规矩:用IsDebug V1.4插件去掉Ollydbg的调试器标志。
           
00401000     68 01F04E00         push RegClean.004EF001
//进入OD后暂停在这
00401005     E8 01000000         call RegClean.0040100B
0040100A     C3                  retn
           
下断:HE GetModuleHandleA
Shift+F9,中断2次后,就可以取消断点,Alt+F9返回00A4A4AC。
Ctrl+F9 执行到返回。
           
00A4A4A6     FF95 EC314400       call dword ptr ss:[ebp+4431EC]
00A4A4AC     85C0                test eax,eax ; kernel32.77E40000
//返回这里
00A4A4AE     75 07               jnz short 00A4A4B7
00A4A4B0     53                  push ebx
00A4A4B1     FF95 F0314400       call dword ptr ss:[ebp+4431F0]
00A4A4B7     8985 4D294400       mov dword ptr ss:[ebp+44294D],eax
00A4A4BD     C785 51294400 00000>mov dword ptr ss:[ebp+442951],0
00A4A4C7     8B95 D8304400       mov edx,dword ptr ss:[ebp+4430D8]
00A4A4CD     8B06                mov eax,dword ptr ds:[esi]
00A4A4CF     85C0                test eax,eax
00A4A4D1     75 03               jnz short 00A4A4D6
00A4A4D3     8B46 10             mov eax,dword ptr ds:[esi+10]
00A4A4D6     03C2                add eax,edx
00A4A4D8     0385 51294400       add eax,dword ptr ss:[ebp+442951]
00A4A4DE     8B18                mov ebx,dword ptr ds:[eax]
00A4A4E0     8B7E 10             mov edi,dword ptr ds:[esi+10]
00A4A4E3     03FA                add edi,edx
00A4A4E5     03BD 51294400       add edi,dword ptr ss:[ebp+442951]
00A4A4EB     85DB                test ebx,ebx
00A4A4ED     0F84 A2000000       je 00A4A595
00A4A4F3     F7C3 00000080       test ebx,80000000
00A4A4F9     75 04               jnz short 00A4A4FF
00A4A4FB     03DA                add ebx,edx
00A4A4FD     43                  inc ebx
00A4A4FE     43                  inc ebx
00A4A4FF     53                  push ebx
00A4A500     81E3 FFFFFF7F       and ebx,7FFFFFFF
00A4A506     53                  push ebx
00A4A507     FFB5 4D294400       push dword ptr ss:[ebp+44294D]
00A4A50D     FF95 E8314400       call dword ptr ss:[ebp+4431E8]
00A4A513     85C0                test eax,eax
00A4A515     5B                  pop ebx
00A4A516     75 6F               jnz short 00A4A587
00A4A518     F7C3 00000080       test ebx,80000000
00A4A51E     75 19               jnz short 00A4A539
00A4A520     57                  push edi
00A4A521     8B46 0C             mov eax,dword ptr ds:[esi+C]
00A4A524     0385 D8304400       add eax,dword ptr ss:[ebp+4430D8]
00A4A52A     50                  push eax
00A4A52B     53                  push ebx
00A4A52C     8D85 53314400       lea eax,dword ptr ss:[ebp+443153]
00A4A532     50                  push eax
00A4A533     57                  push edi
00A4A534     E9 99000000         jmp 00A4A5D2
00A4A539     81E3 FFFFFF7F       and ebx,7FFFFFFF
00A4A53F     8B85 DC304400       mov eax,dword ptr ss:[ebp+4430DC]
00A4A545     3985 4D294400       cmp dword ptr ss:[ebp+44294D],eax
00A4A54B     75 24               jnz short 00A4A571
00A4A54D     57                  push edi
00A4A54E     8BD3                mov edx,ebx
00A4A550     4A                  dec edx
00A4A551     C1E2 02             shl edx,2
00A4A554     8B9D 4D294400       mov ebx,dword ptr ss:[ebp+44294D]
00A4A55A     8B7B 3C             mov edi,dword ptr ds:[ebx+3C]
00A4A55D     8B7C3B 78           mov edi,dword ptr ds:[ebx+edi+78]
00A4A561     035C3B 1C           add ebx,dword ptr ds:[ebx+edi+1C]
00A4A565     8B0413              mov eax,dword ptr ds:[ebx+edx]
00A4A568     0385 4D294400       add eax,dword ptr ss:[ebp+44294D]
00A4A56E     5F                  pop edi
00A4A56F     EB 16               jmp short 00A4A587
00A4A571     57                  push edi
00A4A572     8B46 0C             mov eax,dword ptr ds:[esi+C]
00A4A575     0385 D8304400       add eax,dword ptr ss:[ebp+4430D8]
00A4A57B     50                  push eax
00A4A57C     53                  push ebx
00A4A57D     8D85 A4314400       lea eax,dword ptr ss:[ebp+4431A4]
00A4A583     50                  push eax
00A4A584     57                  push edi
00A4A585     EB 4B               jmp short 00A4A5D2
00A4A587     8907                mov dword ptr ds:[edi],eax
00A4A589     8385 51294400 04    add dword ptr ss:[ebp+442951],4
00A4A590     E9 32FFFFFF         jmp 00A4A4C7
00A4A595     8906                mov dword ptr ds:[esi],eax
00A4A597     8946 0C             mov dword ptr ds:[esi+C],eax
00A4A59A     8946 10             mov dword ptr ds:[esi+10],eax
00A4A59D     83C6 14             add esi,14
00A4A5A0     8B95 D8304400       mov edx,dword ptr ss:[ebp+4430D8]
00A4A5A6     E9 EBFEFFFF         jmp 00A4A496
00A4A5AB     8B85 652A4400       mov eax,dword ptr ss:[ebp+442A65]
00A4A5B1     50                  push eax
00A4A5B2     0385 D8304400       add eax,dword ptr ss:[ebp+4430D8]
00A4A5B8     5B                  pop ebx
00A4A5B9     0BDB                or ebx,ebx
00A4A5BB     8985 112F4400       mov dword ptr ss:[ebp+442F11],eax
00A4A5C1     61                  popad
00A4A5C2     75 08               jnz short 00A4A5CC
00A4A5C4     B8 01000000         mov eax,1
00A4A5C9     C2 0C00             retn 0C
00A4A5CC     68 7828A400         push 0A42878
00A4A5D1     C3                  retn
//执行到返回至这里
           
           
—————————————————————————————————
二、避开IAT加密
           
           
现在壳代码已经解压完毕了。
Ctrl+S 搜索命令序列:
mov edx,dword ptr ss:[ebp+C]
mov edx,dword ptr ds:[edx]
mov dword ptr ds:[edx],eax
           
共找到4处,全部下断。
           
00A358CF     8B55 0C             mov edx,dword ptr ss:[ebp+C]
00A358D2     8B12                mov edx,dword ptr ds:[edx]
00A358D4     8902                mov dword ptr ds:[edx],eax
//①、需要修改
           
00A3593F     8B55 0C             mov edx,dword ptr ss:[ebp+C]
00A35942     8B12                mov edx,dword ptr ds:[edx]
00A35944     8902                mov dword ptr ds:[edx],eax
//②、不需要修改
           
00A35953     8B55 0C             mov edx,dword ptr ss:[ebp+C]
00A35956     8B12                mov edx,dword ptr ds:[edx]
00A35958     8902                mov dword ptr ds:[edx],eax
//③、不需要修改
           
00A35961     8B55 0C             mov edx,dword ptr ss:[ebp+C]
00A35964     8B12                mov edx,dword ptr ds:[edx]
00A35966     8902                mov dword ptr ds:[edx],eax
//④、GetProcAddress函数加密
                      
————————————————————————
1、第一个IAT处理:044858CF
Shift+F9,中断在044858CF处
           
00A358CA     E8 FDF8FFFF         call 00A351CC
00A358CF     8B55 0C             mov edx,dword ptr ss:[ebp+C]
00A358D2     8B12                mov edx,dword ptr ds:[edx]
00A358D4     8902                mov dword ptr ds:[edx],eax
//修改为:mov dword ptr ds:[edx],ebx   ★
//寄存器EBX中保存的就是正确的函数!
00A358D6     E9 90000000         jmp 00A3596B
           
00A359E7     8B75 FC             mov esi,dword ptr ss:[ebp-4]
00A359EA     AD                  lods dword ptr ds:[esi]
00A359EB     09C0                or eax,eax
00A359ED     74 4A               je short 00A35A39
//输入表处理完毕则跳转   ★
00A359EF     89C7                mov edi,eax
00A359F1     037D F8             add edi,dword ptr ss:[ebp-8]
00A359F4     897D F4             mov dword ptr ss:[ebp-C],edi
00A359F7     89F3                mov ebx,esi
00A359F9     31C9                xor ecx,ecx
00A359FB     49                  dec ecx
00A359FC     87FE                xchg esi,edi
00A359FE     30C0                xor al,al
00A35A00     F2:AE               repne scas byte ptr es:[edi]
00A35A02     87FE                xchg esi,edi
00A35A04     AC                  lods byte ptr ds:[esi]
00A35A05     80F8 00             cmp al,0
00A35A08     74 E0               je short 00A359EA
00A35A0A     80F8 01             cmp al,1
00A35A0D     75 06               jnz short 00A35A15
00A35A0F     8345 F4 04          add dword ptr ss:[ebp-C],4
00A35A13     EB EF               jmp short 00A35A04
00A35A15     53                  push ebx
00A35A16     56                  push esi
00A35A17     53                  push ebx
00A35A18     8D5D F4             lea ebx,dword ptr ss:[ebp-C]
00A35A1B     53                  push ebx
00A35A1C     80F8 05             cmp al,5
00A35A1F     74 06               je short 00A35A27
00A35A21     0FB60E              movzx ecx,byte ptr ds:[esi]
00A35A24     41                  inc ecx
00A35A25     EB 05               jmp short 00A35A2C
00A35A27     B9 04000000         mov ecx,4
00A35A2C     01CE                add esi,ecx
00A35A2E     FF75 F0             push dword ptr ss:[ebp-10]
00A35A31     E8 FAFDFFFF         call 00A35830
//IAT 处理
00A35A36     5B                  pop ebx
00A35A37     EB CB               jmp short 00A35A04
//循环处理输入表
00A35A39     5F                  pop edi
//这里下断   ★  输入表处理完毕!
00A35A3A     5E                  pop esi
00A35A3B     5B                  pop ebx
00A35A3C     5A                  pop edx
00A35A3D     59                  pop ecx
00A35A3E     8BC3                mov eax,ebx
00A35A40     5B                  pop ebx
00A35A41     8BE5                mov esp,ebp
00A35A43     5D                  pop ebp
00A35A44     C3                  retn
            
————————————————————————
2、第四个IAT处理:04485961处
           
00A3595C     B8 B846A300         mov eax,0A346B8
00A35961     8B55 0C             mov edx,dword ptr ss:[ebp+C]
00A35964     8B12                mov edx,dword ptr ds:[edx]
00A35966     8902                mov dword ptr ds:[edx],eax
00A35968     EB 01               jmp short 00A3596B
           
当我们中断在00A35966处时,EAX=00A346B8
Ctrl+G:00A346B8
           
00A346B8     55                  push ebp
00A346B9     8BEC                mov ebp,esp
00A346BB     8B55 0C             mov edx,dword ptr ss:[ebp+C]
00A346BE     8B45 08             mov eax,dword ptr ss:[ebp+8]
00A346C1     3B05 F833A400       cmp eax,dword ptr ds:[A433F8]
00A346C7     75 09               jnz short 00A346D2
00A346C9     8B0495 F833A400     mov eax,dword ptr ds:[edx*4+A433F8]
00A346D0     EB 07               jmp short 00A346D9
00A346D2     52                  push edx
00A346D3     50                  push eax
00A346D4     E8 2710FFFF         call 00A25700; jmp to kernel32.GetProcAddress
00A346D9     5D                  pop ebp
00A346DA     C2 0800             retn 8
           
所以这个函数是GetProcAddress,把EAX的值修改为GetProcAddress的地址,WinXP下这个地址是77E5A5FD
           
           
—————————————————————————————————
三、、Pre-Dip:用你自己的名字注册
           
           
输入表处理结束后中断在00A35A39处,现在我们来处理Pre-Dip完成注册。
取消以前的所有断点,现在设置Ollydbg忽略除了“内存访问异常”之外的所有其它异常选项。
           
Shift+F9运行,注意看堆栈,当第2次在堆栈中看见“8wh3JAAQjOI=”硬盘指纹时,可以处理了。
           
0012FF1C    0012FF2C  指针到下一个 SEH 记录
0012FF20    00A414EE  SE 句柄
0012FF24    0012FF18
0012FF28    00A551B4  ASCII "8wh3JAAQjOI="//硬盘指纹
           
           
00A41615     C700 3FA00038       mov dword ptr ds:[eax],3800A03F
//第2次看见硬盘指纹时的异常处  ★
00A4161B     0D 6EFD44BA         or eax,BA44FD6E
00A41620     B4 43               mov ah,43
00A41622     5D                  pop ebp
00A41623     1B67 64             sbb esp,dword ptr ds:[edi+64]
00A41626     8F06                pop dword ptr ds:[esi]
00A41628     0000                add byte ptr ds:[eax],al
00A4162A     83C4 04             add esp,4
00A4162D     EB 02               jmp short 00A41631
           
Alt+M打开内存查看窗口,在00401000的第2个区段上设置内存访问断点。
Shift+F9 通过异常,断在00418E50处
           
00418E50     8B4424 04           mov eax,dword ptr ss:[esp+4]
00418E54     A3 A8604900         mov dword ptr ds:[4960A8],eax
//EAX=00A239BD          保存注册名的地方 ★
00418E59     C2 0400             retn 4
           
在程序中找块空地,如00475B00处,写下你的名字,如:fly [CUG]
然后修改EAX=00475B00。
OK,处理完毕。
           
           
—————————————————————————————————
四、Second段内存断点大法,直达OEP
           
           
我们Second段的内存断点当然还是有效的。再次设置Ollydbg忽略所有的异常选项。
Shift+F9 运行,中断几次后就直接来到OEP了!
           
0043EFE8     55                  push ebp
//在这儿用LordPE纠正ImageSize后完全DUMP这个进程
0043EFE9     8BEC                mov ebp,esp
0043EFEB     6A FF               push -1
0043EFED     68 70F44700         push RegClean.0047F470
0043EFF2     68 D0444400         push RegClean.004444D0
0043EFF7     64:A1 00000000      mov eax,dword ptr fs:[0]
0043EFFD     50                  push eax
0043EFFE     64:8925 00000000    mov dword ptr fs:[0],esp
0043F005     83EC 58             sub esp,58
0043F008     53                  push ebx
0043F009     56                  push esi
0043F00A     57                  push edi
0043F00B     8965 E8             mov dword ptr ss:[ebp-18],esp
0043F00E     FF15 E8634700       call dword ptr ds:[4763E8] ; kernel32.GetVersion
           
           
运行ImportREC,选择这个进程。
修改OEP=0003EFE8、RVA=00076000、Size=0000083C,获取输入表,所有的函数都是有效的。
FixDump,正常运行,脱壳成功! 
启动时要求注册的NAG不见了, License To You 
             
           
—————————————————————————————————
五、去除自检验失败后自动重启机子的暗桩
           
           
脱壳后运行一段时间居然让我的电脑自动重启了。
呵呵,作者还是比较善良的,只是检验失败后重启电脑,没有进行其他破坏行动。
并且检验的手段也是很善良的,只是检验大小。
可以BP ExitWindowsEx,拦截关机函数。
也可以运行1分钟后BP CreateFileA,就来到检验的地方了。
           
004288F3     FF15 4C624700       call dword ptr ds:[<&kernel32.CreateFileA>]
004288F9     8BE8                mov ebp,eax
004288FB     83FD FF             cmp ebp,-1
004288FE     74 79               je short UnPacked.00428979
00428900     8D5424 10           lea edx,dword ptr ss:[esp+10]
00428904     52                  push edx
00428905     55                  push ebp
00428906     FF15 C4634700       call dword ptr ds:[<&kernel32.GetFileSize>]
//获取文件大小
0042890C     8BD8                mov ebx,eax
0042890E     83FB FF             cmp ebx,-1
00428911     75 13               jnz short UnPacked.00428926
           
00428926     8B4424 10           mov eax,dword ptr ss:[esp+10]
0042892A     57                  push edi
0042892B     3BC6                cmp eax,esi
0042892D     75 04               jnz short UnPacked.00428933
0042892F     8BFB                mov edi,ebx
00428931     EB 14               jmp short UnPacked.00428947
           
00428947     55                  push ebp
00428948     FF15 48624700       call dword ptr ds:[<&kernel32.CloseHandle>]
0042894E     85F6                test esi,esi
00428950     7F 18               jg short UnPacked.0042896A
00428952     7C 08               jl short UnPacked.0042895C
00428954     81FF 90230B00       cmp edi,0B2390
//比较啦
0042895A     77 0E               ja short UnPacked.0042896A
//修改为:JMP 0042896F  ★
0042895C     85F6                test esi,esi
0042895E     7F 0F               jg short UnPacked.0042896F
00428960     7C 08               jl short UnPacked.0042896A
00428962     81FF F09C0900       cmp edi,99CF0
00428968     73 05               jnb short UnPacked.0042896F
0042896A     E8 D103FFFF         call UnPacked.00418D40
//这里面SeShutdownPrivilege然后ExitWindowsEx了  ★
0042896F     8B4C24 10           mov ecx,dword ptr ss:[esp+10]
00428973     E8 F7880200         call UnPacked.0045126F
00428978     5F                  pop edi
00428979     5E                  pop esi
0042897A     5D                  pop ebp
0042897B     5B                  pop ebx
0042897C     81C4 0C010000       add esp,10C
00428982     C2 0400             retn 4
           
OK,现在程序温柔了,不再自做主张帮偶重启了。


—————————————————————————————————
六、Bug修正    

    
如果你发现程序执行扫描功能时出错,不要心急,原程序就有这个问题。作者和我们开个玩笑?  
索性看看怎么回事。设置Ollydbg忽略除了“内存访问异常”之外的所有其它异常选项。
找到下面的地方。
       
004220B0     A1 60FB4800         mov eax,dword ptr ds:[48FB60]
004220B5     56                  push esi
004220B6     85C0                test eax,eax
004220B8     8BF1                mov esi,ecx
004220BA     74 04               je short UnPacked.004220C0
//修改为:JMP 004220C0  ★
004220BC     33C0                xor eax,eax
004220BE     FE00                inc byte ptr ds:[eax]

  
0041F400     E8 1B010000         call UnPacked.0041F520
0041F405     85C0                test eax,eax
0041F407     74 04               je short UnPacked.0041F40D
//修改为:JMP 0041F40D  ★
0041F409     33C0                xor eax,eax
0041F40B     FE00                inc byte ptr ds:[eax]

OK,现在可以正常执行扫描功能了。只是我不用这个东东。
    
   
—————————————————————————————————    
                                
         ,     _/ 
        /| _.-~/            \_     ,        青春都一晌
       ( /~   /              \~-._ |\
       `\\  _/                \   ~\ )          忍把浮名 
   _-~~~-.)  )__/;;,.          \_  //'
  /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        换了破解轻狂
 `~ _( ,_..--\ (     ,;'' /    ~--   /._`\ 
  /~~//'   /' `~\         ) /--.._, )_  `~
  "  `~"  "      `"      /~'`\    `\\~~\   
                         "     "   "~'  ""

    
     UnPacked By 巢水工作坊——fly [FCG][NUKE][DCM][BCG][CUG]
                 2004-09-01   04:00