导入表保护
去除原程序的导入表,将导入地址表(IAT)替换为修复函数,由壳代码接管导入函数的跳转。隐藏原程序中的导入表,保护程序的函数外部调用,可以达到干扰逆向分析、防脱壳的作用。目前仅支持PE格式的程序。
资源加密
资源加密是针对PE格式程序的资源进行加密的保护功能,可以防止程序中的资源信息被提取,篡改。在加壳时将PE格式程序中的资源抽取并加密,仅保护一些外部需要的资源(如图标、版本信息等),在程序执行时,在壳代码中再解密。
附加数据扩展
附加数据一般是由某些编译器或打包工具,将一些数据(如音视频、数据库等)与原始的可执行程序拼接,这些数据一般在运行时被原始的程序读取,附加数据在执行时并不会直接被映射到内存中。由于加壳会改变原始程序文件,如果将附加数据直接拼接到保护后的程序,可能会导致运行时异常。附加数据扩展使用了Hook手段使程序能正常读取到附加数据,另外对附加数据做了加密处理,防止数据被轻易窃取
压缩
将原始的代码段与数据包打包并压缩,将原始程序入口(OEP)替换为壳代码,运行时由壳代码将代码段与数据段还原,并进行一些重定位等操作,使程序能正常运行。压缩的核心目不是“压缩”,并非专为缩小程序体积而设计的。它真正的作用是将代码与数据段做了加密,并将原先的导入表与重定位信息隐藏了起来,再”顺便“将原先的数据做了压缩。可以有效地防止静态反编译,防止程序被打补丁。
代码混淆
代码混淆亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式。扰乱原始指令,防止静态分析。
代码虚拟化
将原始指令转换为自定义的虚拟机指令,交由配套虚拟机系统模拟执行。隐藏原始指令,防止代码逻辑分析。
代码加密
代码加密是使用SMC(Self-Modifying Code)技术,将原始的函数加密,在函数被执行时才将函数解密并执行的保护方式。防脱壳,防止直接Dump。
反调试功能
内存断点
可以检测程序中是否设置内存断点,若检测到程序中设置内存访问断点和内存写入断点时,则程序直接终止运行。
硬件断点
可以检测程序中是否设置硬件断点,若检测到则程序直接终止运行。
内存检查
可以检测到内存是否被修改(比如被调试器附加修改),若程序内存被修改则程序将终止运行。