当前位置: 首页 > news >正文

压缩壳学习

壳是什么

壳就是软件的一个保护套,防止软件被进行反编译或被轻易地修改。

其作用就是为了保护软件。

常见的大类壳有压缩壳、加密壳、VM 壳的分类。

压缩壳顾名思义就是用来减小软件的文件大小的;加密壳,通过加密软件来保护软件;VM壳利用了虚拟机技术,可以很有效的保护指定地址代码,但很大的牺牲了效率,所以一般只在关键代码处使用。

压缩壳

压缩壳的常见类型upx、aspack、fsg、Aspack Scrambler、ExeStealth、 n Protector、V2Packer、WWPack32、XComp0.98、 BeRoEXEPacker、dePACK、ExeShield Protector、KByS、NsPacK、tElock、 Nspack  PECompect Petite  winUpack
本文重点讲一下upx壳

UPX压缩壳

原理

其采用高效的压缩算法,对可执行文件的代码段、数据段等进行压缩处理。它通过优化文件结构,减少冗余数据,实现文件体积的大幅缩减。在对软件进行压缩的时候也对文件进行了修改。

在压缩过程中,UPX 会修改文件的入口点,将控制权转移到解压代码部分。当程序运行时,首先执行的是 UPX 的解压代码,解压完成后才会跳转到原始程序的入口点,从而确保程序正常运行。

经过UPX加壳(压缩)后的文件格式:

new eheader(64 bytes) (文件头)
+ new pheader(56 bytes) * 3 (程序头表)
+ l_info(12 bytes)
+ p_info(12 bytes)
+ b_info(12 bytes) + compressed block (原程序文件头和程序头表)
+ b_info(12 bytes) + compressed block (第一个类型为PT_LOAD的段中除原程序文件头和程序头表的部分)
+ b_info(12 bytes) + compressed block (第二个类型为PT_LOAD的段)
+ ......
+ fpad8 (8字节对齐)
+ int(4 bytes) (第一个b_info的文件偏移)
+ int(4 bytes) (当前位置的文件偏移,也就是之前所有数据总长度)
+ loader (加载器,也就是脱壳代码)
+ b_info(12 bytes) + compressed block (第一个PT_LOAD和第二个PT_LOAD中间的数据)
+ b_info(12 bytes) + compressed block (第二个PT_LOAD和第三个PT_LOAD中间的数据)
+ ......
+ b_info(12 bytes) + compressed block (最后一个PT_LOAD到文件末尾之间的数据)
+ 00 00 00 00 55 50 58 21 00 00 00 00 (b_info)
+ fpad4 (4字节对齐)
+ PackHeader(32 bytes)
+ int(4 bytes) (p_info的文件偏移)

其中,b_info、l_info和p_info是三个结构体。

详见这篇文章[原创] UPX源码学习和简单修改-加壳脱壳-看雪-安全社区|安全招聘|kanxue.com

UPX加壳后程序运行原理

流程大致为:这里就能明白为什么UPX壳下的文件用010打开会看到特别多的0了

讲述一下这个流程:首先是将原文件进行压缩,压缩后会留出一个空节(这是不可删除的,对后续的解压缩有用。)

在进行解压缩的时候或者叫启动程序的时候,会申请内存,其内部包含空字节

1.先映射头部,PE头必映射

2.映射数据,将解压缩代码和压缩数据映射进内存

3.把各种表进行处理

4.开始运行,首先运行解压缩代码,运行后跑压缩数据,就会将压缩数据还原到空节上,进行填充

5.执行完解压缩代码后,跑到节区1去执行数据

但是当加了UPX壳后通常我们是无法在ida打开后看到正常的数据

脱壳

普通的脱壳---工具脱壳

通常我们遇到UPX壳是通过工具直接进行脱壳,用upx.exe在命令行里进行脱壳,进入upx.exe所在文件夹,然后输入upx -d <文件名>,就可以脱壳成功了。

但是在进行upx脱壳之前要先进行查壳,一是查看有无壳,二是查看是什么壳。如果是upx壳,就可以用前面的方法进行脱壳

一个简单的示例

NSSCTF | 在线CTF平台

首先我们得到附件后用exeinfo pe查壳可以在下方看到是upx壳,64位的,那么我们就打开命令行进行脱壳这样就是脱壳成功了,脱壳成功后将其拖进ida64查看,然后就可以查看原始的数据了

但是当遇到魔改特征的壳时,用upx.exe就行不通了

魔改特征的壳的处理

1.区段名被修改

我们就用刚才的文件用010打开看看,可以看到现在的区段名仍时UPX,能够直接用upx.exe去脱壳的,但是如果我们将他改变为APX,再进行查壳,可以看到信息有所更改与前文相比对就能轻易发现差别。此时再去直接进行工具脱壳就是行不通的了

解决方法

这种方法的解决还算比较简单。用010打开后更改为UPX,然后去cmd脱壳。

2.版本信息抹去

因为进行upx脱壳是需要正确的版本信息的,如果被删掉会导致无法脱壳,那么就只能选择手脱壳

其主要步骤就是用studype将地址固定,然后动调找oep(程序原入口),再进行IAT修复,最后修复转储再进行运行

【星盟安全】Re系列教程 第7节 加壳与脱壳_哔哩哔哩_bilibili

相关文章:

  • 3.21学习总结Java
  • 第27章:Ingress控制器实战:Nginx Ingress与Kong Gateway
  • 数据库系列之:Sqlserver 表开启cdc后,对应的ct表数据保存时间
  • Ligolo-ng 保姆级使用指南:新一代隧道代理工具(OSCP适用)
  • 天闻数媒名师工作室系统 fileTempDownload 存在文件读取漏洞(DVB-2025-8998)
  • 华为云Flexus L实例和X实例有啥区别?云服务器Flexus全解析
  • 105. 有向图的完全联通
  • LangChain 基础
  • 【AI News | 20250322】每日AI进展
  • C++进阶——类与对象
  • 基于物理信息强化学习的非线性系统最优控制
  • Java面试黄金宝典10
  • CSRF SSRF RCE
  • Django 生产环境静态文件处理
  • 代码随想录算法训练营第十四天(2)|151.翻转字符串里的单词
  • Python Cookbook-4.9 从字典中取值
  • 探索 Ollama:开源大语言模型平台的无限可能​
  • 《大话数据结构》学习记录----第三章线性表
  • SPI 机制与 Spring Boot AutoConfiguration 对比解析
  • 基于linux平台的C语言入门教程(7)类型转换
  • 世界人形机器人运动会将在北京“双奥场馆”举行
  • 农行原首席专家兼浙江省分行原行长冯建龙主动投案被查
  • 降准又降息!央行发布3类10项措施
  • 澳大利亚工党可以靠“回避”胜选,但继续执政需要更多勇气
  • 竞彩湃|巴萨客场淘汰国际米兰,巴黎双杀阿森纳
  • 新华社:赵心童世锦赛夺冠,中国书写斯诺克运动新历史