脱壳入门----常见的寻找OEP的方法
一步直达法
所谓的一步直达法就是利用壳的特征。壳一般在执行完壳代码之后需要跳转到OEP处,而这个跳转指令一般是call ,jmp ,push retn类型的指令,而且因为壳代码所在的区段和OEP代码所在的区段一般属于不同的区段,所以我们可以通过搜索这些特殊指令的机器码并查看其跳转范围,如果跳转范围较大(也就是跨段跳转)则可以判断为此指令会跳到OEP处。
下面以UPX壳为例:
我们在OD中通过Crty + B来搜索二进制字串,call的机器码为E8,jmp的机器码为E9。这里我们搜索E9,通过Ctry + L来查看下一个机器码。

通过几次搜索之后我们找到了一条跳转到另一个区段的jmp指令,此指令就为对应的OEP跳转指令。

如果我们通过搜索jmp的机器码(E9)没有找到符合条件的跳转指令我们可以接着搜索call指令的机器码(E8)。
一步直达法的优点是简单,缺点是对一些强壳不好判断,因为一些强壳会采用jmp eax的方式跳转到oep中,而eax值我们是不能直接判断的,有的一些强壳还会对跳转到OEP的指令进行压缩,在执行此指令前才对其进行解压缩。这样我们通过直接搜索这些特定指令的机器码就很难判断是否为OEP跳转指令。
单步跟踪法
所谓的单步跟踪法就是从EP处开始F8单步向下跟踪,遇见向上跳转的指令不跳。这种方法实际是利用了壳代码的一般逻辑都是先解压缩原程序的各个区段和一些简单处理,然后最后跳转到OEP处。所以可以忽略前面的那些操作,直接去寻找OEP跳转的指令。这种方法也是存在一定的偶然性,对一些简单的壳能起到奇效。
模拟跟踪法
模拟跟踪法是利用OD的命令行插件,tc/toc命令是跟踪步进/步过 直到满足条件就暂停程序。因为OEP所在区段一般位于第一个区块处,而壳代码一般位于后几个区块中,因此我们可以利用tc/toc命令当eip小于壳代码所在的区块地址时说明程序跳转到了oep处。
下面我们用例子来演示一遍:
用OD加载程序后我们Alt+M查看内存,我们发现主模块的壳代码位于首地址为0x4F1000处。

我们在OD的命令行中输入 toc eip < 0x4F1000 后运行程序,程序会暂停到OEP处。

模拟跟踪法优点也是简单,缺点是耗时特别长,因为其在没执行完一条指令后都需要判断条件是否成立,所以程序运行很慢。而且如果壳代码和OEP在同一个区段中的话此方法就不适用了。(虽然这种情况很少,但不能保证没有)
SFX法
SFX法和模拟跟踪法十分相似,只不过SFX是OD本身提供的功能。
SFX法有两种方式,一种是通过判断块的形式看是否到达OEP处,另一种是通过判断字节的形式。显而易见块判断形式速度快但是准确度低,字节形式速度慢但是准确度高。我们在实际分析时结合具体情况选择合适的方式进行跟踪。

内存映像法
内存映像法就是通过对加载到内存中的程序下内存断点来寻找OEP,因为加壳程序在解压缩各个区段后会跳转到OEP执行此处的代码,所以我们可以通过先对OEP所在的区块设置内存写入断点,待此区段解压缩完成后我们再在此区块上设置内存访问断点。这样当程序执行到OEP处时就会暂停。
ESP定律法
ESP定律是利用堆栈平衡,一般壳代码在执行的时候回保存寄存器环境,在跳转到OEP处的时候再恢复环境。我们可以利用此特点在执行完push指令保存环境后,对堆栈设置硬件访问断点或内存访问断点。这样在跳转到OEP前其会执行pop指令,程序就会暂停我们就可以单步向下跟踪寻找OEP跳转指令。
最后一次异常法
有的加壳程序会在执行壳代码的时候设置很多异常来干扰脱壳破解者,其会在各个异常的异常处理程序中检测断点以及进行反调试。所以我们如果还用esp定律,内存映像等下断点的方法就会失效。我们需要将这些异常执行完之后在采取以上办法。最后一次异常法就是寻找到程序最后一次异常发生的指令,当最后一次异常执行后我们在采取常规方法寻找OEP。
利用应用程序调用的第一个API
通过对应用程序调用的第一个API下断点来到达OEP附近,从而进一步寻找到OEP。
例如GetVersion,GetModuleHandle等。
利用不同编译器编译程序入口特征码定位OEP
如果熟悉各个编译器编译程序入口点代码的特征就可以通过此方法来快速到达OEP处,我们可以在各个区块解压缩后通过搜索特定编译器程序入口点代码的特征码来到达OEP处。
脱壳入门----常见的寻找OEP的方法的更多相关文章
- 常见寻找OEP脱壳的方法
方法一: 1.用OD载入,不分析代码! 2.单步向下跟踪F8,是向下跳的让它实现 3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——运行到所选) 4.绿色线条表 ...
- 破解之寻找OEP[手动脱壳](1)
OEP:(Original Entry Point),程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP), 只要我们找到程序真正的OEP,就可以立刻脱壳. PUSHAD (压栈) 代表程序的 ...
- 破解之寻找OEP[手动脱壳](2)
1.使用ESP定律 OD载入后,F8一次,在寄存器窗口的ESP的内容上(如0012FFA4)右键:“在数据窗口中跟随”,到内存数据窗口,将内存数据窗口以HEX 数据形式显示,在刚才的地址起始位置上(如 ...
- 脱壳实践之寻找OEP——堆栈平衡法
0x00 前言 上一篇介绍了壳程序的加载过程以及通过两次内存断点法寻找OEP,这篇我们将利用新的的方法——堆栈平衡法来寻找OEP. 0x01 堆栈平衡法原理 堆栈平衡原理就是利用壳程序在运行前后需要 ...
- 寻找OEP
1.使用ESP定律 OD载入后,F8一次,在寄存器窗口的ESP的内容上(如0012FFA4)右键:"在数据窗口中跟随",到内存数据窗口,将内存数据窗口以HEX数据形式显示,在刚才的 ...
- 脱壳入门----脱ASPack壳保护的DLL
前言 结合脱dll壳的基本思路,对看雪加密解密里的一个ASPack壳保护的dll进行脱壳分析. 脱壳详细过程 寻找程序的OEP 先将目标DLL拖入OD,来到壳的入口处. 然后利用堆栈平衡原理在push ...
- [视频]K8软件破解脱壳入门教程
[视频]K8软件破解脱壳入门教程 链接:https://pan.baidu.com/s/1aV9485MmtRedU6pzyr--Vw 提取码:vbak C:\Users\K8team\Desktop ...
- Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...
- coreseek常见错误原因及解决方法
coreseek常见错误原因及解决方法 Coreseek 中文全文检索引擎 Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和 ...
随机推荐
- 《数据持久化与鸿蒙的分布式数据管理能力》直播课答疑和PPT分享
问:hi3861开发板支持分布式数据库吗? 目前,分布式数据库仅支持Java接口,因此Hi3861没有现成的API用于操作分布式数据库. 问:分布式数据管理包括搜索吗? 分布式数据管理包括融合搜索能力 ...
- 你只会用 map.put?试试 Java 8 compute ,操作 Map 更轻松!
今天栈长分享一个实用的 Java 8 开发技能,那就是 Map 接口中增加的 compute 方法,给 Map 集合计算更新用的. compute简介 如下所示,Java 8 在 Map 和 Conc ...
- P1618 三连击(升级版)(JAVA语言)
题目描述 将1,2,-,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出"No!!!". //感谢黄小U饮品 ...
- 2018年11月16日SQL Server实验内容(触发器实验)
--注意:先把studentmanager数据库中的所有表用select into命令复制一份, --然后用复制后新表完成下面的实验,同时,对每个触发器都要进行验证. select *into dep ...
- pwnable.kr 第一题fd
使用ssh fd@pwnable.kr -p2222连接输入密码guest 1 fd@prowl:~$ ls -al 2 total 40 3 drwxr-x--- 5 root fd 4096 Oc ...
- Android Studio 如何在TextView中设置图标并按需调整图标大小
•任务 相信大家对这张图片都不陌生,没错,就是 QQ动态 向我们展示的界面. 如何实现呢? •添加文字并放入图标 新建一个 Activity,取名为 QQ,Android Studio 自动为我们生成 ...
- Android Studio 之 ImageView 学习笔记
•参考资料 [1]:菜鸟教程 [2]:bilibili视频教程 •src和blackground的区别 background通常指的都是背景,而src指的是内容 当使用 src 填入图片时,是按照图片 ...
- Kotlin编写Processing程序(使用函数式编程思维和面向接口方式)
写一例Kotlin编写的Processing程序,充分调用函数式编程思维和面向接口的编程思维,供自己和读者参考学习. 初衷 想要实现一行行的文字排版功能,每一行作为一个单位,可制定显示的位置.大小.文 ...
- Ubuntu安装docker/docker-compose(在全新系统状态下的安装)
设置仓库 更新 apt 包索引. $ sudo apt-get update 安装 apt 依赖包,用于通过HTTPS来获取仓库: $ sudo apt-get install \ apt-trans ...
- Floyd算法C++实现与模板题应用
简介 Floyd算法算是最简单的算法,没有之一. 其状态转移方程如下map[i , j] =min{ map[i , k] + map[k , j] , map[i , j] }: map[i , j ...