脱壳的艺术--3 断点和补丁检测技术

逆向工程实战:手动脱壳技术详解与工具应用 本文详细解析了手动脱壳技术的核心概念与实战技巧,包括压缩壳与加密壳的区别、必备工具配置、OEP定位方法及内存dump与导入表修复等关键步骤。特别介绍了ESP定律法和单步跟踪法等实用技巧,帮助逆向工程师有效应对各类软件保护机制,提升逆向分析能力。 阅读详情
概述:脱壳是门艺术——脱壳既是一种心理挑战,同时也是逆向领域最为激动人心的智力游戏之一。为了甄别或解决非常难的反逆向技巧,逆向分析人员有时不得不了解操作系统的一些底层知识,聪明和耐心也是成功脱壳的关键。这个挑战既牵涉到壳的创建者,也牵涉到那些决心躲过这些保护的脱壳者。
本文主要目的是介绍壳常用的反逆向技术,同时也探讨了可以用来躲过或禁用这些保护的技术及公开可用的工具。这些信息将使研究人员特别是恶意代码分析人员在分析加壳的恶意代码时能识别出这些技术,当这些反逆向技术阻碍其成功分析时能决定下一步的动作。第二个目的,这里介绍的信息也会被那些计划在软件中添加一些保护措施用来减缓逆向分析人员分析其受保护代码的速度的研究人员用到。当然没有什么能使一个熟练的、消息灵通的、坚定的逆向分析人员止步的。
关键词:逆向工程、壳、保护、反调试、反逆向
3 断点和补丁检测技术                                                          
本节列举了壳最常用的识别软件断点、硬件断点和补丁的方法。
3.1 Software Breakpoint Detection
软件断点是通过修改目标地址代码为0xCC(INT3/Breakpoint Interrupt)来设置的断点。壳通过在受保护的代码段和(或)API函数中扫描字节0xCC来识别软件断点。
示例
检测可能和下面一样简单:
cld
mov         edi,Protected_Code_Start
mov         ecx,Protected_Code_End - Protected_Code_Start
mov         al,0xcc
repne        scasb
jz             .breakpoint_found
有些壳对比较的字节值作了些运算使得检测变得不明显,例如:
if ( byte XOR 0x55 == 0x99 ) then breakpoint found
Where:  0x99 == 0xCC XOR 0x55
对策
如果软件断点被发现了逆向分析人员可以使用硬件断点来代替。如果需要在API内部下断,但是壳又检测API内部的断点,逆向分析人员可以在最终被ANSI版API调用的UNICODE版的API下断(如:用LoadLibraryExW代替LoadLibraryA),或者用相应的native API来代替。
3.2 Hardware Breakpoint Detection
另一种断点称之为硬件断点,硬件断点是通过设置名为Dr0到Dr7的调试寄存器12来实现的。Dr0-Dr3包含至多4个断点的地址,Dr6是个标志,它指示哪个断点被触发了,Dr7包含了控制4个硬件断点诸如启用/禁用或者中断于读/写的标志。
由于调试寄存器无法在Ring3下访问,硬件断点的检测需要执行一小段代码。壳利用了含有调试寄存器值的CONTEXT结构,CONTEXT结构可以通过传递给异常处理例程的ContextRecord参数来访问。
示例
这是一段查询调试寄存器的示例代码:
; set up exception handler
push         .exception_handler
push         dword [fs:0]
mov         [fs:0],esp
 
;eax will be 0xFFFFFFFF if hardware breakpoints are identified
xor           eax,eax
 
;throw an exception
mov         dword [eax],0
 
;restore exception handler
pop          dword [fs:0]
add          esp,4
 
;test if EAX was updated (breakpoint identified)
test           eax,eax
jnz           .breakpoint_found
:::
.exception_handler
;EAX = CONTEXT record
mov         eax,[esp+0xc]
 
;check if Debug Registers Context.Dr0-Dr3 is not zero
cmp         dword [eax+0x04],0
jne           .hardware_bp_found
cmp         dword [eax+0x08],0
jne           .hardware_bp_found
cmp         dword [eax+0x0c],0
jne           .hardware_bp_found
cmp         dword [eax+0x10],0
jne           .hardware_bp_found
jmp          .exception_ret
 
.hardware_bp_found
;set Context.EAX to signal breakpoint found
mov         dword [eax+0xb0],0xFFFFFFFF
 
.exception_ret
;set Context.EIP upon return
add          dword [eax+0xb8],6
xor           eax,eax
retn
有些壳也利用调试寄存器的值作为解密密钥的一部分。这些调试寄存器要么初始化为一个特定值要么为0。因此,如果这些调试寄存器被修改,解密将会失败。当解密的代码是受保护的程序或者脱壳代码的一部分的时候,将导致无效指令并造成程序一些意想不到的终止。
对策
如果壳没检测软件断点,逆向分析人员可以尝试使用软件断点,同样OllyDbg的内存读/写断点也可以使用。当逆向分析人员需要设置API断点的时候在native或者是UNICODE版的API内部设软件断点也是可行的。
3.3 Patching Detection via Code Checksum Calculation
补丁检测技术能识别壳的代码是否被修改(代码被修改则意味着反调试例程已经被禁用了),其次也能识别是否设置了软件断点。补丁检测是通过代码校验来实现的,校验计算包括从简单到复杂的校验和/哈希算法。
示例
下面是一个比较简单的校验和计算的例子:
mov                esi,Protected_Code_Start
mov                ecx,Protected_Code_End - Protected_Code_Start
xor                  eax,eax
.checksum_loop
movzx             ebx,byte [esi]
add                 eax,ebx
rol                  eax,1
inc                  esi
loop                .checksum_loop
 
cmp               eax,dword [.dwCorrectChecksum]
jne                  .patch_found
对策
如果代码校验例程识别出了软件断点,可以用硬件断点来代替。如果校验例程识别出了代码补丁,逆向分析人员可以通过在补丁地址设置内存访问断点来定位校验例程所在,一旦发现了校验例程,可以修改校验和为预期的值或者在比较失败后修改适当的标志。

 
脱壳工具全解析:从原理到实战,逆向工程必备技能 在软件安全与逆向工程领域,脱壳是一项基础且关键的技术。其核心原理在于移除软件的保护层,还原原始代码逻辑,以便进行安全分析、漏洞研究或学习借鉴。从技术实现看,脱壳主要分为静态脱壳与动态脱壳两大类:静态脱壳器依赖于已知壳的签名算法进行自动化解包,而动态脱壳则借助调试器在内存中捕获解密后的代码镜像,再通过修复导入表等步骤重建可执行文件。掌握这些技术不仅能提升恶意软件分析效率,也对软件兼容性调试、代码审计等场景具有重要价值。本文以x64dbg、Scylla等主流工具为例,深入剖析在不同实战场景下的工具选型与组合策略 阅读详情

相关推荐

多线程访问共享资源的解决方案

在多线程编程中,合理地同步对共享资源的访问是至关重要的。了解和选择合适的同步机制可以帮助避免数据竞争和死锁等问题,确保程序的稳定和高效。C++标准库提供了多种同步原语,如互斥锁、读写锁和条件变量等,它们是线程安全编程的有力工具。在实践中,应当根据具体的应用场景选择合适的同步机制,注意锁的使用,并保持对性能的考虑。通过精心设计和测试,我们能够开发出既安全又高效的多线程应用程序。

程序猿老樊的博客 1506

用阿狸狗装Cadence17.4的操作细节

以后有大把的时间用Cadence, 准备倒向Cadence了.用阿狸狗装Cadence17.4, 开始2回都在本本上装, 都失败了. 后来在台式机上装成功了, 大概知道错在哪里了.记录一下.心急的同学看文章最后的总结, 包你一次安装成功.用阿狸狗装原版(手工装确实麻烦, 阿狸狗装原版确实很赞)手工装补丁包, 不用干预, 也不用输入任何信息, 直接装完手工装补丁包是很重要的, 现在阿狸狗装补丁包有bug, 在某些计算机上装不成功。

博客标题不能为空 3万+

【免费】最新区块链钱包和私钥的助记词碰撞器,使用python开发

最新钱包私钥助记词碰撞器,搏一搏单车变摩托!

weixin_48529185的博客 1万+

-bash: patch: command not found

没有安装 patch 命令包 执行 yum -y install patch 安装

y368769的博客 4351

SRC漏洞挖掘实战指南:从零入门到月入过万的网络安全副业

网络安全的核心在于识别和修复系统缺陷,其中逻辑漏洞与信息泄露是常见的安全风险。其原理在于应用程序在业务逻辑设计或数据处理过程中存在缺陷,导致未授权访问或敏感数据暴露。掌握这些技术对于构建安全的应用体系至关重要,不仅能有效防范攻击,也为安全研究人员提供了将技术能力变现的合法途径。在漏洞赏金(Bug Bounty)和SRC(安全应急响应中心)等应用场景中,白帽子通过系统化的测试方法,挖掘此类漏洞,既能获得经济回报,又能积累宝贵的实战经验。本文聚焦于逻辑漏洞与信息泄露的实战挖掘技巧,为初学者提供清晰的入门路径和效

weixin_28568819的博客 351

量化实战:如何用Barra多因子模型给你的投资组合做一次‘风险体检’?

本文详细介绍了如何利用Barra多因子模型对投资组合进行全面的风险体检,帮助投资者识别行业和风格因子的风险暴露。通过实战案例和Python代码示例,展示了数据采集、风险归因和组合优化的完整流程,提升投资组合的风险调整收益。

weixin_27215337的博客 326

关于VEH+硬件断点打内存补丁 实现细节

点击打开链接

LLC 2729

Cyclone MAX独立编程实战:从硬件接口到SAP镜像的嵌入式烧录指南

在嵌入式系统开发与量产中,固件烧录是连接软件与硬件的关键环节。其核心原理是通过特定的调试接口(如JTAG、BDM)和编程算法,将编译后的机器码写入目标处理器的非易失性存储器。这项技术的价值在于确保软件在硬件上的可靠部署,是产品功能实现和质量保证的基础,广泛应用于汽车电子、工业控制等对一致性与可靠性要求极高的领域。独立编程器(Stand-Alone Programmer)在此基础上,通过集成存储、交互界面和任务逻辑,实现了脱离PC的自动化操作,极大提升了产线效率和现场维护的便捷性。本文以Cyclone MAX

weixin_34038293的博客 468

漏洞补丁存在性检测技术洞察

二进制漏洞补丁存下性检测技术,总体来说是技术难度极大,通过依靠传统检测方法无法很好的解决编译影响因素导致的检测鲁棒性,但随着AI技术的引入,特别是LLM大语言模型的涌现,模型对于二进制汇编代码语义理解能力的增强,对二进制代码克隆的检测能力在工业界工具中落地使用成为可能,我相信在不久的将来一定会有成熟的工具来实现已知漏洞补丁存下性检测。原文作者:安全技术猿。

hwxiaozhi的博客 1728

基于Simulink的鲸鱼优化算法(WOA)MPPT仿真

摘要:本文介绍了基于Simulink的鲸鱼优化算法(WOA)在光伏MPPT控制中的应用。WOA模拟座头鲸的"气泡网捕食策略",通过包围猎物、螺旋收缩和随机搜索三阶段动态平衡全局探索与局部开发能力,有效解决局部阴影导致的多峰P-V曲线问题。文章详细讲解了WOA-MPPT的Simulink建模过程,包括多峰光伏阵列建模、WOA控制器实现和Boost变换器控制。仿真结果显示,在三种典型工况下,WOA-MPPT的追踪效率>99.3%,动态响应时间<0.15s,性能优于传统算法。最后提出了混合WO

amy_mhd的博客 73

概念解析 | 雷达动态范围

这里存在一个动态范围的问题:强雷达发射信号和弱目标反射信号存在非常大的功率差异,比如传统的脉冲多普勒雷达动态范围可达90dB以上。随着上述技术的发展,预计未来十年雷达接收机动态范围将达到120dB以上,届时雷达的监视能力将得到极大增强。简单来说,雷达动态范围越大,表示接收机噪声越低,对强信号过载保护能力越强,就越能检测到弱信号目标。此外,部分新概念雷达对动态范围提出新的需求,如被动雷达动态范围需大于100dB。当前,随着阵列雷达和数字雷达技术的发展,对雷达接收机动态范围提出了更高要求。

NLOS的博客 1051

脱壳的艺术(Anti-debug),调试器检测技术

概述:脱壳是门艺术——脱壳既是一种心理挑战,同时也是逆向领域最为激动人心的智力游戏之一。为了甄别或解决非常难的反逆向技巧,逆向分析人员有时不得不了解操作系统的一些底层知识,聪明和耐心也是成功脱壳的关键。这个挑战既牵涉到壳的创建者,也牵涉到那些决心躲过这些保护的脱壳者。 本文主要目的是介绍壳常用的反逆向技术,同时也探讨了可以用来躲过或禁用这些保护的技术及公开可用的工具。这些信息将使研究人员特别是恶

codemanrock 6251

Android插件化和组件化面试题及参考答案

如何使用 Gradle 来管理 Android 项目中的模块依赖? Gradle 是一个强大的构建工具,在 Android 项目中管理模块依赖主要通过以下方式。 首先,在项目的根目录下的 build.gradle 文件中,需要配置仓库。一般会添加如 Google 的 Maven 仓库和 JCenter 等,例如在 repositories 部分添加: repositories { google() jcenter() } 对于模块依赖,在每个模块(例如 app

大模型大数据攻城狮的专栏 1185

脱壳的艺术--7. 工具

  脱壳的艺术Mark Vincent Yason概述:脱壳是门艺术——脱壳既是一种心理挑战,同时也是逆向领域最为激动人心的智力游戏之一。为了甄别或解决非常难的反逆向技巧,逆向分析人员有时不得不了解操作系统的一些底层知识,聪明和耐心也是成功脱壳的关键。这个挑战既牵涉到壳的创建者,也牵涉到那些决心躲过这些保护的脱壳者。本文主要目的是介绍壳常用的反逆向技术,同时也探讨了可以用来躲过或禁

FISH 的专栏 1468

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

手动脱壳实战:从原理到工具链,逆向工程核心技能详解

在软件安全与逆向工程领域,加壳技术是一种常见的代码保护手段,其核心原理是通过加密、压缩或混淆等方式,改变可执行文件的原始形态,以对抗静态分析与逆向工程。理解其工作原理,对于进行安全评估、漏洞分析或学习优秀软件架构至关重要。从技术价值看,掌握手动脱壳能力,意味着能够深入操作系统底层,洞悉程序从加载、解密到执行的全过程,是安全研究员和底层开发者的核心技能之一。其应用场景广泛,包括恶意软件分析、软件漏洞挖掘、第三方组件安全审计以及合法软件的互操作性研究等。本文将聚焦于手动脱壳的通用思路与实战工具链,深入探讨如何动

388

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

[原创]反调试技巧总结-原理和实现(1)(2)(3)(4)(5)(6)......

反调试技巧总结-原理和实现 ------------------------------------------------------------------------------------------------------- 2008.8.7shellwolf 一、 前言 前段学习反调试和vc,写了antidebug-tester,经常会收到message...

207

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

反调试技巧总结-原理和实现

https://www.cnblogs.com/blueprincess/p/3655626.html 一、 前言     前段学习反调试和vc,写了antidebug-tester,做个简单的总结,说明下实现原理和实现方法。     部分代码和参考资料来源: 1、<<脱壳的艺术>> hawking 2、<<windows anti-debugger re...

子曰小玖的博客 938

【原创】反调试技巧总结-原理和实现(1)(2)(3)(4)(5)(6)......

标 题: 【原创】反调试技巧总结-原理和实现(1)(2)(3)(4)(5)(6)...... 作 者: shellwolf 时 间: 2008-08-10,22:40:53 链 接: http://bbs.pediy.com/showthread.php?t=70470 反调试技巧总结-原理和实现 -------------------------------------------

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1402

反调试技巧总结-原理和实现(1)(2)(3)(4)(5)(6)......

反调试技巧总结-原理和实现 ------------------------------------------------------------------------------------------------------- 2008.8.7shellwolf 一、前言 前段学习反调试和vc,写了antidebug-tester,经常会收到me...

weixin_34128501的博客 121
上一篇: mo_jk2 v2.0.2 for Apache 2.0 Remote Buffer Overflow Exploit (win32)
下一篇: 进程注入 1
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值