一步直达法

所谓的一步直达法就是利用壳的特征。壳一般在执行完壳代码之后需要跳转到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的方法的更多相关文章

  1. 常见寻找OEP脱壳的方法

    方法一: 1.用OD载入,不分析代码! 2.单步向下跟踪F8,是向下跳的让它实现 3.遇到程序往回跳的(包括循环),我们在下一句代码处按F4(或者右健单击代码,选择断点——运行到所选) 4.绿色线条表 ...

  2. 破解之寻找OEP[手动脱壳](1)

    OEP:(Original Entry Point),程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP), 只要我们找到程序真正的OEP,就可以立刻脱壳. PUSHAD (压栈) 代表程序的 ...

  3. 破解之寻找OEP[手动脱壳](2)

    1.使用ESP定律 OD载入后,F8一次,在寄存器窗口的ESP的内容上(如0012FFA4)右键:“在数据窗口中跟随”,到内存数据窗口,将内存数据窗口以HEX 数据形式显示,在刚才的地址起始位置上(如 ...

  4. 脱壳实践之寻找OEP——堆栈平衡法

     0x00 前言 上一篇介绍了壳程序的加载过程以及通过两次内存断点法寻找OEP,这篇我们将利用新的的方法——堆栈平衡法来寻找OEP. 0x01 堆栈平衡法原理 堆栈平衡原理就是利用壳程序在运行前后需要 ...

  5. 寻找OEP

    1.使用ESP定律 OD载入后,F8一次,在寄存器窗口的ESP的内容上(如0012FFA4)右键:"在数据窗口中跟随",到内存数据窗口,将内存数据窗口以HEX数据形式显示,在刚才的 ...

  6. 脱壳入门----脱ASPack壳保护的DLL

    前言 结合脱dll壳的基本思路,对看雪加密解密里的一个ASPack壳保护的dll进行脱壳分析. 脱壳详细过程 寻找程序的OEP 先将目标DLL拖入OD,来到壳的入口处. 然后利用堆栈平衡原理在push ...

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

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

  8. Taurus.MVC WebAPI 入门开发教程4:控制器方法及参数定义、获取及基础校验属性【Require】。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  9. coreseek常见错误原因及解决方法

    coreseek常见错误原因及解决方法 Coreseek 中文全文检索引擎 Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和 ...

随机推荐

  1. io流(File类)

    File类 创建一个file类(没有无参构造)的对象,并与文件进行关联 用File类来操作文件,代码如下: package com.bjsxt.test01; import java.io.File; ...

  2. 使用MyBatis的步骤

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

  3. 《逆向工程核心原理》——IAThook

    hook逻辑写入dll中,注入dll. #include "pch.h" #include <tchar.h> #include "windows.h&quo ...

  4. c/c++ switch case内括号

    如果在case语句中有定义变量,则必须要加{},否则会报错.

  5. 【Linux学习笔记1】-centos6.9部署django

    一,centos6.9部署django ​ 部署套件:centos6.9+nginx+mysql+uwsgi+python3+django ​ 首先还是要明白这几个部分之间的关系(自己也是初学者,希望 ...

  6. RabbitMQ 入门 (Go) - 2. 发布和接收消息

    本文我将使用 Go 语言在 RabbitMQ 上发布和接收消息. Go 的标准库本身并没有 RabbitMQ 的原生绑定,但是有一个第三方库确能够支持 RabbitMQ,它的源码在 https://g ...

  7. 【Android】修改Android Studio的SDK位置

    解决SDK占用C盘空间问题 由于Android Studio默认会将环境下载到C盘,会导致C盘空间被大量占用. 对于C盘窘迫的童鞋非常不友好. 可以通过修改SDK位置的方式缓解C盘空间焦虑. 打开&q ...

  8. 网络编程之BIO和NIO

    目录 OSI网络七层模型 TCP/UDP协议 TCP消息头 TCP三次握手.四次挥手 UDP协议 TCP协议/UDP协议区别 HTTP协议 HTTP协议请求头 HTTP协议响应头 HTTP状态码 so ...

  9. 算法图解...pdf

    电子书资源:算法图解 书籍简介   本书示例丰富,图文并茂,以让人容易理解的方式阐释了算法,旨在帮助程序员在日常项目中更好地发挥算法的能量.书中的前三章将帮助你打下基础,带你学习二分查找.大O表示法. ...

  10. linux中mysql连接不上,服务启动失败等问题解决

    confluence问题解决方式 1)针对confluence访问页面报500与连接失败等问题 首先我们登陆部署confluence的服器 10.15.4.115 2)重启mysql服务,发现重启失败 ...