李沉舟 发表于 2018-2-17 16:20

探讨DLL脱壳

无聊翻悬赏贴发现有悬赏脱DLL壳的,⊙﹏⊙b汗。其实只是多加了一个重定位表的修复工作。

下面这段话是我从罗云斌的汇编书里面直接复制出来的。在原书PE结构,重定位一节中可以看到原文。

在开始分析重定位表的结构之前需要了解两个问题:第一,对一条指令进行重定位需要
哪些信息;第二,这些信息中哪些应该被保存在重定位表中。下面举例来说明这两个问题。
作为例子,现将 13.4.2 节中的那段代码搬回来:
:00400FFC 0000 ;dwVar 变量
:00401000 55 push ebp
:00401001 8BEC mov ebp, esp
:00401003 83C4FC add esp, FFFFFFFC
:00401006 A1FC0F4000 mov eax, dword ptr ;mov eax,dwVar
:0040100B 8B45FC mov eax, dword ptr ;mov eax,@dwLocal
:0040100E 8B4508 mov eax, dword ptr ;mov eax,_dwParam
:00401011 C9 leave
:00401012 C20400 ret 0004
:00401015 68D2040000 push 000004D2
:0040101A E8E1FFFFFF call 00401000;invoke Proc1,1234
其中地址为 00401006h 处的 mov eax,dword ptr 就是一句需要重定位的指令,
当整个程序的起始地址位于 00400000h 处的时候,这句代码是正确的,假如将它移到
00500000h 处的时候,这句指令必须变成 mov eax,dword ptr 才是正确的。这就意
味着它需要重定位。
让我们看看需要改变的是什么,重定位前的指令机器码是 A1 FC 0F 40 00,而重定位
后将是 A1 FC 0F 50 00,也就是说 00401007h 开始的双字 00400ffch 变成了 00500ffch,改
变的正是起始地址的差值(00500000h-00400000h)=00100000h。
所以,重定位的算法可以描述为:将直接寻址指令中的双字地址加上模块实际装入地址
与模块建议装入地址之差。为了进行这个运算,需要有 3 个数据,首先是需要修正的机器码
地址;其次是模块的建议装入地址;最后是模块的实际装入地址。这就是第一个问题的答案。
在这 3 个数据中,模块的建议装入地址已经在 PE 文件头中定义了,而模块的实际装
入地址是 Windows 装载器确定的,到装载文件的时候自然会知道,所以第二个问题的答案
很简单,那就是应该被保存在重定位表中的仅仅是需要修正的代码的地址。
事实上正是如此,PE 文件的重定位表中保存的就是一大堆需要修正的代码的地址。


我们修复重定位表可以有哪些思路呢?
可以发挥一下脑洞想想,比如找到壳模拟重定位的相关代码,Patch得到一份完整的重定位表。再往前推,还有一种方法是让DLL加载到不同的基址,然后分别DUMP出来,比较一下就能找到要修复的地址。

以UPX为例,演示一下第一种方法。第二种方法就没什么好讲的了({:5_184:})

工具有OllyDbg,内存管理插件,ILLY插件,UPX壳,Reloc Fix(主题需要审核,我发帖的时候还没审核通过,点开我个人资料在主题里面找一下吧)
**** Hidden Message *****

Shark恒 发表于 2018-2-17 17:08

沉舟童鞋,这个悬赏链接是什么,如果方便的话,写在主题前面,方便大家学习。

syzh802618 发表于 2018-2-17 21:30

感谢楼主分享!

YAN742347999 发表于 2018-2-17 21:36

感谢楼主分享!

zaq123456 发表于 2018-2-17 22:06

感谢楼主分享!

孙悟空大仙 发表于 2018-2-17 22:38

感谢楼主的教程带走去学习一下

moont 发表于 2018-2-20 19:53

学习学洗dll

谁伴我闯荡 发表于 2018-2-20 20:06

来看看是什么东西

topcookie 发表于 2018-2-20 20:59

对dll很懵逼

569121786 发表于 2018-2-20 21:15

感谢楼主分享!
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 探讨DLL脱壳