Hmily 发表于 2008-4-14 00:43

TheMide加壳Dll文件的简单脱壳流程

标 题: 【半原创-照本宣科】TheMide加壳Dll文件的简单脱壳流程
作 者: duenyu
时 间: 2008-04-05,20:07
链 接: http://bbs.pediy.com/showthread.php?t=62580

【文章作者】: duenyu
【软件名称】: test.dll
【加壳方式】: Themida|WinLicense V1.9.2.0 -> Oreans Technologies *
【编写语言】: Microsoft Visual C++ 7.0
【使用工具】: The0DBG/HideToolz,LordPE,ImportREC_fix,peid,WinHex,
Dll_LoadEx,ReloX
【操作平台】: WinXP_SP2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
-------------------------------------------------------------------------
【详细过程】

① 检查版本
http://bbs.pediy.com/attachment.php?attachmentid=12986&d=1207395862

② 用OD载入test.dll,停在这里↓。
※用HideToolz隐藏OD后,再载入。
http://bbs.pediy.com/attachment.php?attachmentid=12987&d=1207396004

③ 打开ODBGScript的ScriptWindow和LogWindow。

④ Load Themida&WinLicenScript_1.91+.txt,然后运行脚本。停在这里↓。
http://bbs.pediy.com/attachment.php?attachmentid=12988&d=1207396140

⑤ 这个时候脚本已经完成Dump了,文件存放在dll所在的目录中。

⑥ 用LordPE打开来看看,输出表没有问题,输入表不全,重定向表有问题,资源没问题。
http://bbs.pediy.com/attachment.php?attachmentid=12989&d=1207396200

⑦ 修复输入表,看Script的Log Window
http://bbs.pediy.com/attachment.php?attachmentid=12996&d=1207396851
iattop = 3D8B5000,在OD的数据窗口Ctrl+G到3D8B5000,转换成Address如下图,查到IAT的范围从3D8B5000到3D8B51EC。
http://bbs.pediy.com/attachment.php?attachmentid=12990&d=1207396287
算出大小为1EC。然后用ImportREC_fix修复输入表。
打开loaddll进程,pick dll找到test.dll如下图
http://bbs.pediy.com/attachment.php?attachmentid=12991&d=1207396360
修改OEP为000093A4,然后点IAT AutoSearch按钮。

接下来点GetImports取得输入表,全部正常。
最后,点Fix Dump选择dump出来的dll文件进行修复。
※ 在OD中用Dump插件Dump的话,会得到输入表正常的dll。
http://bbs.pediy.com/attachment.php?attachmentid=12992&d=1207396411

⑧ 修复重定向表
将没有脱壳的test.dll文件copy两份,分别叫做test1.dll和test2.dll,然后用DLLLoadEx将两个DLL载入。
http://bbs.pediy.com/attachment.php?attachmentid=12993&d=1207396480
然后用lordPE将这两个dll文件dump出来保存成1.dll和2.dll。
用ReloX打开1.dll和2.dll并在对应的行后面输入test1.dll和test2.dll的ImageBase的值,点击Compare后点击Fix PE Module修复dump的dll文件。如图
http://bbs.pediy.com/attachment.php?attachmentid=12994&d=1207396514
用LordPE打开修复后的foepdump__.dll文件,看到输入输出表,重定向表都没问题了。用PEiD看一下,壳已经脱掉。
http://bbs.pediy.com/attachment.php?attachmentid=12995&d=1207396728

⑨ 优化

写这文章之前,我将脱壳的DLL文件各个部分完全分开,用二进制文件的形势保存起来,
然后重新手动组装并新建了输入输出表和资源,对PE的结构稍微熟悉些了,不过手工重建重定向表没有成功。
所以这里只说一下用工具的简单优化。
用lordPE打开foepdump__.dll,打开Sections,可以看到有很多Section。每一次修
复几乎都重新建了一个Section。
http://bbs.pediy.com/attachment.php?attachmentid=12997&d=1207396904

其中,
.text 是存放代码的
.rsrc 是存放资源的
.data0和.data1是自定义数据。
.idata是刚刚dump出来时候的不好用的输入表。
.mackt是Import REC修复输入表新建的
.reloc是Relox修复重定向表新建的
.themide我认为是壳的代码和数据。(第一次的时候我将它删掉了,结果输出表和
重定位表出错了。后来察看VS发现输出表在这个里面。重定位表有几条数据在这里面。)

好了,开始优化,首先把.idata可以不用犹豫的删除掉了。
先RebuildPE一下foepdump__.dll。然后用WinHex打开foepdump__.dll。
把从160A6E开始的B77个字节的内容copy出来。然后在.themide的最后1000字节
清零,将copy出来的exportTable数据copy到0020C000,保存。用lordPE打开dll文件,将.themide
的大小改小1000,修改.mackt的Voffset为0020C000,Vsize到2000。
然后修改exportTable的rva为0020C000,Size不变。接下来用WinHex里面打开Dll文件修改0020C000部分的输出表地址的Name RVA,Export AddressTable RVA,Name Pointer RVA和Ordinal Table RVA。可参照PE文件头结构。存盘后用lordPE打开dll文件,在导出表处可以看到,dll文件名等可以显示,但里面的函数名都不对。
对应WinHex中看到的函数名称起始地址修改LordPE中的导出表的每一项,我修改了20多分钟,晕。
将重定位表中涉及.themide中数据的far address地址减去ImageBase得到偏移量,并把该地址的数据copy出来,放到.data1的后面,然后修改这几项的重定位表偏移地址。这个方法比较笨,不知道还有没有其他办法。正在寻找中。
然后删除themide,重新编译dll文件。文件从2.06M变成了890K。重新loaddll正常。
⑩ 最后

这篇文章涉及技术很少,主要是写一下流程,和一些工具的基本适用,上传图片尺寸有限制,没有上传太多图片,比较遗憾。
感觉出了重定向的问题,DLL脱壳比exe稍微容易一些。可能是加壳的时候重视程度不如exe。不知道DLL文件有没有偷代码的情况,我对照了几个VC7.0写的DLL也是有特征的,这个DLL没有。
应朋友需要脱这个文件的壳,原来从来没接触过脱壳,只是进行了一个月的逆向,所以花了1周时间才搞定。但很多细节并不了解,如果有错误的地方,请指教。
感觉脱壳需要对PE文件结构,各种语言的编码特征,壳的特性需要相当程度的了解,才能游刃有余。大家努力吧。
最后贴几句Themide的典型代码,再恶心一下自己。。。。
mov eax,0
pushad
or eax,eax
je short 0047E086
call 0047E023

Fate 发表于 2008-4-14 00:48

图片都没有链接过来..你再重新上传吧

Squn 发表于 2008-4-14 03:04

看不到圖片 一張都看不到~

wolaileo 发表于 2008-4-14 03:22

脚本跑不起来,咋办呢?

跑起来的话几秒后就弹出软件的注册NAG窗口。。。。

kissy 发表于 2008-4-14 09:15

这篇文章看点在脱壳后的优化上
TMD壳脱壳后文件巨大无比
学习了

fairy50820 发表于 2008-4-18 15:55

来了,今天又起来晚了

tidus_13 发表于 2008-4-25 22:00

老大图片看不到! 改一下

阿顺 发表于 2013-12-16 20:34

kGe 发表于 2013-12-16 21:15

上传个样本玩下
页: [1]
查看完整版本: TheMide加壳Dll文件的简单脱壳流程