前言

结合脱dll壳的基本思路,对看雪加密解密里的一个ASPack壳保护的dll进行脱壳分析。

脱壳详细过程

寻找程序的OEP

先将目标DLL拖入OD,来到壳的入口处。

然后利用堆栈平衡原理在pushad后,对栈顶下硬件访问断点。

之后我们直接运行程序,当程序popad后会被断下,观察得出OEP的RVA为0x1240。

找到壳的重定位代码

我们在来到程序真正的入口点后可以看到一些会被重定位的代码,我们选择最近的一个会进行重定位的代码记住其RVA。

本例子中我们选的是RVA为0x1253的代码。

然后我们重新加载dll,我们先对刚刚记住的那个RVA下内存写入断点,程序会先断在壳代码解压区块处我们需要在壳代码将所有的区段解压缩后对刚刚记住的那个RVA再下内存访问断点,然后程序会断在壳的重定位代码处。

跳过重定位代码并dump程序

我们只需要将修正重定位数据的代码nop去就可以让重定位代码无法发挥作用。



nop去重定位代码后我们继续运行程序,程序会停在我们寻找OEP时设置的断点处。然后我们就可以用LordPE来dump文件了,将dump的文件命名为ASP.dll



重建输入表

在重建输入表前我们需要知道原程序IAT表的位置,我们可以在OD中Alt + M查看内存然后我们在主模块可以看到各个区块,一般IAT表都是在.rdata区块处。我们在此处右击然后选择在cpu数据窗口查看,然后将cpu数据窗口的显示形式调为地址。我们可以看到在区块一开始就是IAT表。此IAT表的RVA为0x7000。

在查找IAT表示还要注意,不要将原程序的IAT表与壳的IAT表搞混。在区块.aspack处也存在一个IAT,这个IAT是壳代码的。

获取IAT的RVA后我们可以打开ImportRE工具重建输入表,我们在OEP处填写1240,在IAT 的RVA处填写7000,大小尽量填大点。然后点击获取输入表。



获取输入表后我们发现有好多无效的这是因为我们IAT的大小填的过大,我们只需点击显示无效函数,然后右击剪切/删除指针数据即可去除无效数据。





接着我们点击修复转存文件,并选择我们刚刚转存的ASP.dll即可生成名为ASP_.dll的文件。

修复重定位数据

如果把刚刚我们修复了输入表的dll加载到OD中我们可以看到需要重定位的数据还是按照基地址为0x400000的数据,而此时的基地址为0x220000其数据并没有被修正,这是因为windows加载器在加载的时候并没有找到重定位表,所以我们需要修复重定位表。

我们重新加载加壳的dll,来到我们刚刚找到的壳的重定位代码处,分析程序可得0x22d247地址处edi+ebx即为对应需要重定位的数据的地址。我们需要在此处打补丁获取所有需要重定位的数据的RVA地址。我们在0x22d598处写补丁程序,此处跳转到0x22d598处。

然后在0x22d598处打补丁程序,将获得的重定位数据地址存在0x229000处,0x22d600为其指针。



运行程序程序停在OEP跳转处,我们在数据窗口处可以看到重定位数据的RVA地址。(每一个dword是一个地址)

将这些二进制数据复制后用WinHex保存为bin文件。然后用拖入重定位重建工具ReloREC,然后选在重定位表存在RVA:9000处。点击Fix Dump选择我们重建了输入表的名为ASP_.dll的文件,其会生成一个名为ASP__.dll的文件。



这时在用OD加载此文件就会发现需要重定位数据处的数据已被修正。

优化PE文件

①将在壳空间中的资源数据都放到一个资源区段中,用工具DT_ResFix.exe选择对应的dll文件,然后直接重构资源。

②将壳代码的区段删除,利用pe编辑工具。

③查看pe文件头的一些数据是否有错误。(一般我们在前面重构输入表和重定位表的时候,相关工具都已经修改过了)

④在重建输入表是可以将输入表放在一个已存在的区块处,这里我们是新建了一个区块。

总结

脱dll壳的思路大致就是这样,当然各个步骤的方法不唯一,像寻找oep就有很多方法。需要根据对应的壳,灵活使用各种方法。

脱壳入门----脱ASPack壳保护的DLL的更多相关文章

  1. ASPack壳脱壳实验

    实验目的 1.学会使用相关软件工具,手动脱ASPack壳. 2.不要用PEiD查入口,单步跟踪,提高手动找入口能力. 实验内容 手动对文件"ASPack 2.12 - Alexey Solo ...

  2. 简单脱壳教程笔记(2)---手脱UPX壳(1)

    本笔记是针对ximo早期发的脱壳基础视频教程,整理的笔记. ximo早期发的脱壳基础视频教程 下载地址如下: http://down.52pojie.cn/%E5%90%BE%E7%88%B1%E7% ...

  3. <逆向学习第二天>如何手动脱UPX、Aspack壳

    UPS.AsPack压缩壳介绍: UPX .AsPack是一款先进的可执行程序文件压缩器.压缩过的可执行文件体积缩小50%-70% ,这样减少了磁盘占用空间.网络上传下载的时间和其它分布以及存储费用. ...

  4. 手脱Aspack变形壳1

    1.载入PEID Aspack v2.12 -> www.aspack.com 2.载入OD,不管是看查壳信息还是看入口特征都跟我上一次发的一个手脱Aspack v2.12的帖子相同http:/ ...

  5. 【个人笔记】ximo早期发的脱壳教程——手脱UPX壳

    [个人笔记]ximo早期发的脱壳教程--手脱UPX壳   壳分为两种:压缩壳和加密壳,UPX是一种很简单的压缩壳.   手脱UPX壳: 工具:ExeinfoPE.OD 对象:rmvbfix 方法1:单 ...

  6. 手脱ASPack v2.12变形壳2

    1.PEID载入 ASPack v2.12 2.载入OD,跟之前帖子的入口特征相同,都是一个pushad,但是请不要怀疑这是同一个壳,绝对不是,pushad下一行ESP定律下硬件断点,然后shift+ ...

  7. [视频]K8软件破解脱壳入门教程

    [视频]K8软件破解脱壳入门教程 链接:https://pan.baidu.com/s/1aV9485MmtRedU6pzyr--Vw 提取码:vbak C:\Users\K8team\Desktop ...

  8. 深入底层逆向分析TDC‘s keygenme(手脱压缩壳)

    系统 : Windows xp 程序 : TDC‘s keygenme 程序下载地址 :http://pan.baidu.com/s/1gdWyt6z 要求 : 脱壳 & 注册机编写 使用工具 ...

  9. 脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律

    脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律 一丶什么是ESP定律 首先我们要明白什么是壳.壳的作用就是加密PE的. 而ESP定律就是壳在加密之前,肯定会保存所有寄存器环境,而出来的时候, ...

随机推荐

  1. 使用MyBatis的步骤

    1.创建空的Java工程,安装MyBatis依赖 <?xml version="1.0" encoding="UTF-8"?> <projec ...

  2. Go语言GC实现原理及源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/475 本文使用的 Go 的源码1.15.7 介绍 三色标记法 三色标 ...

  3. D. 【例题4】字符串环

    解析 字符串的操作,可以用函数解决这个问题 s 2. f i n d ( s 1. s u b s t r ( i , j ) ) s2.find~(s1.substr~(i,~j)) s2.find ...

  4. Qt信号槽源码剖析(二)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的基本概念.元对象编译器.示例代码以及Qt宏:今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频. Qt信号槽的宏 ...

  5. 附031.Kubernetes_v1.20.4高可用部署架构二

    kubeadm介绍 kubeadm概述 参考附003.Kubeadm部署Kubernetes. kubeadm功能 参考附003.Kubeadm部署Kubernetes. 本方案描述 本方案采用kub ...

  6. 动态语言 VS 静态语言

    静态语言 VS 动态语言 动态语言 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.通俗点说就是在运行时代码可以根据某些条件改变自 ...

  7. 了解什么是redis的雪崩和穿透?redis崩溃之后会怎么样?系统该如何应对这种情况?如何处理redis的穿透?

    缓存雪崩发生的现象 缓存雪崩的事前事中事后的解决方案 事前:redis高可用,主从+哨兵,redis cluster,避免全盘崩溃 事中:本地ehcache缓存 + hystrix限流&降级, ...

  8. Flutter 状态管理- 使用 MobX

    文 / Paul Halliday, developer.school 创始人 众所周知,状态管理是每个软件项目都需要持续迭代更新的方向.它并不是一个「一次性」的工作, 而需要不断确保你遵循的最佳实践 ...

  9. JAVAEE_Servlet_09_Adapter适配器GenericServlet

    适配器 GenericServlet * 适配器 (Adapter) - 适配器的作用? 1.我们目前所有的Servlet类都直接实现了javax.servlet.Servlet接口,但是该接口中有些 ...

  10. Day17_99_IO_FileReader文件字符输入流

    FileReader文件字符输入流 * 继承结构 Java.lang.Object - java.io.Reader; 抽象类 java.io.InputStreamReader; <转换流: ...