• 标 题:用Ollydbg手脱ASProtect V1.23RC4加壳的DLL
  • 作 者:fly
  • 时 间:004-06-01,20:28
  • 链 接:http://bbs.pediy.com

                       
           
             
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
         
【调试环境】:WinXP、Ollydbg1.10、WinHex、LordPE、DLL_Loader、ImportREC 1.42+

【实例下载】:点击此处下载(或鼠标右键另存为)
             
————————————————————————————————— 
【脱壳过程】:
          
         
        
DLL脱壳方面的资料坛子上不多,于是我抽空写上几篇,聊作游戏。
这篇东东其实是《解密与解密》第2版中关于ASProtect的DLL脱壳教程的翻版啦。
但是我补充了手动寻找ASProtect V1.23RC4加壳DLL的重定位表地址的过程。
             
————————————————————————————————— 
一、ASProtect V1.23RC4加壳DLL的OEP很容易找
             
             
设置Ollydbg忽略所有的异常选项。老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。
             

代码:
003B7001     60                  pushad//进入OD后停在这 003B7002     E8 03000000         call EdrLib.003B700A 003B700A     5D                  pop ebp 003B700B     45                  inc ebp 003B700C     55                  push ebp 003B700D     C3                  retn

             
使用《加密与解密》第2版提及的方法吧。其实用以前的不忽略内存异常的方法也方便找DLL的OEP。
我们在外壳入口003B7001处下断,F9运行,DLL被成功加载。
现在我们关闭Ollydbg的loaddll.exe窗口,DLL卸载时会再次中断在外壳入口处!可以跟下去走到OEP了。
             
代码:
003B7008     EB 04               jmp short EdrLib.003B700E 003B700E     E8 01000000         call EdrLib.003B7014               003B7014     5D                  pop ebp 003B7015     BB EDFFFFFF         mov ebx,-13 003B701A     03DD                add ebx,ebp 003B701C     81EB 00700000       sub ebx,7000 003B7022     807D 4D 01          cmp byte ptr ss:[ebp+4D],1 003B7026     75 0C               jnz short EdrLib.003B7034 003B7028     8B7424 28           mov esi,dword ptr ss:[esp+28] 003B702C     83FE 01             cmp esi,1 003B702F     895D 4E             mov dword ptr ss:[ebp+4E],ebx 003B7032     75 31               jnz short EdrLib.003B7065//DLL卸载时这里会跳转!               003B7065     B8 C9110000         mov eax,11C9//OEP偏移值 003B706A     50                  push eax 003B706B     50                  push eax 003B706C     0345 4E             add eax,dword ptr ss:[ebp+4E] 003B706F     5B                  pop ebx 003B7070     85C0                test eax,eax 003B7072     74 1C               je short EdrLib.003B7090 003B7074     EB 01               jmp short EdrLib.003B7077 003B7077     81FB F8C0A523       cmp ebx,23A5C0F8 003B707D     74 35               je short EdrLib.003B70B4 003B707F     33D2                xor edx,edx 003B7081     56                  push esi 003B7082     6A 00               push 0 003B7084     56                  push esi 003B7085     FF75 4E             push dword ptr ss:[ebp+4E] 003B7088     FFD0                call eax; EdrLib.003B11C9//飞向光明之巅! ^O^

             
下面我们借搞定重定位地址的时机,按照EXE的脱壳方法再找一次OEP。
             
             
—————————————————————————————————
二、寻找重定位表地址
             
             
ASProtect壳没有加密重定位表,这样使得其脱壳在重定位表方面设置比UPX加壳的DLL要简单。
             
再次用Ollydbg载入EdrLib.dll,下断:BP GetModuleHandleA
当我们在GetModuleHandleA处中断2次后,就可以Alt+F9返回了。
             
代码:
008AC4A6     FF95 EC314400       call dword ptr ss:[ebp+4431EC] 008AC4AC     85C0                test eax,eax//返回这里 008AC4AE     75 07               jnz short 008AC4B7 008AC4B0     53                  push ebx 008AC4B1     FF95 F0314400       call dword ptr ss:[ebp+4431F0] 008AC4B7     8985 4D294400       mov dword ptr ss:[ebp+44294D],eax 008AC4BD     C785 51294400 00000>mov dword ptr ss:[ebp+442951],0 008AC4C7     8B95 D8304400       mov edx,dword ptr ss:[ebp+4430D8] 008AC4CD     8B06                mov eax,dword ptr ds:[esi] 008AC4CF     85C0                test eax,eax 008AC4D1     75 03               jnz short 008AC4D6 008AC4D3     8B46 10             mov eax,dword ptr ds:[esi+10] 008AC4D6     03C2                add eax,edx 008AC4D8     0385 51294400       add eax,dword ptr ss:[ebp+442951] 008AC4DE     8B18                mov ebx,dword ptr ds:[eax] 008AC4E0     8B7E 10             mov edi,dword ptr ds:[esi+10] 008AC4E3     03FA                add edi,edx 008AC4E5     03BD 51294400       add edi,dword ptr ss:[ebp+442951] 008AC4EB     85DB                test ebx,ebx 008AC4ED     0F84 A2000000       je 008AC595 008AC4F3     F7C3 00000080       test ebx,80000000 008AC4F9     75 04               jnz short 008AC4FF 008AC4FB     03DA                add ebx,edx 008AC4FD     43                  inc ebx 008AC4FE     43                  inc ebx 008AC4FF     53                  push ebx 008AC500     81E3 FFFFFF7F       and ebx,7FFFFFFF 008AC506     53                  push ebx 008AC507     FFB5 4D294400       push dword ptr ss:[ebp+44294D] 008AC50D     FF95 E8314400       call dword ptr ss:[ebp+4431E8] 008AC513     85C0                test eax,eax 008AC515     5B                  pop ebx 008AC516     75 6F               jnz short 008AC587 008AC518     F7C3 00000080       test ebx,80000000 008AC51E     75 19               jnz short 008AC539 008AC520     57                  push edi 008AC521     8B46 0C             mov eax,dword ptr ds:[esi+C] 008AC524     0385 D8304400       add eax,dword ptr ss:[ebp+4430D8] 008AC52A     50                  push eax 008AC52B     53                  push ebx 008AC52C     8D85 53314400       lea eax,dword ptr ss:[ebp+443153] 008AC532     50                  push eax 008AC533     57                  push edi 008AC534     E9 99000000         jmp 008AC5D2 008AC539     81E3 FFFFFF7F       and ebx,7FFFFFFF 008AC53F     8B85 DC304400       mov eax,dword ptr ss:[ebp+4430DC] 008AC545     3985 4D294400       cmp dword ptr ss:[ebp+44294D],eax 008AC54B     75 24               jnz short 008AC571 008AC54D     57                  push edi 008AC54E     8BD3                mov edx,ebx 008AC550     4A                  dec edx 008AC551     C1E2 02             shl edx,2 008AC554     8B9D 4D294400       mov ebx,dword ptr ss:[ebp+44294D] 008AC55A     8B7B 3C             mov edi,dword ptr ds:[ebx+3C] 008AC55D     8B7C3B 78           mov edi,dword ptr ds:[ebx+edi+78] 008AC561     035C3B 1C           add ebx,dword ptr ds:[ebx+edi+1C] 008AC565     8B0413              mov eax,dword ptr ds:[ebx+edx] 008AC568     0385 4D294400       add eax,dword ptr ss:[ebp+44294D] 008AC56E     5F                  pop edi 008AC56F     EB 16               jmp short 008AC587 008AC571     57                  push edi 008AC572     8B46 0C             mov eax,dword ptr ds:[esi+C] 008AC575     0385 D8304400       add eax,dword ptr ss:[ebp+4430D8] 008AC57B     50                  push eax 008AC57C     53                  push ebx 008AC57D     8D85 A4314400       lea eax,dword ptr ss:[ebp+4431A4] 008AC583     50                  push eax 008AC584     57                  push edi 008AC585     EB 4B               jmp short 008AC5D2 008AC587     8907                mov dword ptr ds:[edi],eax 008AC589     8385 51294400 04    add dword ptr ss:[ebp+442951],4 008AC590     E9 32FFFFFF         jmp 008AC4C7 008AC595     8906                mov dword ptr ds:[esi],eax 008AC597     8946 0C             mov dword ptr ds:[esi+C],eax 008AC59A     8946 10             mov dword ptr ds:[esi+10],eax 008AC59D     83C6 14             add esi,14 008AC5A0     8B95 D8304400       mov edx,dword ptr ss:[ebp+4430D8] 008AC5A6     E9 EBFEFFFF         jmp 008AC496 008AC5AB     8B85 652A4400       mov eax,dword ptr ss:[ebp+442A65] 008AC5B1     50                  push eax 008AC5B2     0385 D8304400       add eax,dword ptr ss:[ebp+4430D8] 008AC5B8     5B                  pop ebx 008AC5B9     0BDB                or ebx,ebx 008AC5BB     8985 112F4400       mov dword ptr ss:[ebp+442F11],eax 008AC5C1     61                  popad 008AC5C2     75 08               jnz short 008AC5CC 008AC5C4     B8 01000000         mov eax,1 008AC5C9     C2 0C00             retn 0C 008AC5CC     68 805A8A00         push 8A5A80 008AC5D1     C3                  retn

             
上面这段代码解开了ASProtect壳的代码,可以看作是ASProtect的一个特征吧。为了以后留个参考资料,所以把这段代码全部贴了出来。
             
提供一个简便寻找ASProtect V1.23RC4加壳DLL的重定位处理代码段的方法!
当我们返回008AC4AC处时,Ctrl+S在“整个段块”搜索命令序列:
代码:
mov dx,word ptr ds:[ebx] movzx eax,dx shr eax,0C sub ax,1

找到在008A36FF处!我们在其上的008A36CA处下断,F9运行,断下
             
代码:
008A36CA     8B00                mov eax,dword ptr ds:[eax] 008A36CC     8B40 10             mov eax,dword ptr ds:[eax+10] //[eax+10]=[003B781D]=00006000  ★ 这个00006000就是重定位表的RVA! 008A36CF     8B4C24 04           mov ecx,dword ptr ss:[esp+4] 008A36D3     2BCA                sub ecx,edx //这里其实就是检测与映像基址是否相符。不符则重定位处理!★ 008A36D5     890C24              mov dword ptr ss:[esp],ecx 008A36D8     833C24 00           cmp dword ptr ss:[esp],0 008A36DC     74 5F               je short 008A373D //可以在这里改标志位Z=1,使其跳转,这样脱壳后就不需要修改基址了。 008A36DE     8B5C24 04           mov ebx,dword ptr ss:[esp+4] 008A36E2     03D8                add ebx,eax 008A36E4     EB 51               jmp short 008A3737 008A36E6     8D43 04             lea eax,dword ptr ds:[ebx+4] 008A36E9     8B00                mov eax,dword ptr ds:[eax] 008A36EB     83E8 08             sub eax,8 008A36EE     D1E8                shr eax,1 008A36F0     8BFA                mov edi,edx 008A36F2     037C24 04           add edi,dword ptr ss:[esp+4] 008A36F6     83C3 08             add ebx,8 008A36F9     8BF0                mov esi,eax 008A36FB     85F6                test esi,esi 008A36FD     76 38               jbe short 008A3737 008A36FF     66:8B13             mov dx,word ptr ds:[ebx] //找到这里 008A3702     0FB7C2              movzx eax,dx 008A3705     C1E8 0C             shr eax,0C 008A3708     66:83E8 01          sub ax,1 008A370C     72 23               jb short 008A3731 008A370E     66:83E8 02          sub ax,2 008A3712     74 02               je short 008A3716 008A3714     EB 11               jmp short 008A3727 008A3716     66:81E2 FF0F        and dx,0FFF 008A371B     0FB7C2              movzx eax,dx 008A371E     03C7                add eax,edi 008A3720     8B1424              mov edx,dword ptr ss:[esp] 008A3723     0110                add dword ptr ds:[eax],edx 008A3725     EB 0A               jmp short 008A3731 008A3727     68 60378A00         push 8A3760 008A372C     E8 BBEEFFFF         call 008A25EC 008A3731     83C3 02             add ebx,2 008A3734     4E                  dec esi 008A3735     75 C8               jnz short 008A36FF 008A3737     8B13                mov edx,dword ptr ds:[ebx] 008A3739     85D2                test edx,edx 008A373B     75 A9               jnz short 008A36E6//循环处理,处理结束则不再跳转 008A373D     803D A07E8A00 00    cmp byte ptr ds:[8A7EA0],0 //EBX=003B63B0      ★结束地址 008A3744     74 0B               je short 008A3751

             
得到重定位表信息:
RVA=00006000,大小=003B63B0-003B6000=000003B0
             
             
—————————————————————————————————
三、按照EXE的脱壳方法再找一次OEP,Dump
             
             
现在我们设置Ollydbg忽略除了“内存访问异常”之外的所有其它异常选项。
Shift+F9 运行几次,来到ASProtect壳最后一次典型异常处。
             
代码:
008A39EC     3100                xor dword ptr ds:[eax],eax//ASProtect壳最后一次典型异常处 008A39EE     64:8F05 00000000    pop dword ptr fs:[0] 008A39F5     58                  pop eax 008A39F6     833D B07E8A00 00    cmp dword ptr ds:[8A7EB0],0 008A39FD     74 14               je short 008A3A13 008A39FF     6A 0C               push 0C 008A3A01     B9 B07E8A00         mov ecx,8A7EB0 008A3A06     8D45 F8             lea eax,dword ptr ss:[ebp-8] 008A3A09     BA 04000000         mov edx,4 008A3A0E     E8 2DD1FFFF         call 008A0B40 008A3A13     FF75 FC             push dword ptr ss:[ebp-4] 008A3A16     FF75 F8             push dword ptr ss:[ebp-8] 008A3A19     8B45 F4             mov eax,dword ptr ss:[ebp-C] 008A3A1C     8338 00             cmp dword ptr ds:[eax],0 008A3A1F     74 02               je short 008A3A23 008A3A21     FF30                push dword ptr ds:[eax] 008A3A23     FF75 F0             push dword ptr ss:[ebp-10] 008A3A26     FF75 EC             push dword ptr ss:[ebp-14] 008A3A29     C3                  retn//此处下断,Shift+F9 运行,断下

             
此时ESP=0006F880,看看堆栈:
代码:
0006F880    008B3B90 0006F884    003B0000 0006F888    003B7066 0006F88C    45A01122 //注意这里 ★

             
选中0006F88C转存处的4个字节,下“硬件访问->Word”断点。F9运行,中断下来
             
代码:
008B3C75     05 A70060BA         add eax,BA6000A7//中断在这里 008B3C7A     5C                  pop esp 008B3C7B     0BC9                or ecx,ecx 008B3C7D     74 02               je short 008B3C81 008B3C7F     8901                mov dword ptr ds:[ecx],eax 008B3C81     03C3                add eax,ebx 008B3C83     894424 1C           mov dword ptr ss:[esp+1C],eax 008B3C87     61                  popad 008B3C88     FFE0                jmp eax; EdrLib.003B11C9//飞向光明之巅! ^O^

             
          
代码:
    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。
所以书上说:“从某种意义上来讲,ASProtect V1.23RC4加壳的DLL比EXE要容易处理些”。
             
             
—————————————————————————————————
四、输入表
             
                        
随便从程序找一个API调用,如:
003B109F     FF15 00403B00       call dword ptr ds:[3B4000]; GetTextExtentPoint32W
             
在转存中跟随3B4000,上下看到许多函数地址,很明显的可以找到IAT开始和结束的地址:
                      
代码:
   003B4000  1D 51 C4 77 1C 3A C4 77 3E E7 C4 77 CC D2 C4 77   .Q.w.:.w>..w...w 003B40C0  70 07 8B 00 80 07 8B 00 00 00 00 00 00 00 00 00   p...............

                 
开始地址=003B4000
结束地址=003B40C9
                          
如果用ImportREC的插件来修复在Ollydbg中运行的DLL会导致ImportREC失去响应,所以我们用DLL_Loader.exe加载这个DLL,然后运行ImportREC 1.42+来修复。注意:去掉ImportREC的“使用来自磁盘的PE部首”的选项!
                          
选中DLL_Loader.exe的进程,然后点“选取DLL”,选择EdrLib.dll,填入RVA=00004000、大小=000000C8 ,点“Get Import”,用“追踪层次1”和“ASProtect 1.3 calculated imports”插件全部修复无效函数。
注意,插件把一个函数认错了:
00004020  kernel32.dll  0130  GetCurrentProcess//应为:GetVersion
修改这个函数为GetVersion,改OEP=000011C9,FixDump!
             
             
—————————————————————————————————
五、PE修正
             
             
用LordPE修正dumped_.dll的重定位表RVA=00006000、大小=000003B0,保存之。
再用LordPE修正dumped_.dll的基址为003B0000,OK,脱壳完成啦。
如果在008A36DC处跳过了重定位处理,则不需要修改基址。               
            
             
—————————————————————————————————    
代码:
                                       ,     _/          /| _.-~/            \_     ,        青春都一晌        ( /~   /              \~-._ |\        `\\  _/                \   ~\           忍把浮名     _-~~~-.)  __/;;,.          \_  //'   /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        换了破解轻狂  `~ _( ,_..--\ (     ,;'' /    ~--   /._`\    /~~//'   /' `~\          /--.._, _  `~   "  `~"  "      `"      /~'`\    `\\~~\                             "     "   "~'  ""

    

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

                2004-06-01  19:00