在调试还原精灵6.1还原驱动时发现总是无法在Windbg里面进行单步调试,很奇怪,看那一下驱动,跟驱动没有关系,通过跟踪发现在其应用程序启动后,无法单步调试,HDDGMon.EXE,这个其主核心应用程序加那Anti-Debug调试功能,首先使用PEID查看其是否加壳,如下图所示:
 
图1
这是一个老牌的壳,这里采取两次内存断点方法,所谓两次内存断点法的原理是:外壳会依次对.text、.rdata、.data、.rsrc的区块进行解压、密处理,因此先对.rsrc块下一个F2内存访问断点(这个断点在访问后会自动删除),在此之前,我shilft+F9发现改程序会经常跳入到异常处理机制ZwRaiseException,并且看到应为如下代码:div edi、div dx这些发生异常的指令,这说明这个壳通过大量的异常指令来干扰我们进行单步调试,因此在ollydbg中忽略所有异常,shiflt+F9运行,会跳到如下位置:
004FA0A9            F3:A5            rep movs dword ptr es:[edi],dword ptr ds:[esi]
004FA0AB            8BCB            mov ecx,ebx
004FA0AD            F3:A4            rep movs byte ptr es:[edi],byte ptr ds:[esi]
004FA0AF            8BF2             mov esi,edx
004FA0B1            8B7C24 28         mov edi,dword ptr ss:[esp+28]
esi指向资源块,edi指向外壳的区块,估计处理完rsrc后就会执行代码段,因此对.text下F2内存断点,shilft+F9运行,跳到如下位置:
00448FA4            55                    push ebp
00448FA5            8BEC                 mov ebp,esp
00448FA7            6A FF                 push -1
00448FA9            68 606C4500           push HDDGMon.00456C60
00448FAE            68 0E914400           push HDDGMon.0044910E               
; jmp to msvcrt._except_handler3
00448FB3            64:A1 00000000         mov eax,dword ptr fs:[0]
00448FB9            50                    push eax
00448FBA            64:8925 00000000       mov dword ptr fs:[0],esp
00448FC1            83EC 68               sub esp,68
00448FC4            53                    push ebx
00448FC5            56                    push esi
00448FC6            57                    push edi
从上面得知0x00448FA4就是其OEP。下面是对输入表进行修复,首先我们看一下其IAT,部分的输入表被隐藏在外壳里,如下图2所示:
 
图2
下面是通过0xAA0000最终定位到如图3的地址,也就是真正的API地址,这里我采取编写脚本来替换它,这个可以参考(http://bbs.pediy.com/showthread.php?p=903627)
 
图3

这里有两种情况,一是inc eax,一是 nop,所以分情况写 ,下面是脚本的代码(本人对脚本还是不大熟悉,写的比较挫)如下:
var iatstart
var iatend
var temp
var lkpd

mov iatstart,00450b28
mov iatend,00450cf4

labl:
    mov temp,[iatstart]
    log temp
    
    cmp temp,0
    je next
    
    find temp,#FF30C3#    //找到这个FF30C3就是PUSH DWORD PTR DS:[EAX]   RETN
    mov temp,$RESULT     //找到上面指令的首要地址


    mov lkpd,temp
    sub temp,5
    mov temp,[temp]

    sub lkpd,1
    mov lkpd,[lkpd]
    
    cmp lkpd,C330FF40
    je ok

labk:
    mov temp,[temp]
    log temp
    mov [iatstart],temp
    
   
next:
   add iatstart,4
   cmp iatstart,iatend
   jbe labl
   jmp end

error:
    msg "错误"

ok:
    add temp,1
    jmp labk

end:
    ret
再次用peid打开,发现是vc++6.0写的,如下图4:
 
图4
可直接运行,但是发现其脱壳后的大小比用工具脱的要大一些,后面才发现有工具可以直接脱,反正就当自己学习一下,下面覆盖原来的文件,进行内核调试,去掉壳之后,可以进行单步调试,看样子,所有的anti-debug都在壳里,脱掉之后,再无干扰,还原精灵还是一款不错的软件,其修改MBR,主引导记录,先启动自己代码,进行一系列操作之后,在从12扇区取出保存的原有MBR;还有其竟有多点还原的功能,虽然只有5个,但是其是2005年的产品,可见当时其编程功力的深厚,值得我近一步的研究学习,随文附上未脱壳及脱壳后的主程序,安装文件自己去下一个,有点大,传不上来!
还原精灵6.1主程序.rar