软件保护技术:加壳与脱壳

2023-12-31 05:20

本文主要是介绍软件保护技术:加壳与脱壳,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

加壳原理浅析:

1.什么是壳:

专门负责对程序体积进行压缩,或者是保护一个程序不被非法修改、逆向分析的一类软件。

壳通过附加自身代码在保护对象(原始程序)上,在操作系统对原始程序代码进行执行只求按获得程序控制权,进而对原始程序进行解压或解密等还原操作,完成操作后控制权将还给原始程序,程序的元时代吗才开始被执行。

2.壳的分类:

  • 侧重于缩小程序体积,称为压缩壳,经典压缩壳软件:UPXASPack
  • 侧重于程序代码及数据加密,称为加密壳,经典加密壳软件有VMProtectASProrectThemidaEXECryprorSafengine等、其中VMP、Themida的特色是指令虚拟化,保护强度极高

3.壳的加载过程:

  • 入口现场保存

    可执行文件被操作系统载入后开始执行前,寄存器内会存放一些操作系统预先填充好的值,栈的数据也会被设置,壳程序要保存这些数据(状态),以免其被壳段代码不经意间地破坏,在转交控制权前壳需要恢复这些数据,才能让原来的程序正常运行。

    一般情况下,由于已有栈的内容是不应更改的,简单的壳会选择将这样的信息压入栈(在栈上开辟新的空间),x86的汇编指令 pushad 可以轻松地将所有寄存器一次性压入栈,UPX使用了这样的方式,被形象地称为“保护现场”。

  • 获取壳自身解密程序所需API的地址

    外壳的输入表中往往只有GetProcAddress / LoadLibrary / GetModuleHandle等最基本的函数,有的可能只包含-个GelProcAddress,完全不够满足解密程序过程涉及到的许多操作,因此需要事先用以上几个函数获得其他函数地址以便壳段代码使用。

  • 解密原程序的各个区块(Section)的数据

    壳出于保护原程序代码和数据的目的,-般都会加密原程序文件的各个区块。在程序执行时外壳将会对这些区块数据解密,以让程序能正常运行。壳般是按区块加密的,那么在解密时也按区块解密,并且把解密的区块数据按照原区块的定义放在合适的内存位置,或者放置到由加壳程序调整后的位置。

  • 初始化IAT,导入原程序所需系统API地址

  • 调整重定位项

  • Hook API,实现一些保护功能(可选)

  • 恢复入口现场,跳转至OEP(Original Entry Point,原入口点),转交控制权

4.如何寻找原入口点(OEP)

  1. 根据跨段指令寻找OEP:

    绝大多数加壳程序会在被加密的程序中加上一个或多个段(section),在最后跳转值OEP时一般都是通过跨段跳转指令进行转移,所以依据跨度的转移指令(远jmp等),就可找到真正的入口点,在该跳转指令前一般会有POPAD/POPFD指令出现(用于恢复入口现场),可以用作定位参考。(PUSHAD是保存通用寄存器,POPFD是保存状态寄存器,jmp的机械代码是19开头)

    在这里插入图片描述

    UPX用了一次跨段的转移指令,(远JMP,指令以E9开头),在跳至OEP的指令处可以看到虚拟地址的值有一个明显突变,

    据此可以确定OEP的位置0x555544

  2. 根据堆栈平衡原理寻找OEP:

    该方法是用“ESP定律”,对绝大部分的压缩壳都很有效,原理便是基于栈平衡。

    壳段代码在保护现场后,我们对ESP指向的内存单元下硬件访问断点,那么在壳段代码恢复现场时一定会访问到这个单元,此时我们EIP所处的位置处于壳段代码末尾,距离跳转至OEP也就不远了

调试壳:(以UPX壳为例)

  • 示例程序

    将后缀改回exe

    notepad.txt

    notepad_upx.txt

    tips:程序来自《逆向工程核心原理》一书

加壳前后对比:

首先查看在未加壳是notepad的EP代码,以及PE结构:

在这里插入图片描述

在这里插入图片描述

在未加壳时程序的PE结构为正常的代码段、数据段以及资源段

然后对比以下加壳后的程序:

在这里插入图片描述

原来的加壳后程序的PE结构被改变了,段名变为了UPX0、UPX1。

调试程序notepad_upx.exe

用OD打开notepad_upx程序:

在这里插入图片描述

在程序的开始,可以看到和之前介绍的一样,壳加载的第一步就是对入口现场的保存,然后分别把UPX1的起始地址设置到esi寄存器,将UPX0的起始地址设置到edi寄存器。

tips:UPX文件的第一个节区仅存在于内存,该处及是解压缩后保存源文件代码的地方。也就是说,解压缩过程就是对节区UPX1进行解密,并将解密后的内容保存到EDI所指向的UPX0节区。

01015330 > $  60            pushad
01015331   .  BE 00100101   mov esi,notepad_.01011000
01015336   .  8DBE 0000FFFF lea edi,dword ptr ds:[esi-0x10000]

循环一:

CTRL+F8开始跟踪代码,观察程序运行,当程序运行到第一个循环时按F7停下来,观察该循环的作用:

在这里插入图片描述

这段代码的作用就是将EDX指向的内存数据一个字节一个字节的拷贝到EDI指向的内存地址处,查看寄存器,EDX所指向的地址为UPX0节区的起始地址,查看对应地址的内存数据:

在这里插入图片描述

全是NULL,这个循环的作用是确保写入的目标地址为空,在010153E6地址处设置断点,F9跳过该循环。

循环二:

继续CTRL+F8,会遇到一个较大的循环,这个循环为正式的解压缩循环

在这里插入图片描述

AL存放ESI中的数据,经过解压缩运算后存入EDI指向的内存地址中,解压缩过程没看懂。

循环三:

继续跟踪代码

在这里插入图片描述

这段循环代码用于恢复源代码的CALL/JMP指令的地址

循环四:

在这里插入图片描述

这个循环用于恢复IAT表,在01015436地址处设置EDI=01014000,它指向第二个节区(UPX1)区域,该区域中保存着原notepad.exe调用的API函数名称的字符串。

UPX压缩原notepad.exe文件时,它会分析其IAT,提取出程序中调用的API名称列表,形成API名称字符串。
用这些API名称字符串调用01015467地址处的GetProcAddress(0函数,获取API的起始地址,然后把API地址输入EBX寄存器所指的原notepad.exe的IAT区域。该过程会反复进行至API名称字符串结束,最终恢复原notepad.exe的IAT。

跳转至OEP:

在这里插入图片描述

notepad.exe全部解压缩完成后,应该将程序的控制返回到OEP处。

010154AD地址处的POPAD命令与UPX代码的第一条PUSHAD命令对应,用来把当前寄存器恢复原状最终,使用010154BB地址处的JMP命令跳转到OEP处,要跳转到的目标地址为0100739D,它就是原notepad.exe的EP地址。

将解压缩后的代码DUMP下来:

OD提供了一个叫OllyDump的插件:

在这里插入图片描述

这个插件可以自动将当前EIP作为OEP输入,直接选择脱壳即可,IAT表也会自动修复。

在这里插入图片描述

将脱壳后的程序放到EXEinfo里面查一下壳:

在这里插入图片描述

可以看到已经脱壳成功了。

相关实操案例:

CTF中手工脱壳实例(UPX壳)

WinUpack壳分析

这篇关于软件保护技术:加壳与脱壳的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/555058

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

Android逆向(反调,脱壳,过ssl证书脚本)

文章目录 总结 基础Android基础工具 定位关键代码页面activity定位数据包参数定位堆栈追踪 编写反调脱壳好用的脚本过ssl证书校验抓包反调的脚本打印堆栈bilibili反调的脚本 总结 暑假做了两个月的Android逆向,记录一下自己学到的东西。对于app渗透有了一些思路。 这两个月主要做的是代码分析,对于分析完后的持久化等没有学习。主要是如何反编译源码,如何找到

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的

SSM项目使用AOP技术进行日志记录

本步骤只记录完成切面所需的必要代码 本人开发中遇到的问题: 切面一直切不进去,最后发现需要在springMVC的核心配置文件中中开启注解驱动才可以,只在spring的核心配置文件中开启是不会在web项目中生效的。 之后按照下面的代码进行配置,然后前端在访问controller层中的路径时即可观察到日志已经被正常记录到数据库,代码中有部分注释,看不懂的可以参照注释。接下来进入正题 1、导入m