对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

智能推荐

sig值怎么计算_T检验、sig.值-程序员宅基地

文章浏览阅读4.8k次。你的分析结果有T值,有sig值,说明你是在进行平均值的比较。也就是你在比较两组数据之间的平均值有没有差异。从具有t值来看,你是在进行T检验。T检验是平均值的比较方法。T检验分为三种方法:1.单一样本t检验(One-samplettest),是用来比较一组数据的平均值和一个数值有无差异。例如,你选取了5个人,测定了他们的身高,要看这五个人的身高平均值是否高于、低于还是等于1.70m,就需要用这个..._sig值计算公式

新手java五子棋完整代码判断落子落在线上_Java初学者,编写小游戏五子棋的问题?...-程序员宅基地

文章浏览阅读362次。首先你需要掌握GUI编程,事件处理,已经监听器,你就掌握Swing的知识就好了Swing框架,JFrame,JPanel,鼠标、键盘监听事件Java基础,面向对象,异常处理,集合,IO流网络编程,Socket通信线程知识,Java逻辑基础上述的技术点估计需要将JavaSE这块学完才能掌握,下面进入正题。这里呢,我把几个常见的小游戏列出来,如下图:象棋对战,带聊天五子棋对战,带聊天打字游戏对战音乐播..._五子棋程序判断落子位置

杭电2041 超级楼梯_超级楼梯 (杭电2041)比赛题目 题目统计 全部提交时间限制:c/c++ 1000ms,其他语言-程序员宅基地

文章浏览阅读322次,点赞6次,收藏8次。【代码】杭电2041 超级楼梯。_超级楼梯 (杭电2041)比赛题目 题目统计 全部提交时间限制:c/c++ 1000ms,其他语言

关于构建数据仓库的几个问题_从需求出发建设数仓会有什么问题-程序员宅基地

文章浏览阅读1.6k次。写在前面数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。近年来,随着大数据的应用不断深入,构建企业级数据仓库成为了企业进行精细化运营的一种趋势。从管理者的视角来看,数据仓库是赋能业务并辅助决策的一种工具,从开发者的视角来看,数据仓库是一堆数据模型的集合。数仓开发是一个系_从需求出发建设数仓会有什么问题

手写B+树-程序员宅基地

文章浏览阅读3.2k次。插入关键字 40 ,按照第 2 种情况将结点分裂,并将关键字 37 上移到父结点,发现父结点 [15、37、44、59] 包含的关键字的个数大于 M ,所以将结点 [15、37、44、59] 分裂为两个结点 [15、37] 和结点 [44、59] ,并将关键字 37 上移到父结点中 [37、59、97] . 父结点包含关键字个数没有超过 M ,插入结束。比如插入关键字 12 ,插入关键字所在的结点的 [10,15] 包含两个关键字,小于 M ,则直接插入关键字 12。B+树插入删除时间复杂度为0(1)_手写b+树

基于SSM企业人力资源管理系统的设计与实现 |计算机毕业设计|Java毕业设计|课程设计|Python毕设|小程序|人力资源管理|人事管理系统|_基于ssm的企业人力资源管理系统的设计与实现-程序员宅基地

文章浏览阅读82次。在答辩过程中,要充分展示对项目的深入研究和对技术的理解,结合实际案例和数据,清晰阐述项目的创新、可行性和应用价值,回答评委问题时要有条理、准确表达自己的观点。管理员:首页、用户管理、管理员、员工、更多管理、部门管理、 请假申请、人事考勤、公司绩效、奖惩信息、通知公告、员工工资等。员工:首页、更多管理、请假申请、人事考勤、公司绩效、奖惩信息、通知公告、员工工资等。该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等。前端技术:JavaScript、VUE.js(2.X)、css3。_基于ssm的企业人力资源管理系统的设计与实现

随便推点

图解通信原理与案例分析-17:2G GPRS通用分组无线业务详解_2g slot-程序员宅基地

文章浏览阅读4.7k次。先占个空,以后再详细拆解主要关注与GSM的区别,特别是GRPS是如何通过增加信道和分组交换系统支持数据传输,如何通过新的调制解调技术,增加数据传输的速率的!1. GSM是全球移动通讯系统(Global System for Mobile Communications)的简称2. GPRS是通用分组无线业务(General Packet Radio Service)的简称3. GPRS是在GSM系统基础上发展起来的分组数据承载和传输业务。4. GPRS与GSM......_2g slot

【图像拼接】论文精读:Natural Image Stitching Using Depth Maps-程序员宅基地

文章浏览阅读10w+次。图像拼接系列相关论文精读Seam Carving for Content-Aware Image ResizingAs-Rigid-As-Possible Shape ManipulationAdaptive As-Natural-As-Possible Image StitchingShape-Preserving Half-Projective Warps for Image StitchingSeam-Driven Image StitchingParallax-tolerant Ima_natural image stitching using depth maps

【Java基础知识 11】java泛型方法的定义和使用-程序员宅基地

文章浏览阅读1.6w次,点赞131次,收藏52次。一、基本介绍Java泛型是J2 SE1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。二、提出背景Java集合(Collection)中元素的类型是多种多样的。例如,有些集合中的元素是Byte类型的,而有些则可能是String类型的,等等。Java允许程序员构建一个元素类型为Object的Collection,其中的元素可以是任何类型在Java S._java基础

vue中使用echarts实现省市地图绘制,根据数据在地图上显示柱状图信息,增加涟漪特效动画效果_vue 市区地图+经纬度自定义显示弹窗详情-程序员宅基地

文章浏览阅读1.7k次,点赞26次,收藏14次。vue中使用echarts实现省市地图绘制,根据数据在地图上显示柱状图信息;增加涟漪特效动画。本文以吉林省地图为例,来实现吉林省市的地图的绘制。根据数据在地图上显示柱状图信息;增加涟漪特效动画。你也可以显示中国地图或其他身份地图。原理是一样的哦。主要是通过geo地理坐标系组件实现地图绘制。柱状图是利用3个样式(顶部椭圆、中部矩形、底部椭圆)层叠实现的。_vue 市区地图+经纬度自定义显示弹窗详情

网络安全等级保护2.0自查表 | 技术部分_网络安全等级保护自查表-程序员宅基地

文章浏览阅读1.2k次,点赞46次,收藏20次。网络安全等级保护2.0自查表 | 技术部分_网络安全等级保护自查表

已知一个iis漏洞可以让php解释任意的给定文件-程序员宅基地

文章浏览阅读64次。已知一个iis漏洞可以让php解释任意的给定文件。挑战:怎么执行任意命令?应用环境:防火墙配置不准许对外连接。要求:不能要求上传文件。总算看到一次答案了:http://www.inbreak.net/kxlzxtest/phpiis.txtC:\Windows\System32\LogFiles\w3svcXXXX让php解析当天访问日志,然后用get请求提交user agent为 User-Ag..._php iis 漏洞