一、为什么需要运行时防护
静态防护主要应对直接分析程序文件、提取代码和还原逻辑的风险。例如,代码加密降低原始指令在文件中的直接暴露,代码混淆增加反汇编、反编译结果的阅读和逻辑分析难度。这些保护有助于抵御静态分析,但程序运行后仍可能面临调试器跟踪、内存中已解密代码被提取,以及通过Hook、代码注入或内存补丁干预执行过程等风险。
针对这些运行期间的风险,还需配合运行时防护,包括调试器检测、防Dump、代码完整性校验、Hook检测和防注入等。将静态防护与运行时防护结合,可使保护方案同时应对程序文件分析和运行过程中的分析与篡改。
二、运行时防护需要关注哪些分析与篡改手段
程序运行期间,分析者可能跟踪代码执行、读取内存,也可能通过注入代码或修改指令干预程序行为。这些技术也用于正常调试和故障排查,下表关注它们被用于未经授权的分析与篡改时的风险。
| 分析与篡改手段 | 常见操作 | 主要风险 |
|---|---|---|
| 动态调试 | 通过调试器启动程序、运行中附加、设置断点和单步执行 | 暴露函数执行过程、关键分支和运行数据 |
| 内存补丁 | 修改内存中的代码指令,例如条件跳转指令 | 改变授权检查或其他业务逻辑的执行结果 |
| 内存Dump | 转储进程内存并进行离线分析 | 提取转储时内存中可读取的代码与数据,包括可能存在的已解密代码 |
| Hook与动态插桩 | 观察函数调用和执行过程,或拦截调用、修改参数与返回值 | 暴露调用信息,或干预授权判断、通信处理等函数的执行结果 |
| 代码注入 | 向目标进程注入代码或模块 | 在目标进程中执行额外逻辑,读取数据或干预原有流程 |
这些操作可能相互配合,例如借助调试器定位关键分支,再修改内存中的指令。
三、Virbox Protector如何进行运行时防护
Virbox Protector(VBP)提供调试器检测和完整性校验等基础功能,并针对不同程序类型提供内存保护、Hook检测和防注入。具体支持范围及配置取决于程序类型、操作系统和VBP版本。
VBP支持函数级保护和整体保护,可将代码加密、代码混淆或代码虚拟化与运行时防护功能结合使用,具体组合按目标程序支持的功能选择。运行时防护不能覆盖全部攻击方式,程序漏洞修复、服务端权限控制和密钥管理仍需单独处理。
1. 调试器检测
VBP为多种程序类型提供调试器检测,通过平台相关API、数据结构和寄存器状态识别调试器。在采用退出处理的保护配置下,程序检测到调试器后退出,阻止当前调试过程继续进行。Android应用加固还提供单步断点检测。
2. 完整性校验
VBP为多种程序类型提供完整性校验,检查受保护代码是否被修改,发现代码篡改和内存补丁。不同程序类型的校验方式存在差异,包括程序加载时的完整性检查,以及在支持SDK标签的场景中触发运行时动态校验。具体检查范围和触发时机取决于所用功能及配置。
3. 内存保护
针对Linux ELF程序,VBP提供内存保护功能,限制程序运行后的调试器附加和内存Dump。其中,ptrace占位用于限制其他进程通过ptrace附加调试;防Dump用于限制通过内存转储提取程序中的代码。这里的内存保护不代表所有程序类型都支持相同的保护选项。
4. Hook检测
VBP在支持Hook检测的Native程序保护场景中,检测函数调用是否被拦截。检测类型包括Inline Hook、IAT Hook,以及针对Frida等动态插桩框架的检测;其中IAT Hook针对Windows PE程序的导入地址表,各类检测的可用性需匹配具体平台和VBP版本。相关功能介绍见《Virbox Protector对抗AI自动化逆向分析白皮书》。
5. 防注入
VBP在Android应用加固中采用双进程ptrace守护技术,限制其他进程通过ptrace附加调试或注入代码。
四、如何验证运行时防护效果
1. 确认程序能够正常运行
先检查保护后的程序能否正常启动,再对照保护前的程序,检查核心功能是否正常、处理结果是否正确。
同时检查故障排查流程是否可用,并在开发环境中保存与程序匹配的调试符号,便于出现问题时定位原因。调试器能否附加与系统能否生成崩溃转储需分别检查。
2. 分别测试各项防护功能
使用同一程序版本制作对照样本。对支持独立开关的功能,比较开启和关闭后的测试结果,保持其他保护配置和测试环境一致。
反调试需分别测试两种情况:通过调试器启动程序,以及程序正常启动后再附加调试器。如果仍能继续调试,再测试断点和单步执行。若程序在启动或附加阶段已触发保护,应记录触发时的实际表现,后续无法进行的测试记为“未执行”,不计为通过。
其他功能按各自的防护目标分别检查:
- 防Dump:检查能否生成内存转储,以及能否从中提取受保护代码,分别记录结果。
- 完整性校验:明确校验范围和触发时机,在测试环境中修改校验范围内的代码,检查修改能否在校验时被发现。
- Hook检测:检查所测试的函数调用拦截方式能否被识别。
- 防注入:检查所测试的代码注入方式能否被限制。
反调试测试通过,不能代替其他功能的测试结果。
3. 排除崩溃和环境因素造成的误判
程序退出或调试器无法附加时,应先确认原因,避免把程序崩溃、运行依赖缺失或系统权限限制误判为防护生效。若同时开启了多项保护,还需确认结果与待测功能有关。
记录程序与VBP版本、保护配置、测试工具、运行环境和测试结果,便于复查。
相关阅读
- 代码加密是什么?Virbox Protector如何降低核心代码暴露风险
- 代码混淆是什么?Virbox Protector如何提高逆向分析成本
- 代码虚拟化是什么?Virbox Protector如何保护核心函数
- Virbox Protector 对抗 AI 自动化逆向分析白皮书
深盾科技 · Virbox | 让数字世界充满信任
Virbox Protector(VBP)是一套面向软件交付安全的全栈软件加密与应用加固解决方案,广泛覆盖本地程序、移动应用、Java/.NET/Python、Unity、SDK、静态库、目标文件与 AI 模型等软件资产,帮助企业在交付之后依然保持代码、算法、资源和业务价值可控。
