运行时防护针对程序执行期间的调试、内存提取和代码篡改风险,通过调试器检测、完整性校验、防Dump、Hook检测和防注入等功能提供保护。具体能力需匹配程序类型、操作系统和工具版本,并按各项功能分别验证。

一、程序文件难以分析,运行期间还会暴露什么

代码加密可以降低原始指令在文件中的直接暴露,代码混淆可以增加反汇编、反编译结果的阅读和逻辑分析难度。这些措施有助于抵御静态分析,但不能据此判断运行过程中的风险已经消失。

程序执行时,分析者仍可能跟踪关键分支,提取内存中可能存在的已解密代码,或通过修改指令、拦截调用和注入代码干预业务逻辑。静态防护与运行时防护需要结合,分别应对程序文件分析和执行期间的分析与篡改。

调试、内存读取等技术也用于正常开发和故障排查。下面讨论的是未经授权使用这些技术时的风险;验证应在自有或已获授权的测试环境中进行。

分析与篡改手段常见操作主要风险
动态调试通过调试器启动程序、运行中附加、设置断点和单步执行暴露函数执行过程、关键分支和运行数据
内存补丁修改内存中的代码指令,例如条件跳转指令改变授权检查或其他业务逻辑的执行结果
内存Dump转储进程内存并离线分析提取当时可读取的代码和数据,包括可能存在的已解密代码
Hook与动态插桩观察调用、拦截函数、修改参数与返回值暴露调用信息,或干预授权判断、通信处理等函数的结果
代码注入向目标进程注入代码或模块执行额外逻辑、读取数据或干预原有流程

这些手段可能配合使用。例如,先借助调试器定位关键分支,再修改内存中的指令。因此,不能用一项反调试测试代替全部运行时安全测试。

二、运行时防护的五项功能,分别检查什么

以Virbox Protector(VBP)为例,调试器检测和完整性校验面向多种程序类型;内存保护、Hook检测和防注入则需结合具体程序类型选择。以下功能说明不代表所有平台、所有版本都提供相同选项。

调试器检测:识别调试状态

通过平台相关API、数据结构和寄存器状态识别调试器。在采用退出处理的保护配置下,程序检测到调试器后退出,阻止当前调试过程继续进行。Android应用加固还提供单步断点检测。

这里需要区分“检测到调试器”和“检测后的处理”。退出行为有配置前提,不能把它写成所有程序在所有环境中的固定表现。

完整性校验:检查受保护代码是否被修改

完整性校验用于发现代码篡改和内存补丁。检查范围、校验方式和触发时机存在差异:有程序加载时的完整性检查,也有在支持SDK标签的场景中触发的运行时动态校验。

验证时要先确定代码是否位于校验范围内,以及何时触发校验,不能仅凭“修改后程序没有立即退出”得出结论。

内存保护:确认Linux ELF场景下的具体选项

针对Linux ELF程序,内存保护用于限制运行后的调试器附加和内存Dump。其中,ptrace占位用于限制其他进程通过ptrace附加调试;防Dump用于限制通过内存转储提取程序代码。

这两项应分别理解和验证,不能把ptrace占位直接等同于阻止所有内存提取方式,也不能将这组保护选项推广到所有程序类型。

Hook检测:区分方法、框架与平台

在支持Hook检测的Native程序保护场景中,可以检测函数调用是否被拦截。相关检测包括Inline Hook、IAT Hook,以及针对Frida等动态插桩框架的检测。

IAT Hook针对Windows PE程序的导入地址表。不同检测类型的可用性需要匹配具体平台和版本,不能将这些名称作为一组跨平台通用能力。相关功能介绍见《Virbox Protector对抗AI自动化逆向分析白皮书》

防注入:保留Android与ptrace条件

Android应用加固采用双进程ptrace守护,限制其他进程通过ptrace附加调试或注入代码。这里的限制与Android场景及ptrace路径有关,不能扩大成对全部注入方式的保证。

三、如何与函数级保护、整体保护组合

VBP支持函数级保护和整体保护,可将代码加密、代码混淆或代码虚拟化与运行时防护功能结合使用。选择组合前,先确认目标程序、操作系统和所用版本支持哪些功能。

运行时防护不能覆盖全部攻击方式。程序漏洞修复、服务端权限控制和密钥管理仍需单独处理,不能由保护选项替代。

四、如何设计可复查的防护测试

先验证业务功能,再验证防护行为

检查保护后的程序能否正常启动,对照保护前的程序确认核心功能与处理结果。还应检查故障排查流程,并在开发环境中保存与程序匹配的调试符号。

调试器能否附加与系统能否生成崩溃转储需分别检查,避免将反调试结果直接当作故障排查能力的结论。

固定样本和环境

使用同一程序版本制作对照样本。对支持独立开关的功能,比较开启和关闭后的结果,保持其他保护配置、工具和运行环境一致。下列内容是测试建议,不是实测通过记录。

分开测试启动调试与运行中附加

先分别测试通过调试器启动程序、程序正常启动后再附加调试器。如果还能继续调试,再检查断点和单步执行。

若启动或附加阶段已触发保护,应记录实际表现。后续无法进行的测试记为“未执行”,不计为通过。

待测功能检查内容记录要点
完整性校验在测试环境中修改校验范围内的代码,按触发时机检查修改位置是否在范围内、校验是否触发、修改是否被发现
防Dump检查能否生成内存转储、能否提取受保护代码两项结果分别记录
Hook检测检查所测试的函数调用拦截方式能否被识别记录具体测试方式和表现
防注入检查所测试的代码注入方式能否被限制不将一种方式的结果扩大到全部方式

五、程序退出或无法附加时,先排除误判

程序退出可能与保护触发有关,也可能来自崩溃或运行依赖缺失;无法附加还可能受系统权限限制。先排查原因,再判断结果是否与待测功能有关。

如果同时开启多项保护,还需区分是哪项功能产生了作用。记录程序与保护工具版本、保护配置、测试工具、运行环境和测试结果,才能在后续复查中重现判断依据。

运行时防护的检查应落实到三个方面:功能是否适用于目标程序,测试是否实际执行,结果能否归因于待测功能。保留这三类信息,比单独记录“程序退出”更有参考价值。

深盾科技 · Virbox | 让数字世界充满信任
Virbox Protector(VBP)是一套面向软件交付安全的全栈软件加密与应用加固解决方案,广泛覆盖本地程序、移动应用、Java/.NET/Python、Unity、SDK、静态库、目标文件与 AI 模型等软件资产,帮助企业在交付之后依然保持代码、算法、资源和业务价值可控。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐