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

目录


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

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

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


加壳原理

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

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

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

  • 压缩壳
  • 加密壳

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

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

由此,了解的壳的定义:

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

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

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

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

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

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

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

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

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

  4. 外壳程序开始工作:

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

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


脱壳原理

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

什么是脱壳?

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

脱壳的基本原理:

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

脱壳的方法:


对抗与演进

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

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

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

相关推荐
NPE~13 小时前
[App逆向]脱壳实战
android·教程·逆向·android逆向·逆向分析
深念Y4 天前
Denuvo加密被全面攻破?聊聊D加密原理和这次的破解事件
人工智能·游戏·ai·逆向·虚拟机·虚拟·d加密
white-persist9 天前
逆向入门经典题:从 IDA 反编译坑点到 Python 解题详细分析解释
c语言·开发语言·数据结构·python·算法·逆向·安全架构
曼岛_11 天前
[逆向工程]160个CrackMe入门实战之Andrnalin.2解析(九)
java·数据库·microsoft·逆向
CYRUS STUDIO16 天前
Frida 检测与对抗实战:进程、maps、线程、符号全特征清除
android·逆向·frida
CYRUS_STUDIO16 天前
Frida 检测与对抗实战:进程、maps、线程、符号全特征清除
android·逆向
CYRUS STUDIO17 天前
Frida 源码编译全流程:自己动手编译 frida-server
android·安全·逆向
CYRUS_STUDIO17 天前
Frida 源码编译全流程:自己动手编译 frida-server
android·逆向
岁岁的O泡奶20 天前
NSSCTF_reverse_[SWPUCTF 2022 新生赛]base64——[HDCTF 2023]easy_re
经验分享·python·逆向
NPE~24 天前
[App逆向]环境搭建下篇 — — 逆向源码+hook实战
android·javascript·python·教程·逆向·hook·逆向分析