1.一种结合MD5与序列到序列模型的代码混淆方法,其特征在于,包括:
第一步,构建常量数据集:对于待混淆源程序的分支语句中的表达式,获取该表达式中的任意字符串常量和数值型常量作为第一明文,其中数值型常量包括:整型常量、单精度浮点型常量和双精度浮点型常量;然后对第一明文进行加盐处理,得到第二明文;接着使用MD5散列算法对第二明文加密后再添加对应的类型标识符,生成密文;最后为每一对密文和第一明文构造一个第一序偶,所有的第一序偶构建为一个常量数据集;
第二步,构造编码器字典和解码器字典:根据常量数据集中所有第一序偶的密文构造编码器字典,根据常量数据集中所有第一序偶的第一明文构造解码器字典,然后自定义一个起始符和一个结束符并加入至解码器字典;
第三步,数据预处理:对于常量数据集中的每一个第一序偶,首先在第一序偶的第一明文的最后面加上第二步中的结束符,得到第三明文;然后依次检索得到密文中的所有字符在编码器字典中的编号,构成第一编号序列,并且依次检索得到第三明文中的所有字符在解码器字典中的编号,构成第二编号序列;接着对第一编号序列中的编号进行One‑hot编码,构成第一向量序列,对第二编号序列中的编号进行One‑hot编码,构成第二向量序列;最后根据第一向量序列和第二向量序列构造一个第二序偶;
第四步,构建和训练一个序列到序列模型:以GRU作为编码器,GRU和全连接层作为解码器,构建一个序列到序列模型;将所有的第二序偶作为训练集,经过训练后得到一个序列到序列模型;具体步骤如下:(1)以GRU作为序列到序列模型的编码器;GRU的计算公式为:
其中,、和 分别依次为第t个时刻的重置门、更新门和候选状态, 为第t个时刻的隐藏状态, 为第t‑1个时刻的隐藏状态, 为第t个时刻编码器的输入,即第一向量序列中的第t个列向量, 、 和 分别依次为重置门权重矩阵、更新门权重矩阵和候选状态权重矩阵, 、 和 分别依次为重置门偏置项、更新门偏置项和候选状态偏置项;
当 中的所有 都已输入至编码器后,结束编码,并将最后时刻的 作为中间状态c;
(2)以GRU和全连接层作为序列到序列模型的解码器;GRU的计算公式为:
全连接层的计算公式为:
其中, 、 和 分别依次为第k个时刻的重置门、更新门和候选状态, 为第k个时刻的隐藏状态, 为第k个时刻解码器的输出, 为第k‑1个时刻的隐藏状态, 为第k个时刻解码器的输入,即第k‑1个时刻解码器的输出对应的One‑hot编码向量, 、 、 和分别依次为重置门权重矩阵、更新门权重矩阵、候选状态权重矩阵和全连接层权重矩阵,、 、 和 分别依次为重置门偏置项、更新门偏置项、候选状态偏置项和全连接层偏置项;
解码器以中间状态c作为初始时刻的隐藏状态 ,以起始符的One‑hot编码向量作为初始时刻解码器的输入 ,当解码器输出结束符时,结束解码;
(3)首先初始化整个序列到序列模型的模型权重,包括权重矩阵 、 、 、 、 、、 和偏置项 、 、 、 、 、 、 ,设置模型相关的超参数,包括GRU的隐藏层数量、GRU隐藏层单元的数量、批处理的大小、学习率的大小和训练的迭代次数;然后使用所有的第二序偶 作为训练集训练模型,其中以第一向量序列作为输入序列,以第二向量序列 作为目标序列;最后直到达到预设的
训练迭代次数Epoch后停止训练;若此时模型对训练集中的所有输入序列都正确预测为对应的目标序列,则结束训练并保存模型权重;否则增加训练迭代次数Epoch并重新训练模型;
第五步,构造解密函数:根据第四步中的序列到序列模型,构造一个将密文解密为第一明文的函数,该函数称为解密函数;
第六步,构造不透明谓词:将待混淆源程序中的分支语句的表达式中的字符串常量和数值型常量替换为对解密函数的调用,完成常量替换后的表达式即为不透明谓词;
第七步,插入不透明谓词和解密函数:将不透明谓词替代待混淆源程序中的分支语句的原有表达式,并将解密函数插入至待混淆源程序中任意不影响编译的位置,得到混淆后的源程序;
第八步,编译生成可执行应用程序:将混淆后的源程序编译成可执行应用程序。
2.根据权利要求1所述的结合MD5与序列到序列模型的代码混淆方法,其特征在于,所述的第一步的具体步骤包括:(1)对于待混淆源程序的分支语句中的表达式,获取该表达式中的任意字符串常量和数值型常量作为第一明文,其中数值型常量包括整型常量、单精度浮点型常量和双精度浮点型常量;
(2)对第一明文进行加盐处理,得到第二明文:当第一明文为数值型常量时,选取一个固定的常数作为盐并将其与第一明文相加,得到第二明文,当第一明文为字符串常量时,选取一个固定的标点符号作为盐并将其添加到第一明文的最后面,得到第二明文;然后使用MD5散列算法对第二明文进行加密后得到MD5字符串;接着自定义四个互不相同的字符,将它们分别作为字符串常量、整型常量、单精度浮点型常量和双精度浮点型常量的类型标识符;最后根据第一明文的常量类型将对应的类型标识符插入至MD5字符串中,插入的位置是MD5字符串中的任意位置;将插入类型标识符后的MD5字符串称为密文;
(3)首先将所有的密文和第一明文都转换为字符串,然后利用每一对密文和第一明文构造一个第一序偶 ,其中第一元 表示密文,第二元 表示密文对应的第一明文;所有的第一序偶 构成一个常量数据集 ,n为 中第一
序偶 的个数。
3.根据权利要求1所述的结合MD5与序列到序列模型的代码混淆方法,其特征在于,所述的第二步的具体步骤包括:(1)遍历常量数据集 中所有第一序偶 的密文 ,将所有 中出现的字符构建为一个字符序列,如果字符存在重复,则只保留一个,该字符序列即为编码器字典De;
(2)遍历常量数据集 中所有第一序偶 的第一明文 ,将所有 中出现的字符构建为一个字符序列,如果字符存在重复,则只保留一个;然后自定义两个字符,分别作为起始符和结束符,其中,起始符和结束符互不相同且均不同于该字符序列中的所有字符;
最后在该字符序列的最前面插入起始符和结束符,完成插入操作后的字符序列即为解码器字典Dd。
4.根据权利要求1所述的结合MD5与序列到序列模型的代码混淆方法,其特征在于,所述的第三步的具体步骤包括:对于常量数据集 中的每一个第一序偶 ,
(1)把结束符添加到第一明文 的最后面,得到第三明文 ;
(2)对密文 从左到右进行逐个字符切分,根据编码器字典De依次得到 中每个字符在De中的编号,所有的编号构成第一编号序列 ;然后对 从左到右进行逐个字符切分,根据解码器字典Dd依次得到 中每个字符在Dd中的编号,所有的编号构成第二编号序列 ;
(3)计算De的长度a和Dd的长度b;然后依次将 中的每个编号都One‑hot编码为一个a维列向量,所有的向量构成第一向量序列 ;依次将 中的每个编号都One‑hot编码为一个b维列向量,所有的向量构成第二向量序列 ;
(4)利用第一向量序列 和第二向量序列 构造一个第二序偶
。
5.根据权利要求1所述的结合MD5与序列到序列模型的代码混淆方法,其特征在于,所述的第五步的具体步骤包括:构造一个输入为密文 的解密函数,首先根据所述的第三步将 转变为第一向量序列 ;然后把 输入序列到序列模型中,输出一个编号序列 ;接着根据 中的每个编号g,在解码器字典Dd中查找编号与g相等的字符,依次将这些字符构成一个字符序列 ;随后依次拼接 中的所有字符,得到第三明文 ;删除 中的结束符,得到第一明文 ;最后根据 中的类型标识符将 转换为对应的常量类型,并将完成常量类型转换后的 作为解密函数的输出。
6.根据权利要求5所述的结合MD5与序列到序列模型的代码混淆方法,其特征在于,所述的根据 中的类型标识符将 转换为对应的常量类型的具体步骤包括:首先根据类型标识符在 中的位置,获取 中该位置对应的字符;然后根据该字符对 进行常量类型转换:当字符为字符串常量的类型标识符时,将 转换为字符串;当字符为整型常量的类型标识符时,将 转换为整型数值;当字符为单精度浮点型常量的类型标识符时,将 转换为单精度浮点型数值;当字符为双精度浮点型常量的类型标识符时,将 转换为双精度浮点型数值。
7.一种结合MD5与序列到序列模型的代码混淆系统,用于运行权利要求1‑6任一所述的结合MD5与序列到序列模型的代码混淆方法,其特征在于,包括构建常量数据集模块、构造编码器字典和解码器字典模块、数据预处理模块、构建和训练一个序列到序列模型模块、构造解密函数模块、构造不透明谓词模块、插入不透明谓词和解密函数模块以及编译生成可执行应用程序模块:所述构建常量数据集模块:对于待混淆源程序的分支语句中的表达式,获取该表达式中的任意字符串常量和数值型常量作为第一明文,其中数值型常量包括:整型常量、单精度浮点型常量和双精度浮点型常量;然后对第一明文进行加盐处理,得到第二明文;接着使用MD5散列算法对第二明文加密后再添加对应的类型标识符,生成密文;最后为每一对密文和第一明文构造一个第一序偶,所有的第一序偶构建为一个常量数据集;
所述构造编码器字典和解码器字典模块:根据常量数据集中所有第一序偶的密文构造编码器字典,根据常量数据集中所有第一序偶的第一明文构造解码器字典,然后自定义一个起始符和一个结束符并加入至解码器字典;
所述数据预处理模块:对于常量数据集中的每一个第一序偶,首先在第一序偶的第一明文的最后面加上自定义的结束符,得到第三明文;然后依次检索得到密文中的所有字符在编码器字典中的编号,构成第一编号序列,并且依次检索得到第三明文中的所有字符在解码器字典中的编号,构成第二编号序列;接着对第一编号序列中的编号进行One‑hot编码,构成第一向量序列,对第二编号序列中的编号进行One‑hot编码,构成第二向量序列;最后根据第一向量序列和第二向量序列构造一个第二序偶;
所述构建和训练一个序列到序列模型模块:以GRU作为编码器,GRU和全连接层作为解码器,构建一个序列到序列模型;将所有的第二序偶作为训练集,经过训练后得到一个序列到序列模型;具体步骤如下:(1)以GRU作为序列到序列模型的编码器;GRU的计算公式为:
其中,、和 分别依次为第t个时刻的重置门、更新门和候选状态, 为第t个时刻的隐藏状态, 为第t‑1个时刻的隐藏状态, 为第t个时刻编码器的输入,即第一向量序列中的第t个列向量, 、 和 分别依次为重置门权重矩阵、更新门权重矩阵和候选状态权重矩阵, 、 和 分别依次为重置门偏置项、更新门偏置项和候选状态偏置项;
当 中的所有 都已输入至编码器后,结束编码,并将最后时刻的 作为中间状态c;
(2)以GRU和全连接层作为序列到序列模型的解码器;GRU的计算公式为:
全连接层的计算公式为:
其中, 、 和 分别依次为第k个时刻的重置门、更新门和候选状态, 为第k个时刻的隐藏状态, 为第k个时刻解码器的输出, 为第k‑1个时刻的隐藏状态, 为第k个时刻解码器的输入,即第k‑1个时刻解码器的输出对应的One‑hot编码向量, 、 、 和分别依次为重置门权重矩阵、更新门权重矩阵、候选状态权重矩阵和全连接层权重矩阵,、 、 和 分别依次为重置门偏置项、更新门偏置项、候选状态偏置项和全连接层偏置项;
解码器以中间状态c作为初始时刻的隐藏状态 ,以起始符的One‑hot编码向量作为初始时刻解码器的输入 ,当解码器输出结束符时,结束解码;
(3)首先初始化整个序列到序列模型的模型权重,包括权重矩阵 、 、 、 、 、、 和偏置项 、 、 、 、 、 、 ,设置模型相关的超参数,包括GRU的隐藏层数量、GRU隐藏层单元的数量、批处理的大小、学习率的大小和训练的迭代次数;然后使用所有的第二序偶 作为训练集训练模型,其中以第一向量序列作为输入序列,以第二向量序列 作为目标序列;最后直到达到预设的
训练迭代次数Epoch后停止训练;若此时模型对训练集中的所有输入序列都正确预测为对应的目标序列,则结束训练并保存模型权重;否则增加训练迭代次数Epoch并重新训练模型;
所述构造解密函数模块:根据训练好的序列到序列模型,构造一个将密文解密为第一明文的函数,该函数称为解密函数;
所述构造不透明谓词模块:将待混淆源程序中的分支语句的表达式中的字符串常量和数值型常量替换为对解密函数的调用,完成常量替换后的表达式即为不透明谓词;
所述插入不透明谓词和解密函数模块:将不透明谓词替代待混淆源程序中的分支语句的原有表达式,并将解密函数插入至待混淆源程序中任意不影响编译的位置,得到混淆后的源程序;
所述编译生成可执行应用程序模块:将混淆后的源程序编译成可执行应用程序。