本文的示例程序为通过upx加壳的应用程序
讲解的方法:手动单步跟踪法、ESP定律方式、内存二次断点法

一、手动单步跟踪法

主要使用的两个快捷键F8与F4
F8:单步步过
F4:运行到指定位置(右键->断点->运行到指定位置F4)

1、逐步F8往下单步跟踪,遇到往回跳转的循环时,使用F4跳到要进行循环的下一条指令。

解释:在地址0x0055B849处遇到往回跳转的指令,此时我们用鼠标点击地址0x0055B84B,然后再点击F4,程序就运行到了地址0x0055B84B处。然后我们继续往下F8往下跟踪即可。

2、有时候直接在循环的下一条指令进行F4不一定可以成功,此时我们就需要自习分析下循环跳出时会跳在哪条指令处。

我们通过分析0x0055B98F处的jmp指令发现,结束循环的指令在0x0055B950处,je跳出到的地址在jmp后的第二条指令。这与我们通常的第一条指令不同,因为普通的jmp结束循环后通常在jmp后的第一条指令,但是这个循环不同,那我们怎么解决类似的问题呢?
(1)养成好的分析习惯,可以跟进循环判断下这个循环跳出的指令在哪里。
(2)可以在jmp后的后几个指令里面选择一个F4,而不是接下来直接的第一个,例如图片中的最后一个红框里面的指令进行F4就可以避免这种问题发生。
注:类似的情况还有jmp后的指令为nop指令时,如果我们在nop指令上进行F4,是无法实现的,此时程序就会跑飞,解决的方法同上。

3、加壳的程序进行运行的时候,会先进行解压缩的操作,实现代码和数据的解密,并对IAT进行修复,这些操作在一个区段里面完成,完成之后就会实现跳转到原始程序入口点OEP进行运行,这个跳转往往为区段的跳转。
所以,我们碰到一个大的地址的跳转时,那它就可能为一个区段的跳转,更可能为跳转到OEP的指令。
例如:

该指令就是跳转到OEP的指令语句,为一个跨区段的跳转。
查看区段信息:

区段UPX0范围:0x00401000~0x004EE000
区段UPX1范围:0x004EE000~0x0055C000
可以看出,0x0055B9D4属于UPX1区段,0x004E53C2属于UPX0区段。

二、根据ESP定律方法

该方法对于大多数的压缩壳通用

ESP定律是什么?
每一个函数的调用在堆栈里都有一个栈帧,在整个函数刚刚进入的时候,它需要把EBP(始终指向栈底的指针)保存到堆栈里面,然后把当前的最顶上的ESP(始终指向栈顶的指针)往上进行移位,留出适当的栈帧来供子函数进行使用,子函数执行完毕后会进行堆栈平衡,对栈帧进行还原,并使得ESP恢复为调用函数之前的状态。简单的理解ESP定律就是栈帧及堆栈平衡原理。

ESP定律使用的原理?
通过了解ESP定律的原理,我们知道,函数执行完成后,ESP指针会进行还原为先前的状态。既然如此,我们就可以对ESP寄存器下一个硬件断点,使得ESP还原为调用函数之前状态的时候断下来,也就是函数执行完毕的时候断下来。
于是,我们可以将一个壳的解压缩的方式当作一个函数的调用。比如加了UPX壳的程序在运行的时候,开始运行的就是UPX解压缩的函数,此时它会保存EBP,然后移动ESP,给函数留出足够的栈帧,当所有的解压缩完成后,它需要把所有的栈帧再进行还原,使得ESP恢复为调用函数之前的状态,此时的硬件断点就会断下来,正好为解压缩函数执行完毕的时候,而解压缩完成后,就会进行跳转到OEP,此时我们只需要F8往下跟几步,就能很快的找到OEP了!!!

ESP定律的使用
1、第一条指令为pushad指令,先F8运行到下一条指令,才能将我们的通用寄存器压入到堆栈中(包含我们即将下硬件断点的ESP寄存器)。

2、对ESP寄存器下硬件断点
方法一:鼠标操作的方式
首先在数据窗口中跟随

然后再数据窗口中,进行下一个硬件断点,这里下的时硬件访问断点DWORD

方法二:通过命令下硬件断点

HR:下硬件访问断点的命令

3、F9直接运行程序,直到断下来,再F8跟几步,就到达跨段跳转到OEP的jmp指令的地方。

不难发现,硬件断下来的地方,举例我们的跨段跳转只有几步的差距,只需要简单的F8跟几步即可。

注意:此时我们找到OEP后需要删除硬件断点,否则它以后调用完函数还要断下来。
在“调试”中选择硬件断点,随后删除硬件断点即可

三、内存二次断点法

假设你是一个壳的作者,壳的解压缩代码如何来进行解压缩?
先解压缩代码,再解压缩资源…再解压缩其他的一些东东…也就是按照区段来进行解压。既然如此,我们就可以将区段看作为一个关键点,利用对区段下断点来进行查找OEP。
注:通常的壳解压缩都是一部分一部分的解压缩(也就是按区段进行解压),而不是几行代码几行代码的解压缩(这样会比较耗时,涉及到解压缩效率的问题)。

内存二次断点法的原理
(1)首先在资源段上下一个断点,那么在解压缩代码的时候,程序依旧可以正常的运行,因为是先解压缩代码再解压缩资源的。当开始解压缩资源的时候,程序就会中断下来,因为我们在资源段上下了一个断点,此时中断的时候,代码已经全部解压,资源段正在准备解压…
(2)再在代码段上下一个断点,再继续运行,此时程序开始解压缩资源和其他的一些内容,等到全部解压缩完成以后,解压缩程序就需要跳转到OEP上运行,即跳转到代码段上运行,此时中断下来。
(3)再手动F8往下跟几步,就到达跨段跳转到OEP的指令位置。

内存二次断点法的实际使用
1、点击模块的缩写M,在模块窗口中找到我们自身程序所对应的模块。此示例中为upx模块

注:其他的是一些动态链接库的模块,如果模块找错的话,自然断点也就下错了!!!

2、在资源段(.rsrc)上按F2下一个断点,或者右键选择“在访问上设置中断”

然后点击F9,让程序运行起来

3、此时程序中断下来(中断在资源段上),我们不必关系程序在哪里中断下来,接下来我们只需要再在代码段上按F2下一个断点。

然后点击F9,再次让程序运行起来

4、此时程序再次中断下来(中断在代码段上)
中断的地方:

跨段跳转的位置:

接下来我们只需要在中断下来的位置再进行手动往下跟踪即能很简单的到达跨段跳转的地方。
不难看出,中断下来的地址与跨段跳转的地址相差很小,只需要简单的手工跟踪即可找到OEP。


注:本文中寻找OEP的方法,对于压缩壳一般都适用,但是对于一些保护壳就不适用了。

本文难免有所错误,如有问题欢迎留言

脱壳笔记-寻找OEP方法总结相关推荐

  1. 脱壳的几种方法 详细操作步骤

    脱壳的几种方法  详细操作步骤 常见脱壳知识: 1.PUSHAD (压栈) 代表程序的入口点 2.POPAD (出栈) 代表程序的出口点,与PUSHAD相对应,一般找到这个,说明OEP可能就在附近 3 ...

  2. 深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)

    深度学习笔记(一):logistic分类  深度学习笔记(二):简单神经网络,后向传播算法及实现  深度学习笔记(三):激活函数和损失函数  深度学习笔记:优化方法总结  深度学习笔记(四):循环神经 ...

  3. 小红书笔记下沉的方法和技巧

    小红书目前用户越来越多,随之而来发布的笔记数量也大了起来,不可避免得出现很多恶意的负面笔记,让大家很头疼. 下面推神网(daizuobaike)就给大家详细介绍下几种小红书负面笔记处理的方式: 1.官 ...

  4. 2020-4-5 深度学习笔记17 - 蒙特卡罗方法 3 ( 马尔可夫链蒙特卡罗方法MCMC-先验分布/后验分布/似然估计,马尔可夫性质)

    第十七章 蒙特卡罗方法 中文 英文 2020-4-4 深度学习笔记17 - 蒙特卡罗方法 1 (采样和蒙特卡罗方法-必要性和合理性) 2020-4-4 深度学习笔记17 - 蒙特卡罗方法 2 ( 重要 ...

  5. win 10 slmgr.vbs -xpr 无法运行,被豆麦笔记打开解决方法

    win 10 slmgr.vbs -xpr 无法运行,被豆麦笔记打开解决方法 参考文章: (1)win 10 slmgr.vbs -xpr 无法运行,被豆麦笔记打开解决方法 (2)https://ww ...

  6. 软件开发相关的读书笔记 问题与方法

    软件开发相关的读书笔记 问题与方法 https://www.zybuluo.com/UDvoid/note/45720 标签: 读书笔记 软件开发 关于银弹的讨论 [No Silver Bullet: ...

  7. Python学习笔记Task11.魔法方法

    Python学习笔记Task11.魔法方法 魔法方法格式__init__ 1.基本 init(self[,-]) new(cls[,-]) del(self) str(self) repr(self) ...

  8. pyqt5笔记 — 重写窗口方法closeEvent()的两种方式

    @[TOC](pyqt5笔记 - 重写窗口方法closeEvent()的两种方式) 一.重写的作用 在开发过程中,经常会遇到一种需求:服务器端在主动发出一些信息给客户端,而在用户端关闭UI的时候,需要 ...

  9. python寻找质数_寻找质数方法Python2.7版本

    这是个人的Python代码练习作品,完成了在Python2.7版本下寻找质数方法的操作. #!/usr/bin/python # coding=utf8 # Find Primes # Usage: ...

最新文章

  1. 关于Windows 2003下开启防火墙后不能通过FTP问题解决
  2. OpenCV几何变换的实例(附完整代码)
  3. XMLhttp学习应用
  4. ASP.NET Core中HTTP管道和中间件的二三事
  5. js获取cookie获取不到问题 vue获取cookie以及获取不到问题
  6. 汇编:用户登录以及简单数据加密
  7. 【LeetCode】剑指 Offer 55 - II. 平衡二叉树
  8. jsp删除时提示_Java修行第058-059天 Servlet+JSP+JavaBean整合项目总结
  9. Netty in action—第一个Netty应用
  10. ID3、C4.5、CART决策树算法解析(关键内容讲解)
  11. google 搜索跳转至yahoo
  12. upc 6605: 所罗门王的宝藏(矩阵行列规律)
  13. 一网打尽系列之史玉柱运营法则
  14. 基于Android的背单词软件【源码+文档+答辩PPT】
  15. 网上书店系统/书店管理系统的设计与实现
  16. 这些选择器你都知道吗?
  17. 作为程序员,我将如何教育自己的孩子
  18. 【面试通关篇】13个offer,8家SSP,谈谈我的秋招经验
  19. 人工智能-强化学习-算法:Critic 【用于评价一个 Actor/Policy π】--> Q-Learning【用于训练出来一个最优 Actor/Policy π,擅长处理离散型 actions】
  20. 深入iOS系统底层之静态库介绍

热门文章

  1. 智能建筑计算机网络系统设计的主要内容及遵循的原则,第十三章智能建筑计算机网络工程设计...
  2. 计算机专业买小新pro13锐龙怎么样,Soomal作品 - Lenovo 联想 小新Pro13 2020锐龙版笔记本电脑屏幕测评 [Soomal]...
  3. CSS学习笔记 08、过渡与动画
  4. 菲律宾以创新废水处理技术改造基础设施,满足更加严格的环保法规要求
  5. 小红书内容丨小红书达人创作灵感哪里找
  6. Git 克隆别人代码提交到自己的线上仓库
  7. 安卓刘海屏沉浸式(内容绘制到底部,隐藏底部导航栏,状态栏背景颜色为透明)
  8. 字体样式,文本样式,背景样式,边框样式,线性渐变,伪类选择器,css权重
  9. 谷歌员工担心自家 AI 敌不过 ChatGPT,高管回应:其过快发展可能损害公司
  10. 体育赛事会用到动作捕捉相机吗?还是超高速相机呢?