用Ollydbg手脱ASPack加壳的DLL

社区服务
高级搜索
猴岛论坛CSGO反恐精英用Ollydbg手脱ASPack加壳的DLL
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
0个回复

用Ollydbg手脱ASPack加壳的DLL

楼层直达
蠢萌萝莉σ

ZxID:1378369

等级: 禁止发言

举报 只看楼主 使用道具 楼主   发表于: 2008-04-24 0
用Ollydbg手脱ASPack加壳的DLL
用Ollydbg手脱ASPack加壳的DLL
【目标程序】:ASPack加壳的EdrLib.dll。附件中含有输入表和UnPacked以供参考。       
           
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
       
【调试环境】:WinXP、Ollydbg1.10、LordPE、ImportREC
           
—————————————————————————————————
【脱壳过程】:
         
       
                         
一、重定位表RVA + OEP
               
     

代码:
     
003B7001    60                  pushad//进入OD后停在这
003B7002    E8 03000000        call EdrLib.003B700A



       
提供一个简便寻找ASPack加壳DLL的重定位处理代码段的方法!
Ctrl+S在“整个段块”搜索命令序列:
       

代码:
mov ecx,dword ptr ds:[esi+4]
sub ecx,8
shr ecx,1



       
找到在003B71F6处!我们在其上的003B71DA处下断,F9运行,中断。
       

代码:
003B71C8    8785 35050000      xchg dword ptr ss:[ebp+535],eax
003B71CE    8B95 22040000      mov edx,dword ptr ss:[ebp+422]
003B71D4    8B85 2D050000      mov eax,dword ptr ss:[ebp+52D]
003B71DA    2BD0                sub edx,eax
//这里其实就是检测与映像基址是否相符,和ASProtect的方法一样。不符则重定位处理!★
003B71DC    74 79              je short EdrLib.003B7257
//可以在这里改标志位Z=1,使其跳转,这样脱壳后就不需要修改基址了。 ★
003B71DE    8BC2                mov eax,edx
003B71E0    C1E8 10            shr eax,10
003B71E3    33DB                xor ebx,ebx
003B71E5    8BB5 39050000      mov esi,dword ptr ss:[ebp+539]
//[ebp+539]=003B754C=00006000 ★ 这个00006000就是重定位表的RVA!
003B71EB    03B5 22040000      add esi,dword ptr ss:[ebp+422]
003B71F1    833E 00            cmp dword ptr ds:[esi],0
003B71F4    74 61              je short EdrLib.003B7257
//重定位处理完毕后这里就跳转      在003B7257处下断
003B71F6    8B4E 04            mov ecx,dword ptr ds:[esi+4]
//找到这里
003B71F9    83E9 08            sub ecx,8
003B71FC    D1E9                shr ecx,1
003B71FE    8B3E                mov edi,dword ptr ds:[esi]
003B7200    03BD 22040000      add edi,dword ptr ss:[ebp+422]
003B7206    83C6 08            add esi,8
003B7209    66:8B1E            mov bx,word ptr ds:[esi]
003B720C    C1EB 0C            shr ebx,0C
003B720F    83FB 01            cmp ebx,1
003B7212    74 0C              je short EdrLib.003B7220
003B7214    83FB 02            cmp ebx,2
003B7217    74 16              je short EdrLib.003B722F
003B7219    83FB 03            cmp ebx,3
003B721C    74 20              je short EdrLib.003B723E
003B721E    EB 2C              jmp short EdrLib.003B724C
003B7220    66:8B1E            mov bx,word ptr ds:[esi]
003B7223    81E3 FF0F0000      and ebx,0FFF
003B7229    66:01041F          add word ptr ds:[edi+ebx],ax
003B722D    EB 1D              jmp short EdrLib.003B724C
003B722F    66:8B1E            mov bx,word ptr ds:[esi]
003B7232    81E3 FF0F0000      and ebx,0FFF
003B7238    66:01141F          add word ptr ds:[edi+ebx],dx
003B723C    EB 0E              jmp short EdrLib.003B724C
003B723E    66:8B1E            mov bx,word ptr ds:[esi]
003B7241    81E3 FF0F0000      and ebx,0FFF
003B7247    01141F              add dword ptr ds:[edi+ebx],edx
003B724A    EB 00              jmp short EdrLib.003B724C
003B724C    66:830E FF          or word ptr ds:[esi],0FFFF
//这里把许多重定位数据变为FFFF ★ NOP掉!
003B7250    83C6 02            add esi,2
003B7253    E2 B4              loopd short EdrLib.003B7209
003B7255    EB 9A              jmp short EdrLib.003B71F1//循环处理
         
003B7257    8B95 22040000      mov edx,dword ptr ss:[ebp+422]//这里下断,ESI=003B63B0
003B725D    8BB5 41050000      mov esi,dword ptr ss:[ebp+541]
003B7263    0BF6                or esi,esi
003B7265    74 11              je short EdrLib.003B7278



       
当我们中断在003B7257处时,重定位处理完毕。此时ESI=003B63B0,就是重定位表的结束地址啦。
得到重定位表信息:
RVA=00006000,大小=003B63B0-003B6000=000003B0
       
       
现在我们去OEP吧,呵呵。Ctrl+B 在当前位置下搜索Hex值:61 75,即popad、jnz
       

代码:
003B73AF    61                  popad//找到这里,下断!
003B73B0    75 08              jnz short EdrLib.003B73BA
003B73B2    B8 01000000        mov eax,1
003B73B7    C2 0C00            retn 0C
003B73BA    68 C9113B00        push EdrLib.003B11C9
003B73BF    C3                  retn//飞向光明之巅! ^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。
       
       
—————————————————————————————————
二、输入表 + PE修正
           
           
随便从程序找一个API调用,如:
003B10FD    FF15 20403B00      call dword ptr ds:[3B4020]; kernel32.GetVersion
在转存中跟随3B4020,上下看到许多函数地址,很明显的可以找到IAT开始和结束的地址:
           

代码:
003B3FF0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
003B4000  1D 51 C4 77 1C 3A C4 77 3E E7 C4 77 CC D2 C4 77  .Q.w.:.w>..w...w
             
003B40B0  CE 7C E5 77 05 74 E5 77 F9 81 E5 77 EB 41 E4 77  .|.w.t.w...w.A.w
003B40C0  66 C8 E5 77 3E 18 F6 77 00 00 00 00 00 00 00 00  f..w>..w........



           
开始地址=003B4000
结束地址=003B40C9
           
运行ImportREC,注意:去掉“使用来自磁盘的PE部首”的选项!
           
选中Ollydbg的loaddll.exe的进程,然后点“选取DLL”,选择EdrLib.dll,填入RVA=00004000、大小=000000C8 ,点“Get Import”,得到输入表。改OEP=000011C9,FixDump!
       
               
用LordPE修正dumped_.dll的重定位表RVA=00006000、大小=000003B0,保存之。
再用LordPE修正dumped_.dll的基址为003B0000,OK,脱壳完成啦。
如果在003B71DC处跳过了重定位处理,则不需要修改基址。
« 返回列表
发帖 回复