一种利用马尔可夫链实现代码混淆的方法

文档序号:9288533阅读:927来源:国知局
一种利用马尔可夫链实现代码混淆的方法
【技术领域】
[0001]本发明属于计算机安全领域,具体涉及一种利用马尔可夫链实现代码混淆的方法。
【背景技术】
[0002]近年来,随着信息技术的进步,市面上产生了大量优秀的软件、APP,它们提供了许许多多方便的功能。但由于平台和语言的特性,这些软件可以很容易的被逆向工程破解,获取具有很强可读性的源代码(尤其是安卓平台和JAVA语言)。一旦被破解,不仅会直接被侵犯作者的知识产权,也会有被破解后加入恶意代码的风险,使一般用户的安全隐私受到威胁。这是一个非常严重的安全问题。
[0003]—般而言,利用逆向工程恢复二进制文件的高层次语义包括两个步骤:其一,得到反汇编文件,其二,利用反编译器得到相应的高级语言表达形式。为了降低被逆向工程破解的风险,代码混淆作为一种重要、较为有效的手段,应受到足够的重视和研究。代码混淆技术是一种软件保护技术。混淆是指对已发布软件的二进制代码进行分析和重新组织,使得处理后的代码在逻辑功能上和处理前的代码相同,但是在表现形式上会产生很大的变化,这种变化使得软件的代码即使被逆向分析人员反编译,也将难以阅读,从而有效地保护了软件在短时间内被破解,降低了软件被盗版和篡改的可能性。
[0004]目前代码混淆技术主要有两种类型,一种是源代码混淆,一种是二进制代码混淆。其中,源代码混淆有如下几种:直接源代码混淆,预处理混淆,抽象语法树,字节码混淆(JAVA)ο
[0005]其中,源代码混淆是直接将源代码文本进行混淆,将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“―”这样的符号,使得阅读的人无法根据名字猜测其用途;重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量;打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。这样的混淆方式难于理解,调试也变得非常困难。
[0006]二进制代码混淆技术通过对程序的代码进行重组和变形等手段对程序的二进制代码进行保护,防止软件的破解和篡改。常见的技术有代码乱序,代码替换,函数映射,插入不透明谓词和平展控制流等。
[0007]专利申请“一种基于代码变形的二进制代码混淆方法”(申请号:CN201410018508)提供一种二进制代码混淆方法,该方法对关键代码段进行反汇编得到汇编指令序列,并识别该段代码中的循环结构,计算关键代码段中各条指令的权重,然后对汇编指令序列中所有汇编指令的变形,对汇编指令序列切片和乱序,然后将生成的新的汇编指令序列进行汇编,转换成二进制代码,最后将PE文件重构。该方法利用计算机系统,对windows系统下的可执行二进制代码文件进行混淆。
[0008]专利申请“通过汇编实现代码混淆的编译方法和系统”(申请号:CN201310258325)提供一种代码混淆的编译方法和系统,解决了安卓ARM平台下无法隐藏系统调用,通过反汇编核心技术容易被竞争队首破解的问题,从而增加软件被破解的难度。其技术方案为:方法包括:编写核心函数;反汇编核心函数;创建可执行内存映射区;往内存映射区复制核心函数的汇编代码;执行内存映射区的汇编代码,生成混淆后的核心函数

【发明内容】

[0009]本发明涉及的相关术语解释如下:
[0010]马尔可夫链:马尔可夫链又称离散时间马尔可夫链,为状态空间中经过从一个状态到另一个状态的转换的随机过程,对于马尔可夫链的每一个状态,根据状态跳转的概率分布,系统从一个状态变到另一个状态,也可以保持当前状态;
[0011]伪随机数生成算法:真正的随机数在某过程中是按分布概率随机产生的,其结果是不可预测的,而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,可以认为这个可预见的结果其出现的概率是100%,所以用随机数生成算法所产生的“随机数”并不随机,是伪随机数;
[0012]对称加密:加密算法使用的加密和解密密钥是相同的。
[0013]本发明具体采用如下技术方案:
[0014]—种利用马尔可夫链实现代码混淆的方法,其流程如图1所示,具体包括以下步骤:
[0015]步骤1.混淆常量字符串,其流程如图2所示;对于程序源代码中欲进行混淆操作的常量字符串A,进行如下步骤的操作:
[0016]步骤1-1:从预设的多种加密方式中随机选取一种作为对常量字符串A的加密方式;其中,预设的加密方式需满足对称加密;此步骤应发生在程序编译过程中,即不影响程序的运彳丁效率;
[0017]步骤1-2:使用基于时间的伪随机数算法生成随机数K,数值K作为在步骤1-1中选取的加密方式中使用的密钥,参与对常量字符串A的加密;此步骤应发生在程序编译过程中,即不影响程序的运行效率;
[0018]步骤1-3:创建字符串缓冲区Buffer,将常量字符串A存放到缓冲区Buffer中;
[0019]步骤1-4:根据步骤1-1选取的加密方式和步骤1-2生成的随机密钥K,对步骤1_3中创建的字符串缓冲区Buffer中的常量字符串A进行加密,并将加密后的结果存放到缓冲区Buffer中;此步骤应发生在程序编译过程中,即不影响程序的运行效率;
[0020]完成上述步骤后,对常量字符串A的混淆操作结束;当遭遇逆向破解时,内存中将不会显示出原本应为明文的常量字符串A,而是加密后的乱码,保护了原始信息;
[0021]步骤1-5:当在程序运行时,需要将混淆后的字符串还原为原始字符串,即将字符串缓冲区Buffer中加密后的内容还原为原始字符串,还原过程中采用与步骤1-1所述加密方式对应的解密方式,并使用步骤2中的密钥K进行还原;此步骤应发生在程序运行过程中。
[0022]步骤2.利用马尔可夫链进行调用混淆,其流程如图3所示;对于程序源代码中欲进行混淆操作的函数F,进行如下步骤的操作:
[0023]步骤2-1:若函数F的参数中包含了常量字符串,则对所述常量字符串按步骤I所述方法进行混淆;
[0024]步骤2-2:预先设定多个马尔可夫链,每个马尔可夫链包含多个不同的状态,每个状态指向不同的执行指令,单个马尔可夫链的多个状态之间的转移概率已预先设定,需要说明的是,预设的马尔可夫链均已实例化,即将抽象的马尔可夫链的状态转移以程序代码的形式实现为程序代码段之间的跳转;此步骤应发生在程序编译过程中,即不影响程序的运行效率;
[0025]步骤2-3:随机选取一个预设的马尔可夫链代码,当程序源代码中的函数F被调用时,在函数F之前插入所选取的实例化的马尔可夫链的代码;此步骤应发生在程序编译过程中;
[0026]完成上述步骤后,即完成对函数F的混淆操作;在实际调用函数F时,在运行内存中会在执行函数F之前先运行一段由所选择的马尔可夫链代码指定的执行指令;由于马尔可夫链的每一次运行,其状态路径生成的执行指令均不相同,故,若遭遇逆向破解,则马尔可夫链生成的置于函数F之前的一段无关代码可起到混淆函数F的作用。
[0027]本发明的有益效果是:
[0028]本发明在程序源代码的编译阶段,对代码中的常量字符串进行加密,使之在反汇编中不可识别,有效减缓逆向工程的速度;同时,本发明利用马尔可夫链算法,在函数调用过程中通过前插马尔可夫链代码生成无关执行指令,即通过若干状态转以后再调用被保护的函数,实现在运行内存中的函数混淆,从而实现对软件或特殊代码片段的保护。
【附图说明】
[0029]图1是本发明实现代码混淆的总体流程图;
[0030]图2是本发明混淆常量字符串的工作流程图;
[0031
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1