| 
 | 
			
 
目前,我对DLL的脱壳的了解也不多,相信有些地方会和对EXE的脱壳大致相同。现在我知道的主要不同是必须要在DLL的空间开始跟踪。否则从EXE开始跟踪,那还不把人累死。另外 ProcDump 和 PEditor 之类的工具好象还无法自动修复DLL的import table。唉,又是手动,什么时候有个DLL的脱壳机出现呢? ou,别看我!我编程的水平三流,写不出那些好东东。  
 
样例文件:    dlcsp32.dll    (DynaDoc Reader v3.01所带动态链接库文件,这个程序就是看.wdl电子图书文件的那个)  
加壳方式:    PECompact v1.41b1加壳  
检测工具:    和尚头上的虱子-----明摆着的嘛  
调试工具:    SoftICE v4.05,PEditor v1.5,Hex WorkShop 2.10  
目标:        脱壳  
作者:        ljttt  
写作日期:    2000-08-16  
 
1、首先当然要分析基本信息了。用PEditor打开动态链接库文件,得到如下信息  
Entry Point:    00024000  
Image Base:    10000000  
Size of Image:    00029000  
 
Section        Virtual Size    Virtual Offset  
pec1        00020000    00001000  
pec2        00003000    00021000  
.pec        00004000    00024000  
.rsrc        00001000    00028000  
 
再来看看import table和export table的情况,export table没有改变。问我怎么知道?有未加壳的DLL嘛。西西。  
 
2、现在我们要想办法在动态链接库的入口点 10024000 处中断,当然方法很多了,这里介绍两种办法。  
 
①、第一种方法  
一、首先,用PEditor打开DLL文件,然后单击 FLC 按钮(这个功能是帮你计算Virtual Address转换为 Offset的)  
输入 10024000 ,单击 DO! 按钮,得到 Offset[hex] 为 B000。  
二、然后,用Hex WorkShop打开DLL文件,定位到 B000,记下此处字节的值 EB。  
三、然后,用PEditor打开Dlview32.EXE(主程序文件)。单击 break'n enter 按钮(这个功能是帮你在程序的某个地址空间设下int 3中断),在 Virtual Address 中输入 10024000。  
四、Ctrl-D中断进入SoftICE,设断点 bpint 3。  
五、F5回到Windows,单击break'n enter窗口中 RUN 按钮。这样我们将在动态链接库的第一条指令处中断。  
 
②、第二种方法  
一、同第一种方法  
二、同第一种方法  
三、然后,用Hex WorkShop把 B000 处的字节 EB 改为 CC。  
四、同第一种方法  
五、运行程序。这样我们也可以在动态链接库的第一条指令处中断。  
 
这里,我用第一种方法。我们现在中断在第一条指令处。但是还不能继续跟踪。要把 CC (即int 3指令)改为原来程序的代码。  
 
(简称说明: EP: Entry Point,    OEP: Orginal Entry Point,    RVA: Relative Virtual Address )  
 
代码窗口显示如下:  
015F:10024000  CC                  INT      3            <---中断在此,这就是我们要改回的字节  
015F:10024001  06                  PUSH      ES  
015F:10024002  6810DE0000          PUSH      0000DE10        <---有点奇怪哦? DE10 不是我们要找的 OEP 吗 ,怎么在这里就出现了?难道不用找了?  
015F:10024007  C3                  RET  
015F:10024008  9C                  PUSHFD  
015F:10024009  60                  PUSHAD  
015F:1002400A  E802000000          CALL      10024011  
015F:1002400F  33C0                XOR      EAX,EAX  
015F:10024011  8BC4                MOV      EAX,ESP  
015F:10024013  83C004              ADD      EAX,04  
 
下指令  
eb eip EB        (修改当然 IP 所在地址的字节为 EB)  
 
好,代码显示成原来的模样了。  
015F:10024000  EB06                JMP      10024008        <---代码复原后  
015F:10024002  6810DE0000          PUSH      0000DE10        <---奇怪?  
015F:10024007  C3                  RET  
==> 10024008  9C                  PUSHFD  
015F:10024009  60                  PUSHAD  
015F:1002400A  E802000000          CALL      10024011  
015F:1002400F  33C0                XOR      EAX,EAX  
015F:10024011  8BC4                MOV      EAX,ESP  
015F:10024013  83C004              ADD      EAX,04  
 
3、这样代码就复原了。不过你发现一点问题没有? DLL的 OEP 怎么会在这里就出现了? 好奇怪?!先不管它,设个断点留着看看。设断点  
bpx 10024002  
 
4、设断点  
bpx loadlibrarya do "dd esp->4"        (老一套了)  
 
5、按 F5 继续,又中断在我们新设的断点。我们来看一下数据窗口  
 
显示如下:  
015F:1002041A 4E52454B  32334C45  6C6C642E  00000000      KERNEL32.dll....  
015F:1002042A 656C6552  44657361  00000043  44746547      ReleaseDC...GetD  
015F:1002043A 53550043  32335245  6C6C642E  00000000      C.USER32.dll....  
015F:1002044A 656C6544  624F6574  7463656A  00000000      DeleteObject....  
 
哦,这里看来就是我们要找的import table的一部分了。  
 
6、继续搜索,下指令  
s 30:10000000 l ffffffff 1A,04,02,00    (这里就不多说了,和《脱壳----对用Petite2.2加壳的程序进行手动脱壳的一点分析》一文中所说的情况相同,所以搜索方法也一样了。以后几步同理)  
搜索结果显示如下:  
Pattern found at 0030:1002000C (0002000C)     
 
7、下指令  
dd 1002000C-C  
 
数据窗口显示如下:  
0030:10020000 000200DC  00000000  00000000  0002041A      ................  
0030:10020010 00020270  000201D8  00000000  00000000      p...............  
0030:10020020 0002043C  0002036C  00020050  00000000      <...l...P.......  
 
8、这样到了import table的起始处了。现在开始保存import table。  
/dump 10020000 1000 c:\temp\dump.bin    (1000 的长度是根据 00 字节的位置来确定的)  
 
9、下指令 BD 2 禁止 bpx loadlibrarya 中断,继续跟踪。到如下  
 
015F:10025335  51                  PUSH      ECX  
015F:10025336  53                  PUSH      EBX  
015F:10025337  6A00                PUSH      00  
015F:10025339  FFD0                CALL      EAX  
015F:1002533B  FFA55E854000        JMP      [EBP+0040855E]  
015F:10025341  8BB54E854000        MOV      ESI,[EBP+0040854E]  
015F:10025347  8BBD52854000        MOV      EDI,[EBP+00408552]  
015F:1002534D  E82E0C0000          CALL      10025F80  
015F:10025352  61                  POPAD  
015F:10025353  9D                  POPFD  
015F:10025354  50                  PUSH      EAX  
015F:10025355  6810DE0010          PUSH      1000DE10            <--- 1000DE10 - 10000000 = DE10 就是 OEP 了  
015F:1002535A  C20400              RET      0004            <--- 这里就要到回到真正的入口处了,在此停下。保存映象  
 
10、记下 OEP 为 DE10。下指令保存整个DLL内存映象。  
/dump 10000000 29000 c:\temp\dump.dll  
 
11、按 F5 继续,没有中断在我们在步骤 3 处设下中断。关闭主程序时,中断。正好在此处中断。  
显示如下:  
015F:10024000  EB06                JMP      10024008  
015F:10024002  6810DE0000          PUSH      1000DE10        <---开始中断时的 0000DE10 这时已经变成 1000DE10 了。  
015F:10024007  C3                  RET  
==> 10024008  9C                  PUSHFD  
015F:10024009  60                  PUSHAD  
015F:1002400A  E802000000          CALL      10024011  
015F:1002400F  33C0                XOR      EAX,EAX  
015F:10024011  8BC4                MOV      EAX,ESP  
015F:10024013  83C004              ADD      EAX,04  
 
看来此处的几条指令的用处PECompact是别有用意安排的,可能是为了方便去卸载动态链接库吧。  
 
12、开始修补工作。用PEditor打开dump.dll文件,选择sections,右键打开菜单,选择dumpfixer。OK!一次完成所有Section的RVA、Size的转换工作。再修改Entry Point为 DE10,单击apply changes保存,选择directory,修改其中的Import Table的RVA为 20000,Size为1000。单击保存。  
 
13、用Hex WorkShop打开dump.dll和dump.bin,定位dump.dll位置到 20000,选择 1000 个字节。删除。  
选择dump.bin的 1000 个字节,复制到dump.dll中。保存。  
 
14、测试。OK,收工。  
 
 
 |   
 
评分
- 
|  参与人数 30 | HB +47 | 
THX +20 | 
收起
理由
 | 
 
| 
猫妖的故事
 |  | 
 + 1 | 
 | 
 
| 
动动
 |  + 1 | 
 | 
 | 
 
| 
lies
 |  + 1 | 
 | 
 | 
 
| 
花盗睡鼠
 |  + 2 | 
 + 1 | 
[吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守! | 
 
| 
24567
 |  | 
 + 1 | 
 | 
 
| 
Soul1999
 |  + 1 | 
 | 
 | 
 
| 
WolfKing
 |  | 
 + 1 | 
[吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少! | 
 
| 
冷亦飞
 |  + 1 | 
 | 
 | 
 
| 
zxjzzh
 |  | 
 + 1 | 
[吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少! | 
 
| 
zyyujq
 |  + 1 | 
 | 
 | 
 
| 
三月十六
 |  + 1 | 
 | 
 | 
 
| 
车太震
 |  + 1 | 
 + 1 | 
[吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩! | 
 
| 
3429
 |  + 1 | 
 | 
 | 
 
| 
夕阳武士
 |  + 2 | 
 + 1 | 
[吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守! | 
 
| 
jaunic
 |  | 
 + 1 | 
 | 
 
| 
boot
 |  | 
 + 1 | 
[吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意! | 
 
| 
成丰羽
 |  + 1 | 
 | 
[吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意! | 
 
| 
消逝的过去
 |  | 
 + 1 | 
[吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少! | 
 
| 
hnymsh
 |  + 2 | 
 | 
 | 
 
| 
vigers
 |  + 2 | 
 + 1 | 
评分=感恩!简单却充满爱!感谢您的作品! | 
 
| 
usertest
 |  + 1 | 
 | 
评分=感恩!简单却充满爱!感谢您的作品! | 
 
| 
DaoGod
 |  + 1 | 
 + 1 | 
★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!! | 
 
| 
岁月神偷
 |  + 3 | 
 + 1 | 
评分=感恩!简单却充满爱!感谢您的作品! | 
 
| 
Syer
 |  + 4 | 
 + 1 | 
★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!! | 
 
| 
心心相印
 |  + 1 | 
 + 1 | 
好人有好报!你的热心我永远不忘!谢谢! | 
 
| 
逍遥枷锁
 |  + 4 | 
 + 1 | 
好人有好报!你的热心我永远不忘!谢谢! | 
 
| 
彩虹
 |  + 5 | 
 + 1 | 
★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!! | 
 
| 
Administrator
 |  + 1 | 
 + 1 | 
★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!! | 
 
| 
China小二
 |  + 5 | 
 + 1 | 
评分=感恩!简单却充满爱!感谢您的作品! | 
 
| 
Shark恒
 |  + 5 | 
 + 1 | 
★★★★★ 热心人,佛祖保佑你事事顺利 ,财源滚滚!!! | 
 
 
查看全部评分
 
 
 
 
 
 |