首页
社区
课程
招聘
ReloX修复DLL脱壳重定位表的简便方法――用Ollydbg手脱Neolite加壳的DLL
发表于: 2004-12-22 21:41 19321

ReloX修复DLL脱壳重定位表的简便方法――用Ollydbg手脱Neolite加壳的DLL

fly 活跃值
85
2004-12-22 21:41
19321

ReloX修复DLL脱壳重定位表的简便方法――用Ollydbg手脱Neolite加壳的DLL

                 
                       
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
            
【调试环境】:WinXP、Ollydbg V1.10、PEiD、LordPE、WinHex、ReloX
            
―――――――――――――――――――――――――――――――――
【脱壳过程】:
         
         
某些壳保护的DLL脱壳时重定位表修复让人头痛,偶然发现了ReloX修复重定位表的工具,试验了几次居然成功了,所以写个简单的过程加以推广这个工具。由于比较忙,所以只测试了Neolite和UPX加壳DLL的重定位表修复,其它壳大家再多测试吧。
EdrLib.dll是Neolite V2.0最大比例压缩,加密了重定位表,无法自动脱壳。
―――――――――――――――――――――――――――――――――
一、Entry Point
            
            
Neolite是压缩壳,OEP非常容易走到。

003D710F     E9 A6000000       jmp EdrLib.003D71BA
//进入Ollydbg后暂停在这
003D71BA     8B4424 04         mov eax,dword ptr ss:[esp+4]
003D71BE     2305 20713D00     and eax,dword ptr ds:[3D7120]
003D71C4     E8 ED040000       call EdrLib.003D76B6
003D71C9     FE05 B9713D00     inc byte ptr ds:[3D71B9]
003D71CF     FFE0              jmp eax
//这里就是跳向OEP的地方!:-)  在这里“埋伏”个断点,开始第二步操作
                     

―――――――――――――――――――――――――――――――――
二、适当的Dump时机:搞定输入表

下断:BP VirtualProtect
中断后取消断点,Alt+F9返回

003D7B22     FF55 7A           call dword ptr ss:[ebp+7A]; kernel32.VirtualProtect
003D7B25     FF75 66           push dword ptr ss:[ebp+66]
003D7B28     8D55 A2           lea edx,dword ptr ss:[ebp-5E]
003D7B2B     8D85 5EFDFFFF     lea eax,dword ptr ss:[ebp-2A2]
003D7B31     FF75 5A           push dword ptr ss:[ebp+5A]
003D7B34     8B4F 0C           mov ecx,dword ptr ds:[edi+C]
003D7B37     E8 B4030000       call EdrLib.003D7EF0
//区段解压
003D7B3C     8B55 0A           mov edx,dword ptr ss:[ebp+A]
003D7B3F     8B47 04           mov eax,dword ptr ds:[edi+4]
003D7B42     8B52 24           mov edx,dword ptr ds:[edx+24]
003D7B45     25 00000080       and eax,80000000
003D7B4A     81E2 00000080     and edx,80000000
003D7B50     39D0              cmp eax,edx
003D7B52     0F84 60FFFFFF     je EdrLib.003D7AB8
003D7B58     F647 04 20        test byte ptr ds:[edi+4],20
003D7B5C     0F84 4FFFFFFF     je EdrLib.003D7AB1
003D7B62     C745 AA 20000000  mov dword ptr ss:[ebp-56],20
003D7B69     E9 4AFFFFFF       jmp EdrLib.003D7AB8
//循环
003D7B6E     837E 24 00        cmp dword ptr ds:[esi+24],0
//F4到这里   [esi+24]=[003E4024]=0000442C     输入表的RVA! ★
003D7B72     0F84 1D010000     je EdrLib.003D7C95

现在程序代码已经解开,API函数的系统地址还没有填充进IAT,也没有重定位,还等什么?运行LordPE完全Dump出这个dll。

―――――――――――――――――――――――――――――――――
三、飞向光明之巅

Dump完毕之后直接F9运行,中断在我们首先“埋伏”的断点处。
003D71CF     FFE0              jmp eax  ; EdrLib.003D11C9
//飞向光明之巅!:-)

003D11C9     55                push ebp
//OEP
003D11CA     8BEC              mov ebp,esp
003D11CC     53                push ebx
003D11CD     8B5D 08           mov ebx,dword ptr ss:[ebp+8]

―――――――――――――――――――――――――――――――――
四、PE修正

用LordPE修正dumped.dll的OEP RVA=000011C9,Import Table RVA=0000442C,IAT RVA可以清零。
删除Oreloc、.neolit、.reloc三个区段,用WinHex移除00006000至末尾的壳数据。

输出表没有加密,可以用LordPE来察看。RVA=000070A2 Size=6D
WinHex打开EdrLib.dll,把偏移0X10A2处的06D字节复制出来;在dumped.dll中找一点空地,把其挪至4900处吧
修正dumped.dll的Export Table RVA=00004900,Size一样。
当然要修正相关数据了:
->Export Table
   Characteristics:        0x00000000
   TimeDateStamp:          0x3DC70847  (GMT: Mon Nov 04 23:52:39 2002)
   MajorVersion:           0x0000
   MinorVersion:           0x0000  -> 0.00
   Name:                   0x000070DE  ("EdrLib.dll") ==>修改为:0x0000493C
   Base:                   0x00000001
   NumberOfFunctions:      0x00000002
   NumberOfNames:          0x00000002
   AddressOfFunctions:     0x000070CA                 ==>修改为:0x00004928
   AddressOfNames:         0x000070D2                 ==>修改为:0x00004930
   AddressOfNameOrdinals:  0x000070DA                 ==>修改为:0x00004938

   Ordinal RVA        Symbol Name
   ------- ---------- ----------------------------------
   0x0001  0x00001010 "_EdrCenterTextA@12"
   0x0002  0x00001080 "_EdrCenterTextW@12""

可以直接用WinHex修改:

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F   //原来的输出表
000010A0         00 00 00 00 47 08  C7 3D 00 00 00 00 DE 70     ....G.?....摒
000010B0   00 00 01 00 00 00 02 00  00 00 02 00 00 00 CA 70   ..............署
000010C0   00 00 D2 70 00 00 DA 70  00 00 10 10 00 00 80 10   ..茵..陴......?
000010D0   00 00 E9 70 00 00 FC 70  00 00 00 00 01 00 45 64   ..轲..?......Ed
000010E0   72 4C 69 62 2E 64 6C 6C  00 5F 45 64 72 43 65 6E   rLib.dll._EdrCen
000010F0   74 65 72 54 65 78 74 41  40 31 32 00 5F 45 64 72   terTextA@12._Edr
00001100   43 65 6E 74 65 72 54 65  78 74 57 40 31 32 00      CenterTextW@12.

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F   //修改的输出表
00004900   00 00 00 00 47 08 C7 3D  00 00 00 00 3C 49 00 00   ....G.?....<I..
00004910   01 00 00 00 02 00 00 00  02 00 00 00 28 49 00 00   ............(I..
00004920   30 49 00 00 38 49 00 00  10 10 00 00 80 10 00 00   0I..8I......?..
00004930   47 49 00 00 5A 49 00 00  00 00 01 00 45 64 72 4C   GI..ZI......EdrL
00004940   69 62 2E 64 6C 6C 00 5F  45 64 72 43 65 6E 74 65   ib.dll._EdrCente
00004950   72 54 65 78 74 41 40 31  32 00 5F 45 64 72 43 65   rTextA@12._EdrCe
00004960   6E 74 65 72 54 65 78 74  57 40 31 32 00            nterTextW@12.

只保留LordPE的“Validate PE”选项,对dumped.dll重建PE。

―――――――――――――――――――――――――――――――――
五、ReloX:修复重定位表的“通用”简便方法

ReloX V1.0的作者是牛人MackT/uCF2000,即Import REConstructor的作者。
ReloX可以通过比较不同基址的Dump文件,确定重定位表。

感谢好友WiNroot,特地写了个DLL_LoadEX。用看雪老大的DLL_Loader也可以。

把EdrLib.dll复制一份,然后用DLL_LoadEX载入EdrLib.dll和复制EdrLib.dll,注意两个进程的基址。

用LordPE直接把这2个DLL进程Dump出来,另存为1.dll(ImageBase=01040000)和2.dll(ImageBase=01060000)

为了减小体积,删除1.dll和2.dll的Oreloc、.neolit、.reloc三个区段,用WinHex移除00006000至末尾的数据

运行ReloX,选择1.dll和2.dll,分别填入其相应的基址,点ComPare,稍等,分析完毕。

Fix PE Module,提示dumped_.dll保存成功。ReloX已经自动修正了Relocation RVA和Size!

―――――――――――――――――――――――――――――――――
六、尾声

现在脱壳后的DLL已经可以运行了。但是用Ollydbg载入时会弹出“Module EdrLib has empty code section”的提示,感谢超人heXer,指教是BaseOfCode的缘故,00007000已经被删掉了,所以提示错误。可以把BaseOfCode修正为00001000,这样就不会提示了。如果想做的完美点,还可以把BaseOfData、SizeOfCode等修正。

―――――――――――――――――――――――――――――――――   
                                
         ,     _/
        /| _.-~/            \_     ,        青春都一晌
       ( /~   /              \~-._ |\
       `\\  _/                \   ~\ )          忍把浮名
   _-~~~-.)  )__/;;,.          \_  //'
  /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        换了破解轻狂
`~ _( ,_..--\ (     ,;'' /    ~--   /._`\
  /~~//'   /' `~\         ) /--.._, )_  `~
  "  `~"  "      `"      /~'`\    `\\~~\   
                         "     "   "~'  ""
   
              UnPacked By :  fly
               2004-12-22 18:00


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (32)
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
2
压缩包含有文件:


EdrLib.dll
EdrTest.exe
UnPacked-EdrLib.dll
Dll_LoadEx.exe
DLL_Loader.exe
Relox V1.0a.zip
看雪技术论坛 - ReloX修复DLL脱壳重定位表的简便方法――用Ollydbg手脱Neolite加壳的DLL.mht


:D

附件:ReloX_DLL.rar
2004-12-22 21:52
0
雪    币: 392
活跃值: (909)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
3
好文章,支持呵呵~~
2004-12-22 22:40
0
雪    币: 97697
活跃值: (200824)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
支持!!!
2004-12-22 22:42
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
5
黎叔:我最烦爆破的,一点技术含量都没有。。。


发觉我越来越喜欢Patch了,或许是越来越懒了  ;)
2004-12-22 22:57
0
雪    币: 209
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
好文。目前正为重定位表而烦劳!
2004-12-22 23:25
0
雪    币: 398
活跃值: (1078)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
7
支持, 好好学学.
2004-12-22 23:29
0
雪    币: 383
活跃值: (786)
能力值: ( LV12,RANK:730 )
在线值:
发帖
回帖
粉丝
8
tu wen bing mou!

study:D
2004-12-23 11:23
0
雪    币: 239
活跃值: (478)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
Very GOOD!
学习一下!
2004-12-23 11:44
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
斑竹,多谢,又提供了个学习的机会
2004-12-23 12:21
0
雪    币: 690
活跃值: (1826)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
11
good.ding.
2004-12-23 13:49
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
FLY,谢谢你的好资料。
2004-12-23 20:39
0
雪    币: 392
活跃值: (909)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
13
最初由 fly 发布



发觉我越来越喜欢Patch了,或许是越来越懒了 ;)

fly看了 天下无贼 ?:D
2004-12-23 21:04
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
14
最初由 cyclotron 发布
fly看了 天下无贼 ?:D


还没看
如有雷同,纯属巧合  
2004-12-23 21:32
0
雪    币: 239
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
看雪技术论坛 - ReloX修复DLL脱壳重定位表的简便方法――用Ollydbg手脱Neolite加壳的DLL.mht

请问这个文件应该用什么东西观看呢,我用IE看到的只是乱码的。
2004-12-23 22:17
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
16
IE应该可以查看
看不了就删掉,就是本页
2004-12-23 22:20
0
雪    币: 266
活跃值: (191)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
学习ing!
2004-12-23 23:19
0
雪    币: 255
活跃值: (266)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
18
最初由 二点 发布
学习ing!

站得越高,尿得越远....
:D
2004-12-23 23:54
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
19
输出表没有加密,可以用LordPE来察看。RVA=000070A2 Size=6D
WinHex打开EdrLib.dll,把偏移0X10A2处的06D字节复制出来;

请问fly兄弟:10A2年偏移地址是怎么得出的?
2004-12-24 13:13
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
20
LordPE可以直接查看
也可以用其FLC功能转换
2004-12-24 13:33
0
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
21
谢谢fly兄弟回复。
2004-12-24 14:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
请问一下,
有方法手动修复重定位表吗 ?
因为遇到不能用 Dll_LoadEx.exe 载入的 DLL 档

Neolite 的重定位表代码在哪开始,
看了两天还是找不到

感谢
2005-7-28 19:01
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
23
首先你的dll要能正常调试
如果缺少文件OllyDBG无法使其运行起来,那就无法继续

使用ReloX修复重定位表无须知道其原来的重定位表代码在哪开始
仔细看教程
2005-7-28 19:20
0
雪    币: 320
活跃值: (104)
能力值: (RANK:180 )
在线值:
发帖
回帖
粉丝
24
请教 Fly 大佬 就是要删除 没有要重定位的区段 然后加载 才能做比较 有多余的区段 ReloX 就不会动了 是这样子的吗

打个比方 重定位的部分只有.text & .data

这两个区段 要加载DLL_LoadEX 前就要删除.Data 以下的区段 才能使ReloX跑起来是吗

THX...
2005-7-29 00:40
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
25
当然不是DLL_LoadEX前就要删除,否则无法运行
Dump后删除某些壳区段只是为了减小体积
可以不删
2005-7-29 08:56
0
游客
登录 | 注册 方可回帖
返回
//