首页
社区
课程
招聘
用Ollydbg手脱PECompact加壳的DLL
2004-5-25 17:16 24502

用Ollydbg手脱PECompact加壳的DLL

fly 活跃值
85
2004-5-25 17:16
24502
         
         
         
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
         
【调试环境】:WinXP、Ollydbg1.10C、WinHex、PEiD、LordPE、PEditor、ImportREC
         
―――――――――――――――――――――――――――――――――
【脱壳过程】:
                  
         
         
很多兄弟都不喜欢脱DLL的壳,我也是这样。DLL比EXE多了个重定位表需要修复,况且单独一个DLL连脱壳后的测试都难以彻底进行。但是,并不能因为麻烦就放弃所有,譬如人生中的许多其他事……
         
好几天没写东西了,忙乱且没心情。看到坛子里关于用Ollydbg脱DLL壳的笔记极少,所以写了这篇简单的东西放上来。其实在《加密与解密》第2版里对DLL的脱壳有很多的论述。
         
ftgg.dll有点特殊,如果用Ollydbg1.10C直接加载的话则dll不重定位,用DLL_Loader.exe加载的话则进行重定位。所以这次我们直接用Ollydbg1.10C加载这个DLL,Dump之后再来处理重定位表。
         
―――――――――――――――――――――――――――――――――
一、DUMP
         
        
10037000     EB 06               jmp short ftgg.10037008//进入OD后停在这
10037002     68 90960000         push 9690//OEP的RVA
10037007     C3                  retn
10037008     9C                  pushfd
10037009     60                  pushad
1003700A     E8 02000000         call ftgg.10037011

         
因为这个东东是PECompact 2.0以前的版本加壳,所以OEP很好找,壳入口的第2条指令PUSH的就是OEP的RVA地址。
OEP=10000000 + 9690=10009690
直接在10009690处下 硬件执行 断点,或者下内存断点,F9运行就中断在OEP了。
         
10009690     55                  push ebp
10009691     8BEC                mov ebp,esp
10009693     53                  push ebx
10009694     8B5D 08             mov ebx,dword ptr ss:[ebp+8]
10009697     56                  push esi
10009698     8B75 0C             mov esi,dword ptr ss:[ebp+C]
1000969B     57                  push edi
1000969C     8B7D 10             mov edi,dword ptr ss:[ebp+10]
1000969F     85F6                test esi,esi
100096A1     75 09               jnz short ftgg.100096AC

         
用LordPE选中Ollydbg的loaddll.exe的进程,在下面的列表里选择ftgg.dll,然后完整脱壳,得到dumped.dll。
Dump完之后,不要关闭Ollydbg,还要为下面的处理重定位表提供点准备。
         
         
―――――――――――――――――――――――――――――――――
二、输入表
         
         
还是借用ImportREC吧。
随便从程序找一个API调用,如:
100095C4     FF15 60B10110       call dword ptr ds:[1001B160]; kernel32.GetVersion
在转存中跟随1001B160,上下看到许多函数地址,很明显的可以找到IAT开始和结束的地址:
         
1001AFF0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
1001B000  9A 18 DA 77 EA 22 DA 77 0B 59 DA 77 F0 59 DA 77  ...w.".w.Y.w.Y.w
1001B010  00 00 00 00 19 52 31 77 00 00 00 00 B0 1B C4 77  .....R1w.......w
         
1001B390  00 00 00 00 DF 71 F7 72 26 16 F7 72 6C 71 F7 72  .....q.r&..rlq.r
1001B3A0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

         
开始地址=1001B000
结束地址=1001B3A0
         
运行ImportREC,选中Ollydbg的loaddll.exe的进程,然后点“选取DLL”,选择ftgg.dll,填入RVA=0001B000、大小=3A0、OEP=00009690 ,点“Get Import”。用PEditor纠正dumped.dll的DumpFixer,修正区块。FixDump!
         
         
―――――――――――――――――――――――――――――――――
三、重定位表 修复
         
         
仅仅这样就完成脱壳还是不行的,还有重定位表需要处理。
当我们停留在10009690的OEP处时,虽然ftgg.dll在用Ollydbg1.10C直接加载时没有进行重定位,但是其重定位代码已经解开了,所以我们现在就来寻找这段代码,以确定重定位表的RVA和大小。
         
提供一个简单的方法来寻找这段处理代码:
Ctrl+G:10037000,也就是前往壳的入口点。
然后Ctrl+S在整个段块搜索命令序列:
add esi,ebx
xor eax,eax

         
找到以下代码:
         
10038652     8B9D E6904000       mov ebx,dword ptr ss:[ebp+4090E6]//[ebp+4090E6]=10000000
10038658     3B9D 5F974000       cmp ebx,dword ptr ss:[ebp+40975F]//[ebp+40975F]=10000000
1003865E     75 01               jnz short ftgg.10038661//如与映像基址不符则重定位处理!
//可以改标志位Z=0,使这里跳转
10038660     C3                  retn
10038661     8BB5 63974000       mov esi,dword ptr ss:[ebp+409763]//[ebp+409763]=00032000  重定位表的RVA
10038667     03F3                add esi,ebx//ESI=00032000+10000000 =10032000
10038669     33C0                xor eax,eax//找到这里
1003866B     66:8B43 3C          mov ax,word ptr ds:[ebx+3C]
1003866F     03C3                add eax,ebx
10038671     8B80 C0000000       mov eax,dword ptr ds:[eax+C0]
10038677     85C0                test eax,eax
10038679     75 08               jnz short ftgg.10038683
1003867B     2B9D 5F974000       sub ebx,dword ptr ss:[ebp+40975F]
10038681     EB 0F               jmp short ftgg.10038692

         
现在我们在其retn上面的10038652处下 硬件执行 断点,然后Ctrl+F2重新载入这个dll,F9运行,就中断在10038652处了。
分析见上。因为这里不进行重定位,所以我们为了找到重定位表的地址和大小,可以改标志位Z=0,使1003865E处跳转,可以看到10038661处的[ebp+409763]=00032000,这就是重定位表的RVA!
         
10038683     03C3                add eax,ebx
10038685     2B9D 5F974000       sub ebx,dword ptr ss:[ebp+40975F]
1003868B     0118                add dword ptr ds:[eax],ebx
1003868D     83C0 04             add eax,4
10038690     0118                add dword ptr ds:[eax],ebx
10038692     AD                  lods dword ptr ds:[esi]//[ESI]=[10033C34]=00000000
10038693     0BC0                or eax,eax
10038695     74 6F               je short ftgg.10038706//重定位表处理结束,跳转
10038697     8BD0                mov edx,eax
10038699     0395 E6904000       add edx,dword ptr ss:[ebp+4090E6]
1003869F     AD                  lods dword ptr ds:[esi]
100386A0     8BC8                mov ecx,eax
100386A2     83E9 08             sub ecx,8
100386A5     D1E9                shr ecx,1
100386A7     66:C785 55974000 00>mov word ptr ss:[ebp+409755],0
100386B0     33C0                xor eax,eax
100386B2     66:AD               lods word ptr ds:[esi]
100386B4     0BC0                or eax,eax
100386B6     74 49               je short ftgg.10038701
100386B8     66:0385 55974000    add ax,word ptr ss:[ebp+409755]
100386BF     66:8985 55974000    mov word ptr ss:[ebp+409755],ax
100386C6     50                  push eax
100386C7     C1E8 0C             shr eax,0C
100386CA     83F8 01             cmp eax,1
100386CD     75 0E               jnz short ftgg.100386DD
100386CF     58                  pop eax
100386D0     25 FF0F0000         and eax,0FFF
100386D5     03C2                add eax,edx
100386D7     66:0158 02          add word ptr ds:[eax+2],bx
100386DB     EB 24               jmp short ftgg.10038701
100386DD     83F8 02             cmp eax,2
100386E0     75 0D               jnz short ftgg.100386EF
100386E2     58                  pop eax
100386E3     25 FF0F0000         and eax,0FFF
100386E8     03C2                add eax,edx
100386EA     66:0118             add word ptr ds:[eax],bx
100386ED     EB 12               jmp short ftgg.10038701
100386EF     83F8 03             cmp eax,3
100386F2     75 0C               jnz short ftgg.10038700
100386F4     58                  pop eax
100386F5     25 FF0F0000         and eax,0FFF
100386FA     03C2                add eax,edx
100386FC     0118                add dword ptr ds:[eax],ebx
100386FE     EB 01               jmp short ftgg.10038701
10038700     58                  pop eax
10038701     49                  dec ecx
10038702     75 AC               jnz short ftgg.100386B0
10038704     EB 8C               jmp short ftgg.10038692
10038706     C3                  retn//ESI=10033C38

         
上面就是程序对重定位表的处理,我们可以在10038706的retn处下断,F9运行,断下后就可以得到重定位表的大小了。
ESI=10033C38,重定位表结束地址=10033C38-4=10033C34
重定位表大小=10033C34-开始地址10032000=1C34
         
用WinHex打开dumped_.dll,复制32000-33C34之间的16进制数值,另存为1.bin
运行 看雪 老师写的辅助修复PECompact加壳DLL重定位表的工具PEComAngela.exe,打开1.bin,很快的提示pediy.bin文件创建成功!
         
用WinHex把pediy.bin中的16进制数值全部复制、写入到dumped_.dll的32000处,替换原先的重定位数据。
用LordPE修正dumped_.dll的重定位表RVA=00032000、大小=00001C34,保存之。
         
如果还想简单优化一下脱壳后的文件,可以用FileScan啦。
         
OK,脱壳后的dll可以正常加载了,由于没有原先调用的主程序,所以只能做到这一步了。如果主程序中还有对DLL的校验,那就只有再从主程序入手解决了。
         
         
―――――――――――――――――――――――――――――――――   
                              
         ,     _/ 
        /| _.-~/            \_     ,        青春都一晌
       ( /~   /              \~-._ |\
       `\\  _/                \   ~\ )          忍把浮名 
   _-~~~-.)  )__/;;,.          \_  //'
  /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        换了破解轻狂
 `~ _( ,_..--\ (     ,;'' /    ~--   /._`\ 
  /~~//'   /' `~\         ) /--.._, )_  `~
  "  `~"  "      `"      /~'`\    `\\~~\   
                         "     "   "~'  ""

   

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

                2004-05-25  16:00

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞10
打赏
分享
最新回复 (44)
雪    币: 896
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2004-5-25 17:18
2
0
雪    币: 221
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gcf 2004-5-25 18:29
3
0
这个DLL文件单独可以执行啊,还是好判断脱出来没有的嘛
谢谢FLY兄的贡献,我正想学一下脱DLL壳的办法,主要是输入表
和重定向表的问题,呵呵
雪    币: 221
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gcf 2004-5-25 18:42
4
0
我脱了这个dll,没有这么麻烦。
用大哥你的esp定律1秒钟到oep,然后用ollydump直接脱壳
用importsec修复,搞定!可以运行
总共没有用到1分钟........................
下面是我脱出来的,和你的不太一样

点击下载:附件!
雪    币: 303
活跃值: (461)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
liuyilin 2004-5-25 19:42
5
0
学习ing
雪    币: 896
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2004-5-25 20:40
6
0
最初由 gcf 发布
我脱了这个dll,没有这么麻烦。
用大哥你的esp定律1秒钟到oep,然后用ollydump直接脱壳
用importsec修复,搞定!可以运行
总共没有用到1分钟........................
下面是我脱出来的,和你的不太一样

点击下载:附件!


旧版的PECompact壳直接就能看到OEP了
如果不修复重定位表的话则很难跨平台运行,你可以用DLL_Loader.exe加载看看
雪    币: 299
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
clide2000 7 2004-5-25 21:11
7
0
最初由 pediy 发布

你的重定位表不完整,虽然一般情况下DLL不重定位可以运行,但如果其基地被占用的话就需要重定位,这种情况下就会出错的。


看雪老师,有一事请教,记得在《加密与解密》第2版里对DLL的脱壳时,说过aspack加的壳没有重定位,而upx的重定位了,但是看书上的内容时,两篇文章的基址不都是9DXXXX吗,这样不是都与其400000不一样吗?怎么判断出一个重定位了,而令一个没有呢(记得说判断其是否重定位的方法,就是先查看并记住其甚址,然后看看与加载后的是否一致,若不一致则为重定位)。另:看了一下光盘上脱出来的aspack与upx的文件,确实aspack加壳的脱壳文件在修复后其基址仍为400000,而upx的已经修改为9d0000了。并且我自己练习时也发现脱upx的,须修复一下基址(保证与当时加载时的基址一致)
雪    币: 216
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lesboy 2004-5-25 21:18
8
0
谢谢FLY!我学习学习再学习;)
雪    币: 221
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gcf 2004-5-25 21:39
9
0
呵呵,多谢两位大哥的指教,又学到了一些东西!真是佩服你们
雪    币: 223
活跃值: (106)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
temerata 1 2004-5-26 10:39
10
0
等这篇文章等了很久……
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kokocool 2004-5-26 11:11
11
0
学习ing
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guidaon 2004-5-26 11:26
12
0
hao
雪    币: 896
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2004-5-26 11:55
13
0
最初由 sharenpk 发布


我的理解是,如果发现重定位了,也就是跨平台很可能会出问题,或者载入dll 的时候基地址没被占用,才能运行正常。
如果要跨平台或者基地址被占用,就必须要修重定位表

我还有个问题
比如说我第一次载入dll 基地址是10000000,走到OEP过后看下面代码
833D AC300210 00 CMP DWORD PTR DS:[100230AC], 0

第二次载入dll 基地址是20000000,走到OEP过后看下面代码
833D AC300220 00 CMP DWORD PTR DS:[200230AC], 0
脱壳出来后这些都是 绝对地址,那万一基地址被占用就要出错啊。该如何解决?


脱壳后修复重定位表就不必担心这个问题了
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wuhenidd 2004-5-26 12:28
14
0

版主:
  这个DLL古怪,它有30个导出函数,居然指向同一个地址。
导出函数表需要修复吗?
雪    币: 210
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhangld 2004-5-26 12:47
15
0
目前我在破一个DLL文件,他用JPACK加的壳,通过追踪,找到了他的注册比较指令。我想直接将这条指令修改后保存文件,这样可以吗?这个重新保存的文件是否存在重建输入表的问题?这样修改是否在脱壳后才可以进行?
雪    币: 896
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2004-5-26 12:51
16
0
导出函数 不需要修复吧
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guidaon 2004-5-26 12:59
17
0
试试这个
雪    币: 223
活跃值: (106)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
temerata 1 2004-5-26 13:07
18
0
最初由 fly 发布
……

10037000 EB 06 jmp short ftgg.10037008//进入OD后停在这
10037002 68 90960000 push 9690//OEP的RVA
10037007 C3 retn
10037008 9C pushfd
10037009 60 pushad
1003700A E8 02000000 call ftgg.10037011
……


大侠,用Ollydbg1.10C才会停在上面说的地方,而用Ollydbg1.10B不会,为什么会这样?
雪    币: 210
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhangld 2004-5-26 13:30
19
0
我想把我的DLL文件放上论坛,怎么办?
说明一下:
1、它检测反调试软件;
2、输入注册码后不立即比较,而是写成一个INI文件放在WINNT下;
3、根据WINNT下的SYSTEM。INI的时间信息决定使用期限。
目前我分析的只有这些。针对2,我发现其总有一条比较指令CMP EAX,7D,于是我把7D改成了EAX中的值,重新保存。但运行时没有任何反应,而且用OD调试找不到原来的地方。
我的疑问:
1、上面我说的比较指令是否为动态生成的。
2、是这个DLL文件存在反修改指令。
3、是否先脱壳再修改?
4、如果脱壳的话,我怎么断在壳的入口点,因为我发现一加载,程序就过去了,没有办法跟踪壳的加载过程。
谢谢

附件传不上来,给个地址吧:http://myfxj.yeah.net   
的公式区赠送版下载
雪    币: 226
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
computersfan 2004-5-26 15:20
20
0
努力学习,争取早日达到如此高度。
雪    币: 442
活跃值: (723)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
wangshy 2 2004-5-26 16:42
21
0
纳闷我去年买的《加密解密》第2版放在家里发霉,出门时忘记了带了
雪    币:
能力值: (RANK: )
在线值:
发帖
回帖
粉丝
游客 2004-5-26 17:27
22
0
谢谢 + 佩服  ( fly 总能找出时间来总结他的经验 )
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
梅子超人 2004-5-26 17:49
23
0
好厉害~~~~~
雪    币: 896
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2004-5-26 23:01
24
0
最初由 guidaon 发布
点击下载:附件!


试试这个


呵呵,兄弟,别说是需要Key的DLL了,就是需要Key的Armadillo壳EXE文件也无法脱壳

当然,你如果能搞到能用Key或许还有希望试试
雪    币: 896
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
fly 85 2004-5-27 00:08
25
0
最初由 zhangld 发布
目前我在破一个DLL文件,他用JPACK加的壳,通过追踪,找到了他的注册比较指令。我想直接将这条指令修改后保存文件,这样可以吗?这个重新保存的文件是否存在重建输入表的问题?这样修改是否在脱壳后才可以进行?


应该是需要脱壳后才能修改保存的
DLL由于重定位的问题,用SMC可能也不行
游客
登录 | 注册 方可回帖
返回