软件加壳和脱壳的基础原理

目录


加壳和脱壳在安全领域非常常见,但原理是什么?

软件加壳脱壳这个领域非常专业(麻烦且复杂),下文只从宏观的视角来理解其中的运行原理即可。只是入门了解,毕竟专业的事,还得让专业人来干。

复杂是因为,不同的系统在加载程序的流程不同,且流程链条环节非常长。


加壳原理

"壳"的具象理解就类似花生壳,用来保护里面的花生仁。人想吃到里面果实,就需要将其剥掉。

软件也存在这样类似的东西,这种东西我们也称之为"壳",两者的目标都是一样的,都是用来保护,而"壳"用来保护可执行程序资源,避免被其他人窥探。

壳根据作用,一般分为两种:

  • 压缩壳
  • 加密壳

无论哪种原理都是大致是相同的。我们给自身软件加壳后,就会产生出一个新程序,新程序是由原程序两部分组成。

系统在执行这个新程序的时候,先执行壳,由壳对原程序进行解密并还原到内存中去,接着在执行原来的程序。

由此,了解的壳的定义:

新程序(已加壳) = 壳程序 + 加壳流程 + 原程序

开发人员对原程序加壳的工作流程(加壳原理):

  1. 压缩/加密:对原始程序的代码段、数据段等关键部分进行压缩或加密,使其变成一堆"乱码"。

  2. 植入外壳:生成一个外壳程序,并将加密/压缩后的原始程序数据作为一部分附加在这个外壳程序后面。

  3. 修改入口点:修改生成的可执行文件的"程序入口点"(OEP, Original Entry Point),使其指向外壳程序的代码,而不是原始程序的代码。

加壳后的程序,在系统里的执行流程:

  1. 用户双击加壳后的程序。

  2. 操作系统加载器将程序读入内存。此时,内存中的代码是外壳的代码,原始程序部分仍是加密/压缩状态。

  3. CPU 开始执行外壳代码。

  4. 外壳程序开始工作:

    • 检查自身是否被调试。
    • 解密解压缩 内存中的原始程序数据。
    • 进行必要的环境修复(如重建导入表)。
  5. 外壳程序将 CPU 的执行流跳转到原始程序的真正入口点(OEP)。

  6. 至此,原始程序开始正常运行,和执行原程序一样效果。


脱壳原理

理解了加壳后,脱壳就很好理解了,就是逆回来操作一次。

什么是脱壳?

摘掉壳程序,将加密/压缩后可执行文件还原出来。

脱壳的基本原理:

脱壳的核心思想是 "内存转储"。因为无论外壳多么复杂(加密多完好),它最终都必须在内存中将原始程序完整地、可执行地还原出来。 脱壳就是要抓住这个瞬间。

脱壳的方法:


对抗与演进

加壳与脱壳就像是一场永无休止的"军备竞赛"。

壳的进化:出现了 VMProtect, Themida 等"强壳"。它们使用虚拟机保护技术,将原始代码翻译成自定义的指令集,极大地增加了分析和脱壳的难度。

脱壳技术的进化:出现了自动脱壳机、脚本、以及更高级的动态和静态分析技术,专门研究VMProtect, Themida 等虚拟机保护技术的人员。

相关推荐
浩浩测试一下2 天前
汇编 16位32位64位通用寄存器(逆向分析)
汇编·windows·stm32·单片机·嵌入式硬件·逆向·二进制
Lang-12103 天前
Frida + Android Hook 完整指南
android·逆向·hook·frida
浩浩测试一下3 天前
汇编 标志位寄存器 (逆向分析 )
c语言·汇编·逆向·windows编程·标志寄存器
浩浩测试一下3 天前
汇编 数组与串指令(逆向分析)
汇编·逆向·二进制·免杀·串指令·汇编数组
程序0073 天前
.NET玩转爬虫 遇到反爬 jsl cookie
逆向
RSCompany4 天前
Frida 17 以后 Python API 跑旧版 JS 报 Java is not defined ?一行 import 直接恢复 Frida 16 体验
开发语言·python·逆向·hook·frida·android逆向·frida17
浩浩测试一下4 天前
汇编中的JCC指令 (逆向分析)
汇编·逆向·标志位·jcc指令·跳转指令·标志位寄存器
浩浩测试一下4 天前
汇编中的段与段寄存器(大小)段序 (逆向分析)
汇编·逆向·二进制·字节序·windows编程·内存地址排序
浩浩测试一下6 天前
汇编 位运算 (逆向分析)
汇编·逆向·位运算·asm·windows编程·二进制逆向
浩浩测试一下6 天前
汇编 高低八位寄存器数据存储方式(逆向分析)
汇编·网络安全·逆向·二进制·免杀·寄存器·windows编程