手脱UPX壳的方法
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了。
最新文章
- C#对七牛云的操作
- js里面的等于号--
- JavaScript表单编程
- innodb结构解析工具---innodb_ruby
- Linux开发工具之gcc
- 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持组件注解限制(七)
- 用keras作CNN卷积网络书本分类(书本、非书本)
- Mysql 备份恢复与xtrabackup备份
- 2015 多校联赛 ——HDU5360(贪心+优先队列)
- 使用Android服务,实现报警管理器和广播接收器
- 5-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(配置保存数据的数据库)
- Golang 之 interface接口全面理解
- linux 查看信息-系统&;资源
- 数据模型Model(I)
- web.xml启动spring详解
- linux软件管理(六)
- js学习笔记15----子节点和兄弟节点的操作
- java-02 JDK安装与环境变量配置&;安装编程IDE
- yii2:多条件多where条件下碰到between时,between语句如何处理呢?
- Gym-101128D:Dice Cup
热门文章
- JWT原理实现代码
- Redis之内存优化
- 基于 Electron 实现 uTools 的超级面板
- 浅读tomcat架构设计之tomcat生命周期(2)
- Docker:部署PXC8.0集群时,启动容器报错New joining cluster node didn‘t find all needed SSL artifacts
- 资源:docker离线安装包下载路径
- [开源名人访谈录] Philippe Gerum
- leetcode TOP100 字母异位词分组
- WPF下如何使用TTF字体
- python exec()函数