0X00    了解 upx

UPX作为一款元老级PE加密壳,在以前的那个年代盛行,著名病毒【熊猫烧香】就是使用这款加密壳.

0X01    单步跟踪法

就是使用ollydbg加载程序后,按F8进行单步步过。如果遇到程序向上跳转(红色箭头表示跳转实现),则在程序命令的下一行按F4,将程序运行到所选位置。要保证程序一直向下跳转,否则运行一个向上跳转,就会跳到壳的循环当中,就出不来了。运行到一定代码后,如果看到一个比较大的跳转,可能是jmp,也可能是ret。跳转之后的代码是popad,一般就是到了程序的OEP了。然后脱壳即可。

注:

1.call 相当于高级语言中的函数调用。 当执行call指令时,进行两步操作: 将下一条的指令的地址压入栈中,再跳转到该地址处。

2.与call对应的就是RET,对于RET我们可以这样来理解:将当前的ESP寄存器中指向的地址出栈,然后跳转到这个地址

0X02     ESP定律

(1)  利用堆栈平衡的原理

ESP是应用频率最高的脱壳方法之一 ,不论是新手还是老手都经常用到。

而且,壳实质上是一个子程序,它在程序运行时首先取得控制权并对程序进行压缩。 同时隐藏程序真正的OEP。大多数病毒就是基于此原理,从而防止被杀毒软件扫描,而脱壳的目的就是找到真正的OEP(入口点)

由于在程序自解密或者自解压过程中, 多数壳会先将当前寄存器状态压栈, 如使用pushad, 而在解压结束后, 会将之前的寄存器值出栈, 如使用popad. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发(这就是我们要下硬件断点的原因),然后在程序当前位置, 只需要一些单步操作, 就会到达正确的OEP位置.

注:几乎全部的压缩壳, 一些早期的加密壳,在载入程序后只有esp寄存器内容发生变化,那么这个程序多半可以用ESP定律。

(2)   具体操作

使用OD加载程序后,按F8进行单步跟踪,注意右上角的寄存器窗口,当发现ESP和EIP的值同时变红时(表示同时发生了变化)。在寄存器窗口中点击右键,选择“数据窗口中跟随”。然后在右下角的内存窗口中,点击右键,选择“断点”——“硬件访问”——“字”。最后按F9运行程序,就会直接来到程序的OEP附件了。最后记得要删除刚刚下的硬件断点。通过菜单栏上选择“调试”——“硬件断点”,就会看到我们下的断点,删除即可。

0X03   内存镜像法

(1)区段知识

数据段:数据段通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
代码段:代码段通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,
并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等
资源段: .rsrc
偏移数据 : rdata

一般壳都是依次解密各区段的 数据(.data) , 等所有区段解密完成在跳转到代码段(.text) 去执行原始程序的代码。————出自rejector

(2) 具体操作

加载程序,按CTRL+M,或者点工具栏上的M按钮。打开内存窗口。在资源这一行上按F2下断点,即“.rsrc”这一行。然后按F9运行程序。再按CTRL+M打开内存窗口,在数据行上下断点(按F2)。即PE头的下一行。下断后,再按F9运行,就会达到程序的OEP附近了。

附:(看雪某佬的一段看法)

对区段的处理,第一次是解密,第二次就是执行到oep了,这种方法其实没啥用,一般的弱壳还是定位IAT的修改,改了以后基本就快到oep了,或者看看GetVersion或者delphi开始的调用的api,看看代码啥时候写好或者执行。弱壳基本就是把IAT改回来,单纯镜像法什么的没用,瞎猫碰死耗子,而且IAT还是得修改回来。强壳不会。

0X04    POPAD查找法

加载程序后,按CTRL+F进行查找。在查找框中输入“popad”,把“整个块”的复选框去掉。按后回车,就会来到程序OEP的附件了。按后按F4,将程序运行到当前位置,再单步跟踪几次就到OEP了。

手脱UPX壳的方法的更多相关文章

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

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

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

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

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

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

  4. 脱upx壳--初试--单步追踪

    脱upx壳--初试--单步追踪 这里的练习题目是reversing.kr 的Easy Crack 我自己用upx加壳工具给它加了个壳,由于原文件逻辑简单,所以用它来练练手 之后用到的工具是IDA和Ol ...

  5. 填坑专记-手脱FSG壳

      妈呀,脱FGS壳真的是坎坷颇多,多亏吾爱破解前辈们的帮忙.我一定要记录下来,省的以后再无法解决.   已经查看是FSG壳了.找到入口也容易了.重点就是脱壳并修复好它. 脱壳   OEP为:   使 ...

  6. 手脱NsPacK壳

    1.查壳 使用PEiD未能检测到壳信息,这时,我们更换其他工具 从图中可以看到壳的信息为[NsPacK(3.x)[-]] 2.百度壳信息 北斗程序压缩(Nspack)是一款压缩壳.主要的选项是:压缩资 ...

  7. 手脱UPX(3.91)

    1.使用Detect It Easy进行查壳: 2.使用x32dbg打开该带壳程序,在选项->选项->异常中添加区间设置0~FFFFFFFF全忽略: 3.我们F9运行到程序入口处,看到了p ...

  8. 手脱UPX v0.89.6 - v1.02

    声明: 只为纪录自己的脱壳历程,高手勿喷 这个壳的脱法很多一般都一步直达的,步过我喜欢ESP定律 1.载入OD,在入口下一行ESP定律运行一次 > pushad ; //入口 BE mov es ...

  9. 手动脱UPX 壳实战

    作者:Fly2015 Windows平台的加壳软件还是比較多的,因此有非常多人对于PC软件的脱壳乐此不彼,本人菜鸟一枚,也学习一下PC的脱壳.要对软件进行脱壳.首先第一步就是 查壳.然后才是 脱壳. ...

随机推荐

  1. Redmine部署中遇到的问题

    Redmine部署文章: 第一篇:Redmine部署 第二篇:Redmine部署中遇到的问题 上一篇文章我写了Redmine怎样部署(点这里直达上一篇文章),这一篇就写一下在Redmine部署中遇到过 ...

  2. 流程自动化RPA,Power Automate Desktop系列 - 构建VuePress文档中心脚手架

    一.背景 笔者曾基于VuePress搭建过一个文档中心,但是在实现在线管理功能之前,很多时候,新建文档需要手动处理很多数据,看有没有可能实现一个脚手架来处理这些问题,所谓脚手架,就是进行文档初始化的一 ...

  3. Keepalive介绍及工作原理

    注:keepalive和Nginx和高可用没有关联. 1.什么是高可用,为什么要设计高可用? 1.两台业务系统启动着相同的服务,如果有一台故障,另一台自动接管,我们将国称之为高可用.2.系统可用率算法 ...

  4. release模式下打断点调试 配置选项

    最近调试一个离职的同事留下的工程,DEBUG模式下顺利,RELEASE的时候就崩溃了,显示为"帧不在模块中"--简直一头雾水 于是我修改配置,为了能够在Release模式中打断点调 ...

  5. Nginx跨域了解及模拟和解决

    Nginx跨域 同源策略 何为同源: 1.协议(http/https)相同 2.域名(IP)相同 3.端口相同 详解请看我另一篇文章 https://www.cnblogs.com/you-men/p ...

  6. 暑假自学java第五天

    关于测试类的问题: 单独创建一个包存放测试类,如com.test 首先要构建路径添加测试类的相关类库,方法是项目右键,buld path->config buld path->librar ...

  7. mac 中一些日常小问题与快捷键

    1.备忘录中的中英文符号问题 比如:在备忘录中使用英文符号时,总是会被自动的修改为中文符号 解决方法:系统偏好设置-键盘-文本,去选"使用智能引号和存折号" p.p1 { marg ...

  8. .NET 6 Preview 6 正式发布: 关注网络开发

    微软.NET 团队的项目经理在博客上发布了.NET 6 Preview 6,  在候选发布阶段之前的倒数第二个预览版,也就是8月份还会发布一个Preview 7,9月份开始进入RC,两个候选版本将专注 ...

  9. C语言:2.1

    int main() { char zi='A'; short bla=10; int blb=20; long blc=30; float bld=340.56; double ble=34.324 ...

  10. Java中的基本数据类型和引用数据类型的区别

    一.数据类型 Java中的数据类型分为两大类,基本数据类型和引用数据类型. 1.基本数据类型 基本数据类型只有8种,可按照如下分类 ①整数类型:long.int.short.byte ②浮点类型:fl ...