目录
第三章:程序壳类型和脱壳方法
简单谈谈壳
壳的分类和对策
一、压缩壳
尝试自动脱壳
手动脱壳
二、加密壳
三、VM 壳
小结
下一章
上一章投票:脱壳1票,动态分析1票。那么我先从脱壳讲起吧。
第三章:程序壳类型和脱壳方法
简单谈谈壳
简单来说,程序壳是一种软件保护技术,通常用于对程序进行压缩、加密或反调试处理,以防止逆向工程和破解。
在做逆向题时,最常见的是UPX壳,大部分都可以用工具脱壳,小部分是魔改壳,需要手动脱壳。
IDA打开带有UPX壳的程序
壳的分类和对策
程序壳可以由原理分几大类,在赛场上比较常见的是以下的几种:
维度压缩壳加密壳VM 壳核心目的减小体积防静态分析防动态 / 静态分析逆向难度低(自动工具可解)中(需绕过反调试)极高(需逆向 VM 指令集)典型操作压缩→解压加密→解密→反调试指令转换→VM 解释执行脱壳关键定位 OEP 后直接 dump绕过反调试 + 修复 IAT逆向 VM 指令集 + 代码重建
总结一个解题步骤
一、压缩壳
核心功能:压缩程序代码 / 数据以减小体积,运行时自动解压。反逆向原理:提前压缩代码,运行时解压,因为IDA静态分析不执行程序,因此无法看到原本程序。
压缩壳核心特点脱壳难度UPX逆向题目最常见的程序壳,简单题多数可以用程序自带脱壳命令(upx -d 程序地址)自动脱壳,部分魔改需要手动脱壳。★☆☆☆☆ASPack压缩率略高于 UPX,加入简单 CRC 校验防止篡改。用Aspackstripper自动脱壳。不常见PECompact支持 “固实压缩”(将所有区段合并压缩),压缩后体积更小,但解压速度较慢。不常见
下以64位程序的UPX壳为例
显示明显的红色字体:UPX(3.96)
尝试自动脱壳
upx自动脱壳网上有非常详细的教程,这里就不复述了。
成功了,因此可以直接进行常规分析流程(第三章讲过)
手动脱壳
如果自动脱壳不成功,那么就需要手动脱壳,或者修复后再自动脱壳。我们先不介绍魔改壳,因为我也不是很熟。先展示手动脱常规UPX壳。不同位数的脱壳不一样。这个程序是64位的,先将程序拖入x64DBG。
这个界面真的会劝退很多初学者,不过没关系我会带着大家一步步走。
按下F9(运行),跳到默认断点,也就是看到很多个push的地方。接着按F8(单步),执行过push之后,右键右边的RSP,在弹出来的窗口点击“在内存窗口中转到”,右键左下角第一个00(栈顶)——断点——硬件,访问——4字节。
下好断点后,F9运行到很多个pop的地方,往下找大跳转,观察到箭头所指跳转地址很远,因此可以初步判断此次是主函数入口。直接按F8或者下断点执行到跳转函数,
跳转过去后,跟着图示步骤走。
得到 xxx_dump_SCY文件,就可以进入IDA分析了,和用工具脱壳结果还是有区别的,不过能解出flag就行。
手动脱壳程序的静态分析
剩下的两种壳一般用工具自动脱壳就行,手动脱壳就不讲了,一方面是不常见,一方面是我也不会。
二、加密壳
核心功能:加密程序内容,需解密后才能运行,防静态分析。代表: Themida/WinLicense(强加密 + 反调试)、Armadillo、VMProtect(虚拟机加密)。
加密壳核心特点脱壳难度Themida集成 AES 加密 + 多层反调试(检测虚拟机、内存断点)+ 代码虚拟化(部分功能),商业级防护。★★★★★Armadillo支持 “硬件绑定”(用 CPU / 主板 ID 生成密钥),加密后脱离原始机器无法运行,适合软件授权。★★★★☆Obsidium 轻量级加密 + 花指令混淆,反调试较弱但体积小,适合共享软件。★★★☆☆
三、VM 壳
核心功能:将程序指令转换为自定义虚拟机指令,逆向难度极高。代表:VMProtect、SVKP、TitanEngine。
VM 壳核心特点逆向难度VMProtect 支持 x86/x64/ARM 架构,VM 指令集动态生成(每次加壳不同),集成反调试 + 反 dump。★★★★★SVKP 轻量级 VM 壳,指令集简单(约 50 条),但混淆极强(大量无效指令)。★★★★☆TitanEngine企业级 VM 壳,支持 “VM 嵌套”(VM 引擎本身被另一层 VM 保护),几乎无法手动逆向。★★★★★
小结
加密壳和VM壳现在只做个了解就行了,难度太大了,UPX壳才是我们逆向题的常考点和重点。
脱壳这部分属于逆向的一个难点,特别是手动脱壳的部分,需要大量的练习熟悉流程以及应对不同的情况。多研究,总会成功的。
var code = "49e9e2dc-7677-4809-8765-8c2468d7637f"
下一章:动态分析