• 标 题:用Ollydbg手脱tElock V0.98加壳的DLL
  • 作 者:fly
  • 时 间:004-06-03,00:31
  • 链 接:http://bbs.pediy.com

【目标程序】:tElock加壳的EdrLib.dll。附件中含有UnPacked以供参考。        
             
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
         
【调试环境】:WinXP、Ollydbg1.10、LordPE

【实例下载】:点击此处下载
             
————————————————————————————————— 
【脱壳过程】:
          
         
            
借用《解密与解密》第二版中的话:tElock加壳的DLL的致命弱点就是输入表和重定位加密代码可以被跳过!也就是说我们只要搞定了这两个Magic Jump就行了。下面的方法和书上的操作流程有点不同,其实原理是一样的。
           
—————————————————————————————————
一、双重Magic Jump:避开重定位和输入表加密
             
             
设置Ollydbg忽略除了“INT3中断”之外的所有其它异常选项。老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。
         
         

代码:
003B8BD6     E9 25E4FFFF         jmp EdrLib.003B7000//进入OD后停在这 003B8BD0     FF6424 04           jmp dword ptr ss:[esp+4]

         
Shift+F9 运行,程序中断在INT3异常处
         
代码:
003B708D     90                  nop//第1次异常 003B7B28     90                  nop//第2次异常

         
提供一个简便寻找ASPack加壳DLL的重定位处理代码段的方法!
现在设置Ollydbg忽略所有异常选项。Ctrl+S在“整个段块”搜索命令序列:
         
代码:
mov ebx,edx shr ebx,10 mov eax,dword ptr ds:[esi]

         
找到在003B8195处!我们在其上的003B8177处下断,Shift+F9 运行,中断
         
代码:
003B8177     8BB5 56D34000       mov esi,dword ptr ss:[ebp+40D356] //[ebp+40D356]=[003B8CB4]=00006000 ★ 这个00006000就是重定位表的RVA! 003B817D     85F6                test esi,esi 003B817F     0F84 8B000000       je EdrLib.003B8210 003B8185     8B95 62D34000       mov edx,dword ptr ss:[ebp+40D362] 003B818B     03F2                add esi,edx 003B818D     2B95 66D34000       sub edx,dword ptr ss:[ebp+40D366] //这里其实就是检测与映像基址是否相符,不符则重定位处理!★ 003B8193     74 7B               je short EdrLib.003B8210 //Magic Jump,可以第2次Load后在这里改标志位Z=1,使其跳转 ★ 003B8195     8BDA                mov ebx,edx//找到这里! 003B8197     C1EB 10             shr ebx,10 003B819A     8B06                mov eax,dword ptr ds:[esi] 003B819C     85C0                test eax,eax 003B819E     74 70               je short EdrLib.003B8210 //重定位处理完毕后这里就跳转       在003B8210处下断 003B81A0     8B4E 04             mov ecx,dword ptr ds:[esi+4] 003B81A3     83E9 08             sub ecx,8 003B81A6     D1E9                shr ecx,1 003B81A8     8BBD 62D34000       mov edi,dword ptr ss:[ebp+40D362] 003B81AE     03F8                add edi,eax 003B81B0     83C6 08             add esi,8 003B81B3     0FB706              movzx eax,word ptr ds:[esi] 003B81B6     C1C8 0C             ror eax,0C 003B81B9     FEC8                dec al 003B81BB     78 4C               js short EdrLib.003B8209 003B81BD     74 0E               je short EdrLib.003B81CD 003B81BF     FEC8                dec al 003B81C1     74 13               je short EdrLib.003B81D6 003B81C3     FEC8                dec al 003B81C5     74 3C               je short EdrLib.003B8203 003B81C7     FEC8                dec al 003B81C9     74 14               je short EdrLib.003B81DF 003B81CB     EB 3C               jmp short EdrLib.003B8209 003B81CD     C1E8 14             shr eax,14 003B81D0     66:011C07           add word ptr ds:[edi+eax],bx 003B81D4     EB 33               jmp short EdrLib.003B8209 003B81D6     C1E8 14             shr eax,14 003B81D9     66:011407           add word ptr ds:[edi+eax],dx 003B81DD     EB 2A               jmp short EdrLib.003B8209 003B81DF     52                  push edx 003B81E0     C1E8 14             shr eax,14 003B81E3     8BD8                mov ebx,eax 003B81E5     C1E0 10             shl eax,10 003B81E8     66:8B16             mov dx,word ptr ds:[esi] 003B81EB     66:81E2 FF0F        and dx,0FFF 003B81F0     66:8BC2             mov ax,dx 003B81F3     5A                  pop edx 003B81F4     8D8410 00800000     lea eax,dword ptr ds:[eax+edx+8000] 003B81FB     89041F              mov dword ptr ds:[edi+ebx],eax 003B81FE     46                  inc esi 003B81FF     46                  inc esi 003B8200     49                  dec ecx 003B8201     EB 06               jmp short EdrLib.003B8209 003B8203     C1E8 14             shr eax,14 003B8206     011407              add dword ptr ds:[edi+eax],edx 003B8209     46                  inc esi 003B820A     46                  inc esi 003B820B     49                  dec ecx 003B820C     7F A5               jg short EdrLib.003B81B3 003B820E     EB 8A               jmp short EdrLib.003B819A//循环处理 003B8210     8B95 62D34000       mov edx,dword ptr ss:[ebp+40D362] //当我们中断在003B8210处时,重定位处理完毕。此时ESI=003B63B0,★ 就是重定位表的结束地址啦。 //得到重定位表信息:RVA=00006000,大小=000003B0           003B8216     8BB5 52D34000       mov esi,dword ptr ss:[ebp+40D352] //[ebp+40D352]=[003B8CB0]=0000442C ★ 这就是输入表的RVA啦。 003B821C     85F6                test esi,esi 003B821E     0F84 06040000       je EdrLib.003B862A //第2个Magic Jump,改标志位Z=1,使其跳转,则不加密IAT 003B8224     03F2                add esi,edx 003B8226     83A5 52D44000 00    and dword ptr ss:[ebp+40D452],0 003B822D     8B46 0C             mov eax,dword ptr ds:[esi+C] 003B8230     8366 0C 00          and dword ptr ds:[esi+C],0 003B8234     85C0                test eax,eax 003B8236     0F84 EE030000       je EdrLib.003B862A 003B823C     03C2                add eax,edx 003B823E     8BD8                mov ebx,eax 003B8240     50                  push eax 003B8241     FF95 D0D24000       call dword ptr ss:[ebp+40D2D0]//GetModuleHandleA 003B8247     85C0                test eax,eax 003B8249     0F85 BA000000       jnz EdrLib.003B8309

         
咱们已经得到重定位表信息了,所以可以再次载入这个DLL,重复上面的步骤,在003B8193处改标志位Z=1,使其跳转,避开重定位表加密!
          
         
—————————————————————————————————
二、第2区段内存断点法:快速直达OEP
         
         
当我们修改了以上两个Magic Jump,自003B821E处跳至003B862A。
代码:
003B862A     8BBD 5AD34000       mov edi,dword ptr ss:[ebp+40D35A] 003B8630     85FF                test edi,edi 003B8632     EB 03               jmp short EdrLib.003B8637

         
现在我们Alt+M打开 内存查看 窗口:
代码:
003B0000   00001000   EdrLib   003B0000 (itself)  PE header//第1区段 003B1000   00003000   EdrLib   003B0000           code//第2区段  ★ 003B4000   00001000   EdrLib   003B0000           data 

         
在003B1000第2区段上 设置内存访问断点!Shift+F9 运行,直接中断在OEP处!
         
代码:
003B11C9     55                  push ebp//OEP ★ 003B11CA     8BEC                mov ebp,esp 003B11CC     53                  push ebx 003B11CD     8B5D 08             mov ebx,dword ptr ss:[ebp+8] 003B11D0     56                  push esi 003B11D1     8B75 0C             mov esi,dword ptr ss:[ebp+C] 003B11D4     57                  push edi 003B11D5     8B7D 10             mov edi,dword ptr ss:[ebp+10] 003B11D8     85F6                test esi,esi 003B11DA     75 09               jnz short EdrLib.003B11E5

         
用LordPE选中Ollydbg的loaddll.exe的进程,在下面的列表里选择EdrLib.dll,然后完整脱壳,得到dumped.dll。
         
         
—————————————————————————————————
三、PE修正:完成脱壳
         
         
因为我们已经跳过了双重Magic Jump,所以使得修复工作变得很简单:
用LordPE修正dumped.dll的OEP=000011C9,输入表RVA=0000442C,保存之。
用LordPE修正dumped.dll的重定位表RVA=00006000、大小=000003B0,保存之。
OK,脱壳完成啦。
               
             
—————————————————————————————————    
代码:
                                        ,     _/          /| _.-~/            \_     ,        青春都一晌        ( /~   /              \~-._ |\        `\\  _/                \   ~\           忍把浮名     _-~~~-.)  __/;;,.          \_  //'   /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        换了破解轻狂  `~ _( ,_..--\ (     ,;'' /    ~--   /._`\    /~~//'   /' `~\          /--.._, _  `~   "  `~"  "      `"      /~'`\    `\\~~\                             "     "   "~'  ""

    

     Cracked By 巢水工作坊——fly [OCN][FCG][NUKE][DCM]

                2004-06-02  01:00