c语言混淆技术

代码混淆定义:

原代码 P 通过某种变换变成代码 P’,若 P 和 P’运行结果与过程行为保持一致,该种变换就称之为混淆变换。

具体来说,当混淆转换满足以下两种情况时,这种混淆变化称之为合法的转换:

  • (1)如果源程序 P 无法停止运行或报错结束运行,则变换后的程序 P’可以结束运行也可以继续运行。
  • (2)否则,目标程序 P’也结束运行并且输出与源程序相同的结果。
  • 两个程序之间操作并不一定完全相同,且不一定有相同的效率。

实际上,混淆工具预先设定若干混淆规则,并使用其它更为复杂的代码取代源代码中符合条件的代码语句,虽然源代码语义并未改变但混淆后的程序运行过程中空间复杂度往往更高,执行时间也更长,甚至有可能改变系统环境等。

image-20231217100733637

图 2.1 展示了混淆编译的整体流程,

  • 首先混淆工具会对输入的源代码进行代码预处理得到程序控制流图 CFG、抽象语法树 AST 等信息,
  • 然后对数据流、控制流等进行分析,并根据输入的混淆参数选择对应的混淆算法处理源代码,
  • 最后输出混淆编译后的程序。

尽管混淆策略多种多样,但通常按 Collberg 提出的方法将其大致分为四类[16]:

  • 布局混淆
  • 数据流混淆
  • 控制流混淆
  • 预防混淆

接下来将对这几类混淆策略进行详细分析。

布局混淆

布局混淆是一种在不影响源程序正常运行的情况下,即不修改程序核心控制流和数据流,对程序包含有用信息的非核心代码做出修改的一种混淆策略;此处的非核心代码一般包括注释语句、多余代码片段、用于调试的代码语句以及自定义的变量名。