安全中国首页 > 文章中心 > 脱壳技术
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

Armadillov3.01加壳软件SoundEdit Pro的脱壳

更新时间:2008-5-7 0:06:43
责任编辑:阿loosen
热 点:
程序名:SoundEdit Pro V1.3.634 
   
※软件简介※:SoundEdit Pro可以打开WAV、MPC、MP+、MP2、MP3、VOX、RAW、OGG、WMA、CDA 等 
扩展名的音乐文件,进行声波编辑、剪裁、混音等工作;还有完整的录音功能,可以从 CD、麦克 
风、立体混音装置、讯号线来源、影片等来源录音。 

软件语言: 英文 
软件类别: 国外软件/共享版/音频处理 
运行环境: Win9x/Me/NT/2000/XP 
界面预览: 无 
软件大小: 10273KB 
软件更新: 2003-7-8 
下载页面: http://www.pcdog.com/soft/942.htm 

※参考文章※:Armadillo标准加壳的程序的脱壳和引入表修复方案 作者:jwh51 
             脱Armadillo 3.01 壳 作者:yesky1 
             Armadillo V3.40标准加壳方式的脱壳——Win98的Notepad 作者:fly 

※软件限制※:SoundEdit是一个声音编辑软件,采用了ARMADILLO的KEY加密,启动要你输入KEY,否则要 
等几秒才能让你启动,还有30天试用期,所以,如果脱了壳,上述现象都将没有了.现在开始脱壳历程.!!   

※破解工具※:Ollydbg1.09、FI 3.01 
Armadillo是当今猛壳之一,加壳方式有两种,一种是标准方式(Standard Protections Only)加壳, 
另一种是CopyMem-II+Debug-Blocker的加壳,其标准加壳方式相对来说则容易的多.用COPYMEMII的 
一般可用DILLODUMP脱,而用标准加壳用DILLODUMP是脱不了的。 

※开始吧※  
FI 3.01侦测知其用Armadilolo v3.01加壳,并且运行是没有两个进程,所以应该是标准加壳. 

用Ollydbg载入SoundEdit Pro V1.3.634,设置忽略所有的异常选项,把Ollydbg的异常选择项全部勾上。 

004F6000 > $Content$nbsp;60             PUSHAD 
                  ====>进入Ollydbg后断在这! 

第一步,去掉Ollydbg的调试器标志: 
[方法一] 
用IsDebug 1.4插件去掉Ollydbg的调试器标志。 
[方法二] 
Bp IsDebuggerPresent 
F9运行一下就会来到IsDebuggerPresent函数的入口地址: 
77E52E92 > 64:A1 18000000   MOV EAX,DWORD PTR FS:[18]               ; <--中断在这里 
77E52E98   8B40 30          MOV EAX,DWORD PTR DS:[EAX+30] 
77E52E9B   0FB640 02        MOVZX EAX,BYTE PTR DS:[EAX+2]           ; <--运行到这里 
77E52E9F   C3               RETN 
在77E52E9B地址处停下,看看DS:[EAX+2]指向的地址7FFDF002的指是01(这个地址可能和你的不同), 
修改这个值为00 因为Armadillo通过IsDebuggerPresent函数来检查是不是被调试器调试,如果有调试 
器就会赋EAX值为01没有就赋EAX值为00。修改这个值就是告诉他没有调试器,自然不会出错拉!记下 
这个地址,以后经常会用到的. 

第二步,DUMP出程序并修复:  
[方法一] 
首先一点是Armadillo是通过类似于调试的方法来运行程序的。   
新版本Armadillo脱壳的一个难点是它的代码段是分页解密的,我估计它的做法是将代码段  
锁定,即将其属性设为不可读、写、执行,当被执行到时会产生一个页面保护错误,而调  
试程序就会捕获这个错误,将对应的页面解锁并解密,然后返回执行. 

BP VirtualProtect,F9运行,这时会有异常,用SHIFT+F9过程序会断下来,这时你不停按F9,一般在第6次会 
出现注册框,OK后再次中断,这时你要注意堆栈开始记下F9的次数了.我这第24下时在堆栈出现如下信息:   
0012EB78   7342F406  /CALL to VirtualProtect from MSVBVM60.7342F400 
说明程序,已经运行了.(VB是先运行MSVBVM60.DLL的,在其中也用调用VirtualProtect)   
现在重新载入程序,到出现这个信息的前一次中断停下来,然后按几次CTRL+F9到程序中(也就是地址较低 
的地方,一般都是004*****,005*****,本程序在这:  

正常情况下,按上面的做法可以很顺利的走下来,但是会遇到警告修改系统时间而退出程序的情况, 
如下方法可挫败它的这个保护。 
先不要BP VirtualProtect,F9运行,这时会有异常,用SHIFT+F9过,再按F9,直到出现注册 
框,这时BP GetLocalTime,OK后中断两次, 

0012C05C   00CAABA3  /CALL 到 GetLocalTime 来自 00CAAB9D 
0012BDF4   00CAABA3  /CALL 到 GetLocalTime 来自 00CAAB9D 
0012BDF8   0012BDFC  \pLocaltime = 0012BDFC 
最终返回到 
00CB4672   E8 08060000      CALL 00CB4C7F 
00CB4677   84C0             TEST AL,AL      ====>走到这里将AL改为00000000即可  
00CB4679   74 1C            JE SHORT 00CB4697 
00CB467B   E8 56050000      CALL 00CB4BD6   ====>这个call警告修改系统时间  
然后清除所有断点,下BP VirtualProtect,按F9中断,这时你要注意堆栈开始记下F9的次数了.我这 
第24下时在堆栈出现如下信息:   
0012EB78   7342F406  /CALL to VirtualProtect from MSVBVM60.7342F400 
说明程序,已经运行了.(VB是先运行MSVBVM60.DLL的,在其中也用调用VirtualProtect)   
现在重新载入程序,到出现这个信息的前一次中断停下来,然后按几次CTRL+F9到程序中(也就是地址较低 
的地方,一般都是004*****,005*****,本程序在这:  
***************** 
以下是jwh51的原文 
***************** 
004DA060    83C4 04        ADD    ESP, 4   
004DA063    8945 FC        MOV    DWORD PTR SS:[EBP-4], EAX   
004DA066    837D B8 00      CMP    DWORD PTR SS:[EBP-48], 0   
004DA06A    74 0A          JE      SHORT SoundEdi.004DA076   
004DA06C    8B45 B8        MOV    EAX, DWORD PTR SS:[EBP-48]   
004DA06F    50              PUSH    EAX   
004DA070    FF15 E8615000  CALL    DWORD PTR DS:[<&USER32.DestroyWi>; USER32.DestroyWindow   
004DA076    8B45 FC        MOV    EAX, DWORD PTR SS:[EBP-4]   
004DA079    8BE5            MOV    ESP, EBP   
004DA07B    5D              POP    EBP   
004DA07C    C3              RETN   
这时小心地用F8,因为有一堆的JMP,JNZ,JO等,不过也用不了多久的,大概20多次就可来到这:   
004DB483    61              POPAD   
004DB484    6A 00          PUSH    0   
004DB486    E8 6E000000    CALL    SoundEdi.004DB4F9   
004DB48B    83C4 04        ADD    ESP, 4   
004DB48E    6A 00          PUSH    0   
004DB490    E8 46830000    CALL    SoundEdi.004E37DB   
004DB495    83C4 04        ADD    ESP, 4   
004DB498    837D E4 01      CMP    DWORD PTR SS:[EBP-1C], 1   
004DB49C    75 11          JNZ    SHORT SoundEdi.004DB4AF   
004DB49E    68 E8965000    PUSH    SoundEdi.005096E8   
004DB4A3    FF15 0C975000  CALL    DWORD PTR DS:[50970C]    ,这个CALL用F7跟进   
004DB4A9    83C4 04        ADD    ESP, 4   
004DB4AC    8945 E4        MOV    DWORD PTR SS:[EBP-1C], EAX   
004DB4AF    68 0C9E4D00    PUSH    SoundEdi.004D9E0C   
在4db4a3这个CALL用f7跟进,然后继续F8,几次后就来到这:   
00D0B5E0  /75 29          JNZ    SHORT 00D0B60B   
00D0B5E2  |E8 A05AFFFF    CALL    00D01087   
00D0B5E7  |FF76 04        PUSH    DWORD PTR DS:[ESI+4]   
00D0B5EA  |8BF8            MOV    EDI, EAX   
00D0B5EC  |A1 CCEED100    MOV    EAX, DWORD PTR DS:[D1EECC]   
00D0B5F1  |FF76 08        PUSH    DWORD PTR DS:[ESI+8]   
00D0B5F4  |8B48 70        MOV    ECX, DWORD PTR DS:[EAX+70]   
00D0B5F7  |3348 50        XOR    ECX, DWORD PTR DS:[EAX+50]   
00D0B5FA  |6A 00          PUSH    0   
00D0B5FC  |3348 34        XOR    ECX, DWORD PTR DS:[EAX+34]   
00D0B5FF  |03F9            ADD    EDI, ECX   
00D0B601  |E8 815AFFFF    CALL    00D01087   
00D0B606  |50              PUSH    EAX   
00D0B607  |FFD7            CALL    EDI                              ; SoundEdi.004059B0   
看到最后这个CALL EDI吗,004059B0就是程序的OEP了,我们F7跟进:   
00405996  - FF25 3C114000  JMP    DWORD PTR DS:[40113C]   
0040599C  - FF25 8C104000  JMP    DWORD PTR DS:[40108C]   
004059A2  - FF25 B0104000  JMP    DWORD PTR DS:[4010B0]   
004059A8  - FF25 E8114000  JMP    DWORD PTR DS:[4011E8]   
004059AE    0000            ADD    BYTE PTR DS:[EAX], AL   
004059B0    68 787D4000    PUSH    SoundEdi.00407D78    ,这是OEP了,   
004059B5    E8 EEFFFFFF    CALL    SoundEdi.004059A8   
呵,典型的VB代码.拿出LOADPE,快快DUMP吧.我们把DUMP的程序保存为DUMPED.EXE   
以前总以为它的修复很难,但实际上只要修改程序流程,完全可得到正确的引入表的.   
1.可先用importREC试试,有一个指针无效,如果CUT程序退出时会出错,所以要修复它.通过它我们可看到iat的  
rva为1000,错误指针为1030,(如果很多指针无效,只要记住一个无效的RVA就可以了)   

1 2 下一页

 
相关文章
一日一文章
 
一日一软件
一日一动画