首页
社区
课程
招聘
用Ollydbg手脱EncryptPE V1.2003.5.18加壳的DLL
2004-7-8 21:55 16511

用Ollydbg手脱EncryptPE V1.2003.5.18加壳的DLL

fly 活跃值
85
2004-7-8 21:55
16511
用Ollydbg手脱EncryptPE V1.2003.5.18加壳的DLL                        
            
            
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
        
【调试环境】:WinXP、flyODBG、PEiD、LordPE、ImportREC
                 
―――――――――――――――――――――――――――――――――
【脱壳过程】:
         
                  
有兄弟让看看EncryptPE加壳的DLL,我说新版的就不行了,搞不定的。后来看是EncryptPE V1.2003.5.18旧版加壳的,应该用的是老王老师发布的免费版。呵呵,所以脱了一下,顺便记录过程。
大家可以自己用EncryptPE V1.2003.5.18免费版加个EdrLib.dll看看。
      
―――――――――――――――――――――――――――――――――
一、避开IAT加密
         
        
设置Ollydbg忽略所有的异常选项。用IsDebug 1.4插件去掉Ollydbg的调试器标志。
添加“同时忽略0EEDFADE、C0000008、009B25C、00953D74”异常。
      
 
00877000     60                  pushad//进入OD后停在这
00877001     9C                  pushfd
00877002     64:FF35 00000000    push dword ptr fs:[0]
00877009     E8 79010000         call EdrLib.00877187

        
下断:BP IsDebuggerPresent 断下后取消断点
现在我们Ctrl+G:711A0000
为何用这个地址?因为V12003518.EPE是相同的。呵呵,钻了个旧版的空子。
        
其实可以再BP GetProcAddress,根据返回地址来判断。如果返回地址是711XXXXX,说明这是V12003518.EPE的调用,就可以取消断点Ctrl+F9返回了。具体情况以堆栈的返回地址为准。
        
现在Ctrl+S 在“整个区段”搜索命令序列:
mov eax,edi
mov edx,dword ptr ss:[ebp-8]
mov dword ptr ds:[eax],edx
xor eax,eax 

        
找到在711A339F处,我们在711A339F处下个 硬件执行 断点。
现在我们关闭Ollydbg,重新载入这个dll,直接Shift+F9运行,中断在711A339F处
        
711A339F     8BC7                mov eax,edi
711A33A1     8B55 F8             mov edx,dword ptr ss:[ebp-8]
//改为: mov edx,dword ptr ss:[ebp-4] ★ 正确函数写入
711A33A4     8910                mov dword ptr ds:[eax],edx
711A33A6     33C0                xor eax,eax
711A33A8     5A                  pop edx
711A33A9     59                  pop ecx
711A33AA     59                  pop ecx
711A33AB     64:8910             mov dword ptr fs:[eax],edx
711A33AE     EB 0A               jmp short V1200351.711A33BA

        
把711A33A1处修改好之后,取消以前下的711A339F处的断点。
再Ctrl+S搜索命令序列:
add ebx,4
mov eax,dword ptr ss:[ebp-4C]
add eax,4

找到在711A43C2处,我们在下面xor eax,eax的711A4401下断。Shift+F9运行
        
711A43C2     83C3 04             add ebx,4
711A43C5     8B45 B4             mov eax,dword ptr ss:[ebp-4C]
711A43C8     83C0 04             add eax,4
711A43CB     8945 B4             mov dword ptr ss:[ebp-4C],eax
711A43CE     8B03                mov eax,dword ptr ds:[ebx]
711A43D0     85C0                test eax,eax
711A43D2     0F87 39FDFFFF       ja V1200351.711A4111
711A43D8     A1 74C71B71         mov eax,dword ptr ds:[711BC774]
711A43DD     8038 00             cmp byte ptr ds:[eax],0 
711A43E0     75 1F               jnz short V1200351.711A4401
711A43E2     8B45 C4             mov eax,dword ptr ss:[ebp-3C]
711A43E5     83C0 14             add eax,14
711A43E8     8945 C4             mov dword ptr ss:[ebp-3C],eax
711A43EB     8B45 C4             mov eax,dword ptr ss:[ebp-3C]
711A43EE     8378 0C 00          cmp dword ptr ds:[eax+C],0
711A43F2     76 0D               jbe short V1200351.711A4401
711A43F4     8B45 C4             mov eax,dword ptr ss:[ebp-3C]
711A43F7     8378 10 00          cmp dword ptr ds:[eax+10],0
711A43FB     0F87 38FCFFFF       ja V1200351.711A4039//循环处理IAT
711A4401     33C0                xor eax,eax//此处下断! ★

        
当我们中断在711A4401处时IAT已经处理完毕,此时就可以用ImportREC得到正确的输入表了。
因为EncryptPE后面有自校验,所以我们返回711A33A1处,点右键->撤销选择,恢复原来的代码。
        
        
―――――――――――――――――――――――――――――――――
二、得到重定位表信息、获得OEP
        
        
Ctrl+S 在“整个区段”搜索命令序列:
mov edx,dword ptr ss:[ebp-24]
sub edx,dword ptr ds:[eax+34]
mov dword ptr ss:[ebp-54],edx

找到在711A4428处,下断,Shift+F9运行,中断下来
        
711A4428     8B55 DC             mov edx,dword ptr ss:[ebp-24] ; EdrLib.00870000
711A442B     2B50 34             sub edx,dword ptr ds:[eax+34]//算是一种比较方式吧
711A442E     8955 AC             mov dword ptr ss:[ebp-54],edx
711A4431     8B45 D8             mov eax,dword ptr ss:[ebp-28]
711A4434     8B40 3C             mov eax,dword ptr ds:[eax+3C]
711A4437     0345 D8             add eax,dword ptr ss:[ebp-28]
711A443A     8B90 A0000000       mov edx,dword ptr ds:[eax+A0]
//[eax+A0]=[008E7D80]=00006000  ★ 这个00006000就是重定位表的RVA!原来放在这里 :-)
711A4440     8955 C8             mov dword ptr ss:[ebp-38],edx
711A4443     8B90 A4000000       mov edx,dword ptr ds:[eax+A4]
//[eax+A4]=[008E7D84]=000003B0  ★ 这个000003B0就是重定位表的Size!

        
OK,我们已经得到了我们想得到的信息。我们可以Dump出重定位表了,现在的重定位表是完好的。
用LordPE选择这个dll,部分脱壳:地址=00870000+00006000=00876000,大小=3B0,存为00876000.dmp
        
略去重定位过程,我们在这里寻找OEP!
Ctrl+F在当前位置下搜索命令:sub edx,dword ptr ss:[ebp-24]  找到在711A450D处:
        
711A4504     83F0 FF             xor eax,FFFFFFFF
711A4507     8B55 F0             mov edx,dword ptr ss:[ebp-10]
711A450A     83F2 FF             xor edx,FFFFFFFF
//EDX=FF78EE36 XOR FFFFFFFF=008711C9
711A450D     2B55 DC             sub edx,dword ptr ss:[ebp-24] 
//EDX=008711C9  ★  这是什么?呵呵,OEP啦
711A4510     33C2                xor eax,edx
711A4512     0345 AC             add eax,dword ptr ss:[ebp-54]
711A4515     8945 FC             mov dword ptr ss:[ebp-4],eax
711A4518     EB 13               jmp short V1200351.711A452D

        
下面每处理1次就清零掉重定位表数据。
Ctrl+F在当前位置下搜索命令:mov word ptr ds:[ebx],0  找到在711A4600处:
        
711A4600     66:C703 0000        mov word ptr ds:[ebx],0//重定位表清0!
711A4605     FF4D E0             dec dword ptr ss:[ebp-20]
711A4608     837D E0 00          cmp dword ptr ss:[ebp-20],0
711A460C     0F8F B6FEFFFF       jg V1200351.711A44C8
711A4612     8B45 E8             mov eax,dword ptr ss:[ebp-18]

        
如果壳加密了跳转表,则在这段代码中间处理,可以修改代码避开跳转表的加密。
        
        
―――――――――――――――――――――――――――――――――
三、DUMP
   
           
去OEP吧。Ctrl+S 在“整个区段”搜索命令序列:
mov eax,dword ptr ds:[edx+28]
mov dword ptr ds:[ebx+0B0],eax

        
找到在7119CF0E处,在7119CF11处下 硬件执行 断点,Shift+F9运行
7119CF0E     8B42 28             mov eax,dword ptr ds:[edx+28]
7119CF11     8983 B0000000       mov dword ptr ds:[ebx+B0],eax; EdrLib.008711C9

        
我们会在7119CF11处中断2次,第2次就是OEP的值了。
BP 008711C9  Shift+F9运行就来到OEP了。
        
008711C9     55                  push ebp//OEP ★
008711CA     8BEC                mov ebp,esp
008711CC     53                  push ebx
008711CD     8B5D 08             mov ebx,dword ptr ss:[ebp+8]
008711D0     56                  push esi
008711D1     8B75 0C             mov esi,dword ptr ss:[ebp+C]
008711D4     57                  push edi
008711D5     8B7D 10             mov edi,dword ptr ss:[ebp+10]
008711D8     85F6                test esi,esi
008711DA     75 09               jnz short EdrLib.008711E5
008711DC     833D 60538700 00    cmp dword ptr ds:[875360],0
008711E3     EB 26               jmp short EdrLib.0087120B

        
现在就可以DUMP了。用LordPE选中Ollydbg的loaddll.exe的进程,在下面的列表里选择EdrLib.dll,然后完整脱壳,得到dumped.dll。
        
小提示:EncryptPE V1.2003.5.18都用的是V12003518.EPE
所以,以上避开IAT加密和得到重定位信息的代码地址是相同的,呵呵。
        
        
―――――――――――――――――――――――――――――――――
四、输入表
        
        
因为已经避开了IAT加密,所以现在可以得到完整的输入表。随便从程序找个API调用:
008710FD     FF15 20408700       call dword ptr ds:[874020]; kernel32.GetVersion
在转存中跟随874020,上下看到许多函数地址,很明显的可以找到IAT开始和结束的地址:
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
IAT:
00873FF0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00874000   1D 51 C4 77 1C 3A C4 77 3E E7 C4 77 CC D2 C4 77  Q镊:镊>缒w桃镊
        
008740B0   CE 7C E5 77 05 74 E5 77 F9 81 E5 77 EB 41 E4 77  吸鬻t鬻?鬻肓澉
008740C0   66 C8 E5 77 3E 18 F6 77 00 00 00 00 00 00 00 00  f儒w>鲼........
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

开始地址=00874000
结束地址=008740C9
        
运行ImportREC,去掉“使用来自磁盘的PE部首”的选项!选中Ollydbg的loaddll.exe的进程,然后点“选取DLL”,选择EdrLib.dll,填入填入RVA=00004000、大小=C8、OEP=000011C9 ,点“Get Import”,得到输入表,FixDump!
        
        
―――――――――――――――――――――――――――――――――
五、PE修正
        
        
用LordPE修正dumped_.dll的基址为00870000。
用WinHex把00876000.dmp全部复制写入进dumped_.dll的00006000处。
用LordPE修正dumped_.dll的重定位表RVA=00006000、大小=000003B0,保存之。
OK,脱壳完成啦。
        
        
―――――――――――――――――――――――――――――――                           
         ,     _/
        /| _.-~/            \_     ,        青春都一晌
       ( /~   /              \~-._ |\
       `\\  _/                \   ~\ )          忍把浮名
   _-~~~-.)  )__/;;,.          \_  //'
  /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        换了破解轻狂
`~ _( ,_..--\ (     ,;'' /    ~--   /._`\
  /~~//'   /' `~\         ) /--.._, )_  `~
  "  `~"  "      `"      /~'`\    `\\~~\   
                         "     "   "~'  ""

               UnPacKed By :  fly        
                2004-07-07 02:22

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (26)
雪    币: 109
活跃值: (36)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
pll823 2004-7-8 22:19
2
0
支持!

BTW:黑档X的稿费收到没有?恭喜发财!:D :D :D
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2004-7-8 22:24
3
0
不小心看成2004,血压升高……
好帖加精。:D
雪    币: 223
活跃值: (106)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
temerata 1 2004-7-8 22:37
4
0
先顶再学习。:D
雪    币: 299
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
clide2000 7 2004-7-8 22:41
5
0
Fly的文章真是高产啊,发的比我学的都快。先收藏了再说。支持
雪    币: 442
活跃值: (723)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
wangshy 2 2004-7-8 22:42
6
0
收藏中~!:D
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
龙儿 2004-7-8 23:44
7
0
支持!
雪    币: 896
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2004-7-9 00:11
8
0


__比泪水还温柔的歌 像悲伤一样的温暖

__虽然明白世界并不是那么简单的转动

__仍想静静地净化黑暗 试着走下去


forgot 又去玩什么了?头像真另类呀
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2004-7-9 00:20
9
0
玩这个版本的EPE源码:D
雪    币: 3007
活跃值: (3552)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
china 5 2004-7-9 00:23
10
0
老王快疯了,你这了小家伙,够厉害。睡觉,88。
雪    币: 203
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
honhon 2004-7-9 17:20
11
0
fly能不能提供一下EdrLib.dll下载呀,不知道这个库文件那里下载
雪    币: 896
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2004-7-9 22:43
12
0
随便找个dll就行
或者找我以前的dll脱壳笔记
里面一般有这个dll
雪    币: 442
活跃值: (723)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
wangshy 2 2004-7-10 00:21
13
0
Fly再写个Armadillo 双进程的脱壳教程撒~!
今天弄个Armadillo 的壳,
主程序脱掉了,
Dll是双进程的,偶搞不定~!
雪    币: 896
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2004-7-10 00:45
14
0
Dll是双进程的?
给个链接我看看
雪    币: 260
活跃值: (81)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
pll621 2004-7-10 01:05
15
0
双进程的dll?没见过,从原理上讲的通么?.....不懂ing...
雪    币: 442
活跃值: (723)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
wangshy 2 2004-7-10 01:43
16
0
DFCG上下载的,也不知道是不是
主程序脱掉了,这Dll脱不了~!
会产生堆栈溢值~!
点击下载:附件!Easymir.rar
雪    币: 896
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2004-7-10 02:44
17
0
最初由 pll621 发布
双进程的dll?没见过,从原理上讲的通么?.....不懂ing...


我也没见过双进程的dll
雪    币: 896
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2004-7-10 04:20
18
0
最初由 wangshy 发布
DFCG上下载的,也不知道是不是
主程序脱掉了,这Dll脱不了~!
会产生堆栈溢值~!
点击下载:附件!Easymir.rar


UnPacked-Easymir.dll
  

这个Armadillo加壳的dll不是双进程的啦

你可以用主程序载入这个dll
然后脱壳

OEP: 0001DFD8	IATRVA: 00037000	IATSize: 000004E0


重定位表信息:

00B3633C     C705 B432B400 203DB>mov dword ptr ds:[B432B4],0B43D20
00B36346     A1 80C5B400         mov eax,dword ptr ds:[B4C580]
00B3634B     8B00                mov eax,dword ptr ds:[eax]
//[101DFDA5]=0011E000   ★ 这个0011E000就是重定位表的RVA!

00B3634D     8985 40D8FFFF       mov dword ptr ss:[ebp-27C0],eax
00B36353     A1 80C5B400         mov eax,dword ptr ds:[B4C580]
00B36358     83C0 04             add eax,4
00B3635B     A3 80C5B400         mov dword ptr ds:[B4C580],eax
00B36360     A1 80C5B400         mov eax,dword ptr ds:[B4C580]
00B36365     8B00                mov eax,dword ptr ds:[eax]
//[101DFDA9]=00004B14   ★ 这个00004B14就是重定位表的RVA!
00B36367     8985 78D8FFFF       mov dword ptr ss:[ebp-2788],eax
00B3636D     A1 80C5B400         mov eax,dword ptr ds:[B4C580]
00B36372     83C0 04             add eax,4
00B36375     A3 80C5B400         mov dword ptr ds:[B4C580],eax
00B3637A     83BD 40D8FFFF 00    cmp dword ptr ss:[ebp-27C0],0
00B36381     74 6F               je short 00B363F2
00B36383     83BD 78D8FFFF 00    cmp dword ptr ss:[ebp-2788],0
00B3638A     74 66               je short 00B363F2
00B3638C     8B85 04D7FFFF       mov eax,dword ptr ss:[ebp-28FC]
00B36392     8B8D 14D7FFFF       mov ecx,dword ptr ss:[ebp-28EC]
00B36398     3B48 34             cmp ecx,dword ptr ds:[eax+34]         ; easymir.10000000
00B3639B     74 55               je short 00B363F2
//如与映像基址不符则重定位处理!★


点击下载:附件!UnPacked-Easymir{Armadillo}.rar_04446.rar
雪    币: 154
活跃值: (546)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
阿牛 2005-9-16 22:56
19
0
对于下面的有没有详细讲解的,偶菜鸟看不懂啊

因为已经避开了IAT加密,所以现在可以得到完整的输入表。随便从程序找个API调用:
008710FD     FF15 20408700       call dword ptr ds:[874020]; kernel32.GetVersion
在转存中跟随874020,上下看到许多函数地址,很明显的可以找到IAT开始和结束的地址:

代码:--------------------------------------------------------------------------------
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
IAT:
00873FF0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00874000   1D 51 C4 77 1C 3A C4 77 3E E7 C4 77 CC D2 C4 77  Q镊:镊>缒w桃镊
        
008740B0   CE 7C E5 77 05 74 E5 77 F9 81 E5 77 EB 41 E4 77  吸鬻t鬻?鬻肓澉
008740C0   66 C8 E5 77 3E 18 F6 77 00 00 00 00 00 00 00 00  f儒w>鲼........
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
--------------------------------------------------------------------------------

开始地址=00874000
结束地址=008740C9
        
运行ImportREC,去掉“使用来自磁盘的PE部首”的选项!选中Ollydbg的loaddll.exe的进程,然后点“选取DLL”,选择EdrLib.dll,填入填入RVA=00004000、大小=C8、OEP=000011C9 ,点“Get Import”,得到输入表,FixDump!
雪    币: 896
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2005-9-18 00:29
20
0
已经比较详细了
你可以先去看一些基础的知识
推荐《加密与解密2》

基础知识永远需要自己去努力掌握,否则你无法和别人进行深入点的交流
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
pendan2001 4 2005-9-18 06:41
21
0
来晚了,支持!!
雪    币: 208
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
周二两 2005-9-19 20:44
22
0
支持!fly厉害的说!
收藏了!!支持永远支持!
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
smssms 1 2005-12-3 14:20
23
0
FLY脱个910的DLL吧,自硝烟太多了
,搞不定,搞个教程我们学习下
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
无名人 2005-12-5 06:08
24
0
支持永远支持!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pcmars 2005-12-9 01:18
25
0
求救脱encryptpe 2005.3.12的壳找不到断点(个人爱好)
本人是个小小的菜鸟,请各位老大指点一下,谢谢!!!!
$-189    016C0000 <> $ 60                 PUSHAD

$-189    016C0000 <> $ 60                 PUSHAD
游客
登录 | 注册 方可回帖
返回