混淆

仓颉语言提供了多种混淆技术用于保护开发者的软件资产,提升攻击者逆向攻击仓颉软件的难度。攻击者可采用逆向工程技术对程序进行攻击,并获取程序的符号名、路径信息和行号信息、特征字符串和特征常数,以及控制流信息。仓颉混淆技术可以对这些信息进行混淆和隐藏,让攻击者难以借用这些信息辅助理解程序的运行逻辑。

  • 外形混淆:外形混淆可以混淆仓颉应用的符号名、路径信息和行号信息,并且对仓颉二进制中的函数进行重排。混淆后,攻击者无法再利用这些信息辅助理解程序的运行逻辑。使能外形混淆后,函数名和变量名被随机字符串替换、路径名被字符串“SOURCE”替换、行号被修改为 0。

  • 数据混淆:仓颉编译器支持字符串混淆和常量混淆。字符串混淆功能会识别代码中的明文字符串,将其加密保存。程序在初始化时会先解密字符串,再执行程序逻辑。因此,外部攻击者无法直接从程序文件中获取明文字符串,只能看到加密后的数据,因此无法根据字符串信息猜测代码逻辑。对于程序中使用的已知常量,仓颉编译器支持使用常量混淆功能,将使用这些常量的代码片段转化为等价的、更加难以理解的代码片段。

  • 控制流混淆:仓颉编译器支持虚假控制流和控制流平坦化两种控制流混淆功能,在不影响程序正常执行的前提下,打乱、重排基本块之间的跳转关系,从而提升分析理解程序控制流的难度。虚假控制流的原理是在程序中随机添加大量虚假的条件跳转分支,并且这些条件跳转分支的条件变量都是由不透明谓词组成;控制流平坦化的主要目的是隐藏基本块之间的跳转关系,并确保在实际执行时基本块的执行顺序和混淆前一致,保证程序的正常功能不被影响,但攻击者无法静态根据控制流信息得到基本块之间的先后执行关系以及跳转关系。