UPX手动脱壳

脱壳入门,不喜勿喷,欢迎指正。
参考 “逆向界圣经” 《加密与解密(第四版)》

0x01 壳&脱壳

首先了解一下什么是壳,

壳实质上是一个子程序,它在程序运行时首先取得控制权并对程序进行压缩。同时隐藏程序真正的OEP。

而脱壳的过程总体分为三个步骤:

  • 查找真正的程序入口点
  • 抓取内存镜像文件
  • 重建PE文件

关于壳的类型有以下几种:

  • 解压->运行
  • 解压->运行->解压.->运行
  • 解压 decoder|encoded code->decode ->exc
  • Run the virtual machine

0x02 Dump

一般找到程序入口点(OEP)后我们需要Dump出脱壳之后的文件。
那么,什么是dump?

定义:

dump(抓取内存镜像,“转存”),就是读出指定地址的映像文件并以文件方式保存。一般在OEP处(因为此时一些项目已经完成了初始化)dump

原理:

一些dump工具(如LoardPE、PETools等)利用Module32Next函数,函数声明如下:

BOOL  Module32Next(HANDLE hSnapshot,LPMODULEENTRY32 lpme)

LPMODULEENTRY32其实是一个结构体指针,结构体类型是MODULEENTRY32,这个结构体有两个字段modBaseSize,modBaseAddr,分别代表了一个进程的映像大小与基址。
这类工具先根据这俩个字段获取了一个进程的映像大小与基址;然后用ReadProcessMemory函数读取进程数据同时检测DOS文件头和PE文件头的字段完整性,最终决定是直接用进程文件头还是换用原始文件头(LordPE工具是直接获取原始文件头)

0x03 ESP定律(栈平衡原理)

先给出esp寄存器的功能:

存放栈顶的偏移地址

有关汇编代码中call指令实质上是

push ip                 ;把下一条指令的地址(存放在ip寄存器中)入栈
jmp near ptr 地址        ;跳转到该函数的地址处

还有ret和retf(一个函数结束的标志):

pop ip      ;(ret)返回到call指令的下一条指令
pop IP      ;(retf)返回到call指令的下一条指令
pop CS

在编写加壳软件时,我们必须要保证外壳初始化的现场环境(即各个寄存器的值)与源程序的现场环境是相同的,所以,在程序自解密或者自解压过程中,对于多数壳,它们会先将当前寄存器状态压栈,如使用pushad/pushfd。
而在解压结束后, 会将之前的寄存器值出栈,如使用popad/popfd,一般标志寄存器不是很重要,一般不做处理。
所以编写加壳软件必须遵守的是栈平衡原理。

因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发(pop IP),这就是我们要下硬件断点的原因,然后在程序当前位置,只需要一些单步操作,就会到达正确的OEP位置。

也就是说,我们可以这么认为,如果载入程序后只有esp寄存器(eip除外)内容发生变化,那么这个程序多半可以用ESP定律。

0x04 实例

加壳程序:re_sign.exe
使用工具:OllyDbg

导入od看到如下提示,点击“否”
在这里插入图片描述
单步调试前先看寄存器窗口的值,此时程序停在了pushad。
在这里插入图片描述
F8执行完pushad,再看寄存器窗口,除了EIP指令,只有ESP寄存器变红。(表明当前指令只用到了esp寄存器)
在这里插入图片描述
再看堆栈面板(把未执行pushad指令时的各个寄存器状态跟现在的堆栈面板的数据进行了比对),发现各个寄存器的值都入栈,表面开始进入壳代码。
在这里插入图片描述

我们接下来就可以下硬件断点了,查看esp寄存器里的值是19FF54,od命令行输入“hr 19FF54”下硬件读断点。
在这里插入图片描述
按F9,看到程序停在了popad指令的下一条指令,说明程序处理完了外壳代码,在调用popad指令恢复现场环境时访问这些栈,此时触发中断。我们比对也可以发现那些寄存器里的初始值恢复了,离我们的OEP不远了。
在这里插入图片描述
F8单步执行下去(中途有个循环可以下断点跳出去),然后jmp指令跳转(跳回程序的OEP),看到了几个push语句如下:
在这里插入图片描述
其中前几个是

push ebp          ;入口点OEP,大多数程序的第一句指令都是push压栈。
mov ebp,esp
push -1

我们便可以判断我们已经找到OEP了,此时右键(利用OD的Ollydump工具)把程序dump出来即可得到脱壳后的程序。
在这里插入图片描述
拖到ida里面看看效果,现在已经可以正常静态分析了。
在这里插入图片描述
其实也有另一种思路。
既然很多OEP的第一句都是push ebp,而壳程序运行前会把ebp寄存器的值入栈,等到运行完壳代码再出栈,接着就是push ebp对ebp进行写入操作。我们不妨对ebp设置硬件写断点,那不就直接F9断在了OEP处了。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: UPX脱壳工具是一款用于解密并还原被UPX壳包装的程序的工具。UPX是一种非常流行的免费开源压缩工具,许多黑客使用它来保护自己的恶意代码。为了解决这个问题,开发人员开发了UPX脱壳工具,它可以反向工程UPX壳,使原始代码可读性高,并且可以检测和修复代码中的漏洞和攻击。UPX脱壳工具也可以帮助代码分析人员进行代码审计,以及帮助开发人员提高代码的质量。 UPX脱壳工具的优点是快速、高效、易用。它可以快速识别和解密UPX壳,并还原原始代码。此外,UPX脱壳工具非常容易使用,不需要任何专业技能或知识。使用UPX脱壳工具,用户可以通过几个简单的步骤来解密和还原被加密的程序。 总之,UPX脱壳工具是一款非常有用的工具,它可以为代码分析人员、安全研究人员和开发人员提供帮助,确保他们能够在维护程序安全及质量方面取得成功。 ### 回答2: UPX是一种用于压缩和加密可执行文件的开源工具。UPX压缩后的文件体积明显减小,加密也能增强文件的保密性,常被恶意程序使用以防止反汇编和分析。 UPX脱壳工具是专门为解压和解密UPX压缩的文件而设计的工具。目前市面上有很多UPX脱壳工具,在解密时会根据具体的UPX版本和加密方式进行处理,从而解压出原始的可执行文件。这些工具具有操作简单、速度快、功效稳定的特点,大大提高了对加密文件的分析和研究效率。 但是,UPX脱壳工具也面临着一些问题。首先,一些UPX脱壳工具只适用于特定版本的UPX程序,如果UPX版本发生变化,这些工具可能无法正常工作。其次,恶意程序有时会使用更高级的加密方式,这些加密方式超出了UPX脱壳工具的处理能力。此外,UPX脱壳工具也可能会被反病毒软件所检测和拦截,需要谨慎使用。 总的来说,UPX脱壳工具对于分析和研究可执行文件具有重要意义,但在实际使用时需要考虑到所处理的文件类型、加密方式、以及UPX工具版本等因素,以免出现错误。 ### 回答3: UPX脱壳工具是一种用于反编译、反混淆和脱壳UPX压缩的软件的工具。UPX是一种广泛使用的可执行文件压缩器,用于减小可执行文件大小和保护代码,但这可能会使反汇编和动态分析变得困难。因此,UPX脱壳工具是研究人员、安全专业人员和黑客们常用的工具,因为他们可以使用该工具更容易地分离出压缩的代码并进行更深入的研究。 UPX脱壳工具的使用方法相对简单,通常通过指定代码中的UPX头来识别可执行文件的使用UPX压缩的情况,然后压缩头会被删除,使反编译变得更容易。但是需要注意的是,使用该工具用于非法活动会被视为侵犯知识产权,这是不道德和非法的。 总之,UPX脱壳工具是一个有用的反编译、反混淆和脱壳UPX压缩的软件的工具,它可以帮助研究人员快速识别出压缩的代码和进行更深入的研究,但必须遵守法律和道德规范。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Em0s_Er1t

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值