用ollydbg手脱UPX加壳的DLL

用Ollydbg手脱UPX加壳的DLL

作者:fly

【目标程序】:UPX加壳的EdrLib.dll。附件中还有输入表、重定位数据、UPXAngela以及UnPacked以供参考。       
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg1.10C、WinHex、LordPE、UPXAngela、ImportREC
—————————————————————————————————
【脱壳过程】:

其实这篇东东只是《加密与解密》第2版中关于UPX脱壳的Ollydbg脱壳翻版。
Ollydbg1.10C加UPXAngela脱UPX的DLL很是方便呀,呵呵。
—————————————————————————————————
一、得到重定位表RVA和OEP

代码:-------------------------------------------------------------------------------- 
003B8100     807C24 08 01        cmp byte ptr ss:[esp+8],1//进入OD后停在这
003B8105     0F85 7D010000       jnz EdrLib.003B8288
--------------------------------------------------------------------------------

不用跟踪,Ctrl+S 在当前位置下搜索命令序列:

代码:--------------------------------------------------------------------------------
xchg ah,al
rol eax,10
xchg ah,al
add eax,esi
--------------------------------------------------------------------------------

找到在003B826D处,在其上mov al,byte ptr ds:[edi]的003B825E处下断,F9运行,断下

代码:--------------------------------------------------------------------------------
003B825E     8A07                mov al,byte ptr ds:[edi]
//EDI=003B7318-当前基址003B0000=00007318  ★ 这就是重定位表的RVA
003B8260     47                  inc edi
003B8261     09C0                or eax,eax
003B8263     74 22               je short EdrLib.003B8287
//重定位数据处理完毕则跳转
003B8265     3C EF               cmp al,0EF
003B8267     77 11               ja short EdrLib.003B827A
003B8269     01C3                add ebx,eax
003B826B     8B03                mov eax,dword ptr ds:[ebx]
003B826D     86C4                xchg ah,al//找到这里
003B826F     C1C0 10             rol eax,10
003B8272     86C4                xchg ah,al
003B8274     01F0                add eax,esi
003B8276     8903                mov dword ptr ds:[ebx],eax
003B8278     EB E2               jmp short EdrLib.003B825C
003B827A     24 0F               and al,0F
003B827C     C1E0 10             shl eax,10
003B827F     66:8B07             mov ax,word ptr ds:[edi]
003B8282     83C7 02             add edi,2
003B8285     EB E2               jmp short EdrLib.003B8269
--------------------------------------------------------------------------------

在003B8287处下断,F9运行,断下,重定位数据处理完毕
当我们在003B8287处中断下来时,EDI=003B74EA,就是重定位表结束的地址

代码:--------------------------------------------------------------------------------
003B8287     61                  popad
//此时EDI=003B74EA  ★
003B8288     E9 3C8FFFFF         jmp EdrLib.003B11C9
//飞向光明之点巅!
--------------------------------------------------------------------------------

代码:--------------------------------------------------------------------------------
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。

—————————————————————————————————
二、输入表
            
随便从程序找一个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!
            
—————————————————————————————————
三、重定位表修复 + PE修正
            
UPX破坏了重定位表。在第一步我们已经得到重定位表的地址了,用WinHex打开dumped_.dll,复制7318-74EA之间的16进制数值,另存为fly.bin
运行 看雪 老师写的辅助修复UPX加壳DLL重定位表的工具UPXAngela.exe,打开fly.bin,很快的提示pediy.bin文件创建成功!
从dumped_.dll找块空白代码,如自UPX1段的6000处开始。够用就行,pediy.bin中的数据长度为3B0。
用WinHex把pediy.bin中的16进制数值全部复制、写入到dumped_.dll的6000处。
用LordPE修正dumped_.dll的重定位表RVA=00006000、大小=000003B0,保存之。
再用LordPE修正dumped_.dll的基址为003B0000,OK,脱壳完成啦。

转载于:https://www.cnblogs.com/F4ncy/archive/2005/01/03/85736.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值