upx手动脱壳

upx手动脱壳upxupx是一个开源的工具,可以到github下载upxupx简单的用法upxsrc.exe命令将src.exe加壳upxsrc.exe-odst.exe命令将src.exe加壳并另存为dst.exeupx手动脱壳

大家好,又见面了,我是你们的朋友全栈君。

工具

  • upx:upx是一个开源的压缩壳工具,可以到github下载upx
  • Study_PE工具,可以到看雪论坛下载

upx简单的用法

upx src.exe命令将src.exe加壳
upx src.exe -o dst.exe命令将src.exe加壳并另存为dst.exe

upx手动脱壳

脱壳原理

平衡堆栈法(又称ESP定律,技巧法)

一般加壳程序在运行时,会先执行壳代码,然后在内存中恢复还原原程序,再跳转回原始OEP,执行原程序的代码,我们可以把壳代码理解为一个大的函数,既然是函数,那么进入函数和退出函数时,堆栈应该就是平衡的,基于这样的一种特性,我们可以在壳代码操作了堆栈之后,对堆栈设置访问断点,然后让程序跑起来,当程序暂停的时候,就是壳代码即将执行完的时候,然后在其附近单步跟踪,就可以找到原始OEP了。这种方法比较适用于upx这种只对代码和数据压缩了的壳,如果还对代码加密了,那么就不是太好找了。加密的话就需要结合单步跟踪法。

开始实验

首先写一个demo程序,用upx加壳,操作如下:
在这里插入图片描述
没有加壳之前,程序的入口地址为:“ImageBase + AddressOfEntryPoint = 0x004014C0“`
在这里插入图片描述
OD加载之后也可以看到程序载入内存之后的入口地址:
在这里插入图片描述

节区如下,一共有7个节区
在这里插入图片描述

加壳之后

入口地址发生了变化
在这里插入图片描述

节区的变化,之前有7个节区,现在只有3个节区
在这里插入图片描述
通过Study_PE也检测出了壳程序位UPX
在这里插入图片描述

加壳程序分析

使用OD加载程序,可以看到OD也提示程序已经被加密或者压缩,壳程序正是对原有程序做压缩或者加密,以达到保护程序,减少程序大小的目的。
在这里插入图片描述

OD加载程序之后,可以看到第一条指令为pushad指令。对于壳程序,先pushad,首先将EAX, ECX, EDX, EBX, ESP, EBP, ESI, and EDI寄存器的值压栈,它的作用的保存寄存器的状态,执行壳程序解压(解密)原程序,最后popad恢复寄存器状态,跳到OEP执行原程序

在这里插入图片描述
执行pushad指令之后,在ESP内存下硬件访问断点,再次访问到ESP的时候说明壳程序运行结束。按下F9,执行到断点处。

在这里插入图片描述
可以看到上一条指令是popad,执行与pushad相反的操作,恢复寄存器状态。

在这里插入图片描述
在不远处看到一个大的跳转,jmp demo_upx.004014C0,这里是跳到程序的OEP。

实际上在分析时,我们是先单步到jmp跳转到的代码进行观察之后得出是否是原始OEP的结论的,这个部分需要我们对未加壳程序的OEP要有所了解,比如VC6.0的程序一般OEP最开始的一个API调用是GetVersion,看OEP见到GetVersion就如见到了vc6.0程序。

我们单步到跳转之后的代码处,0x004014C0这个地方就是原始OEP,而后我们要做的就是在这个地方进行dump。

在这里插入图片描述
在这里插入图片描述

至此,我们已经将upx壳脱掉,并将脱壳的程序命名为dump.exe。但是脱壳之后的程序是无法运行的,这时需要修复导入地址表IAT。

IAT修复

大量实验表明,IAT并不一定位于在导入表中。IAT可以位于程序中任何具有写权限的地方,只要当可执行程序运行起来时,操作系统可以定位到这些IID项,然后根据IAT中标明的API函数名称获取到函数地址即可。

下面我们来总结一下操作系统填充IAT的具体步骤:参考来源

  1. 定位导入表
  2. 解析第一个IID项,根据IID中的第4个字段定位DLL的名称
  3. 根据IID项的第5个字段DLL对应的IAT项的起始地址
  4. 根据IAT中的指针定位到相应API函数名称字符串
  5. 通过GetProcAddress获取API函数的地址并填充到IAT中
  6. 当定位到的IAT项为零的时候表示该DLL的API函数地址获取完毕了,接着继续解析第二个IID,重复上面的步骤。

参考

https://zhuanlan.zhihu.com/p/34263050

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161716.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • secure crt中文乱码_securecrt中文乱码怎么办

    secure crt中文乱码_securecrt中文乱码怎么办20190226-SecureCRT连接linux显示中文乱码

    2022年4月21日
    63
  • LoadRunner11.00安装&使用教程[通俗易懂]

    LoadRunner11.00安装&使用教程[通俗易懂]本教程分为四部分内容:安装序言:由于LoadRunner12.02或者12.53版本是HP公司推出的自带免费50个虚拟用户进行压力测试的版本,目的为了工程师去学习与了解的该工具。为了增大压力(增加虚拟用户数)到达高并发的性能测试,采用LoadRunner11.00,增加对应的Lice…

    2025年11月11日
    4
  • 联想服务器怎么拆硬盘,联想ThinkStation P900工作站高清拆解[通俗易懂]

    联想服务器怎么拆硬盘,联想ThinkStation P900工作站高清拆解[通俗易懂]【IT168厂商动态】联想不久前推出了全新一代ThinkStationP系列工作站家族,颠覆以往命名,启用以“P”开头的全新命名规则,包括从入门级到旗舰级应用的ThinkStationP300、ThinkStationP500、ThinkStationP700和ThinkStationP900四款产品,而今天我们就对号称“史上最强工作站”的ThinkStationP900进行了拆解。联…

    2022年5月23日
    70
  • java json序列化日期类型[通俗易懂]

    java json序列化日期类型[通俗易懂]做接口开发时经常需要给前端返回日期数据,比如生日、创建时间、更新时间等。我们一般是建一个bean,将定义所需要的字段,并和数据库的字段相对应。虽然数据库的字段是日期类型的,但bean的字段定义在String就行了,看下面的测试代码:packagecom.bs.test;importjava.text.SimpleDateFormat;importjava.util.Date;importc

    2025年6月9日
    4
  • 五种MATLAB画圆方式程序「建议收藏」

    五种MATLAB画圆方式程序「建议收藏」clear,clc%方法一:使用隐函数的方法来绘制.holdonezplot(‘x^2+y^2-8′)%方法二:转换成参数函数来绘制图形.symsxytx=2*sin(t);y=2*cos(t);%程序如下:t=0:pi/100:2*pi;x=2*sin(t);y=2*cos(t);plot(x,y,’r’)%方法三:转换成匿名函数来绘制图形.t1=0:pi/100:2*pi;x1=@(tt)2*sin(tt)+1;y1=@(tt)2*cos(tt)+2;..

    2022年6月19日
    93
  • 新经济政策商品经济_2021年国际商务热点

    新经济政策商品经济_2021年国际商务热点新经济的50个新热点2005-06-2114:09  中国机电企业网10多年来,新经济一直沿着“技术发展”和“应用创新”这两个方向奔跑。  这两个方向可以被看作既分立又统一的一对“双螺旋”——技术发展创造了应用的创新环境,而应用的创新往往很快就会触到技术的极限,进而鞭策技术的进一步演进。  在技术和应用这两条线上都可以诞生出引人入胜的商业创意,但是只有当技术和应用的激烈碰撞达到一定的融合程

    2022年10月5日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号