对PECompact加壳的DLL脱壳的一点分析_pecompact dll脱壳-程序员宅基地

技术标签: image  c  import  dll  hex  table  

目前,我对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,收工。
 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fxpopboy/article/details/1467748

智能推荐

http隧道 java_使用java语言实现http隧道技术-程序员宅基地

文章浏览阅读119次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼/***Getaparametervalue**@paramkeyString*@paramdefString*@returnString*/publicStringgetParameter(Stringkey,Stringdef){returnisStandalone?System.getProperty(ke..._java http隧道

Keepalived高可用+邮件告警_keepalived sendmail-程序员宅基地

文章浏览阅读913次。IP主机名备注192.168.117.14keepalived-master主节点192.168.117.15keepalived-slaver备节点192.168.117.100VIP1.主备节点均安装keepalived# yum install -y keepalived httpd2.主备节点均修改keepalived日志存放路径..._keepalived sendmail

SPFILE 错误导致数据库无法启动(ORA-01565)_ora01565 ora27046-程序员宅基地

文章浏览阅读469次。--==========================================--SPFILE错误导致数据库无法启动(ORA-01565)--========================================== SPFILE错误导致数据库无法启动 SQL> startup ORA-01078: failurein proce_ora01565 ora27046

功能测试基础知识(1)-程序员宅基地

文章浏览阅读6.1k次,点赞2次,收藏54次。功能测试基础知识总结_功能测试

postgresql 中文排序_pg中文排序-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏2次。pg 中文首字母排序_pg中文排序

[Mysql] CONVERT函数_mysql convert-程序员宅基地

文章浏览阅读3.1w次,点赞23次,收藏109次。本文主要讲解CONVERT函数_mysql convert

随便推点

HTML5与微信开发(2)-视频播放事件及API属性_微信开发者工具视频快进-程序员宅基地

文章浏览阅读8.6k次,点赞2次,收藏2次。HTML5 的视频播放事件想必大家已经期待很久了吧,在HTML4.1、4.0之前我们如果在网页上播放视频无外乎两种方法: 第一种:安装FLASH插件或者微软发布的插件 第二种:在本地安装播放器,在线播放组件之类的 因为并不是所有的浏览器都安装了FLASH插件,就算安装也不一定所有的都能安装成功。像苹果系统就是默认禁用FLASH的,安卓虽然一开始的时候支持FLASH,但是在安卓4.0以后也开始不_微信开发者工具视频快进

JedisConnectionException Connection Reset_jedisconnectionexception: java.net.socketexception-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏4次。在使用redis的过程常见错误总结1.JedisConnectionException Connection Reset参考这边文章:Connection reset原因分析和解决方案https://blog.csdn.net/cwclw/article/details/527971311.1问题描述Exception in thread "main" redis.clients...._jedisconnectionexception: java.net.socketexception: connection reset

Lua5.3版GC机制理解_lua5.3 gc-程序员宅基地

文章浏览阅读8.3k次,点赞8次,收藏42次。目录1.Lua垃圾回收算法原理简述2.Lua垃圾回收中的三种颜色3.Lua垃圾回收详细过程4.步骤源码详解4.1新建对象阶段4.2触发条件4.3 GC函数状态机4.4标记阶段4.5清除阶段5.总结参考资料lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁,目前大多数有关这个方面的文章都还是基于lua5.1版本,有一定的滞后性。因此本文通过参考当前..._lua5.3 gc

手机能打开的表白代码_能远程打开,各种手机电脑进行监控操作,最新黑科技...-程序员宅基地

文章浏览阅读511次。最近家中的潮人,老妈闲着没事干,开始学玩电脑,引起他的各种好奇心。如看看新闻,上上微信或做做其他的事情。但意料之中的是电脑上会莫名出现各种问题?不翼而飞的图标?照片又不见了?文件被删了,卡机或者黑屏,无声音了,等等问题。常常让她束手无策,求助于我,可惜在电话中说不清,往往只能苦等我回家后才能解决,那种开心乐趣一下子消失了。想想,这样也不是办法啊, 于是,我潜心寻找了两款优秀的远程控制软件。两款软件...

成功Ubuntu18.04 ROS melodic安装Cartograhper+Ceres1.13.0,以及错误总结_ros18.04 安装ca-程序员宅基地

文章浏览阅读1.8k次。二.初始化工作空间三.设置下载地址四.下载功能包此处可能会报错,请看:rosdep update遇到ERROR: error loading sources list: The read operation timed out问题_DD᭄ꦿng的博客-程序员宅基地接下来一次安装所有功能包,注意对应ROS版本 五.编译功能包isolated:单独编译各个功能包,每个功能包之间不产生依赖。编译过程时间比较长,可能需要几分钟时间。此处可能会报错:缺少absl依赖包_ros18.04 安装ca

Harbor2.2.1配置(trivy扫描器、镜像签名)_init error: db error: failed to download vulnerabi-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏7次。Haobor2.2.1配置(trivy扫描器、镜像签名)docker-compose下载https://github.com/docker/compose/releases安装cp docker-compose /usr/local/binchmod +x /usr/local/bin/docker-composeharbor下载https://github.com/goharbor/harbor/releases解压tar xf xxx.tgx配置harbor根下建立:mkd_init error: db error: failed to download vulnerability db: database download

推荐文章

热门文章

相关标签