一种基于控制流和外形混淆的Python代码混淆方法与流程

文档序号:12467461阅读:1060来源:国知局
一种基于控制流和外形混淆的Python代码混淆方法与流程

本发明涉及一种程序混淆方法,具体地说是一种基于控制流和外形混淆的Python代码混淆方法。



背景技术:

软件代码的安全保护是计算机安全领域的一个重点研究内容。随着互联网的飞速发展和大数据时代的到来,分布式计算环境在给人们带来更强的计算能力和更大的灵活性的同时,也使软件代码不可避免的地运行在不可信的节点上,从而使软件代码面临更加严峻的安全问题。相对于攻击者并不知晓攻击对象内部情况的黑盒子攻击,这种暴露软件代码,通过逆向分析代码的运行,并对代码进行恶意篡改或盗取的安全攻击成为白盒子攻击。目前白盒子攻击的威胁正在快速上升和不断演化。软件代码混淆技术是近十年来发展起来的一种软件白盒子安全保护技术。

Python语言现在变得越来越流行,它是一种面向对象、解释型计算机程序设计语言。Python语法简洁而清晰,具有丰富和强大的类库,常被昵称为胶水语言,它能够把其他语言制作的各种模板(尤其是C/C++)很轻松地联结在一起。

现阶段,由于Python语言的方便性,大量应用开始采用Python语言来实现。但是现在存在很多开源的反编译工具,可以直接将使用Python语言开发的程序模块(pyc、pyo)反编译为Python源代码,导致程序中的核心代码被攻击者窃取或篡改,使得开发者很难保护其代码的知识产权。



技术实现要素:

针对现有使用Python语言开发的程序在安全防护方面所存在的问题,本发明提供一种基于控制流和外形混淆的Python代码混淆方法,以期能在保证语义上不发生改变,也不影响程序的正常执行的条件下,通过控制流混淆和外形混淆的手段,使得混淆后的Python源代码在被反编译成源代码之后难以阅读和理解,以达到保护原创代码的目的。

为达到上述发明目的,本发明采用如下技术方案:

本发明一种基于控制流和外形混淆的Python代码混淆方法的特点按如下步骤进行:

步骤1、以一个函数的开始与结束为单位,将Python代码中所有函数进行划分,得到若干个单独的函数;

步骤2、针对任意一个单独的函数fun,对其函数体中若干个连续执行的代码进行分割,得到若干个基本块并依次进行编号,记为B={b1,b2,…,bi,…,bn};bi表示第i个基本块;所述第i个基本块bi中的代码只有一个入口和一个出口;1≤i≤n;

步骤3、使用基于分段Logistic混沌映射的密钥生成算法,生成两套密钥;

步骤3.1、利用式(1)所示的分段Logistic混沌映射产生第i个实数ai,从而得到随机实数序列A={a1,a2,…,ai,…,an}:

式(1)中,a0=rand(0,1);u表示Logistic参数;且3.569946…≤u≤4;

步骤3.2、利用式(2)所示的映射函数将第i个实数ai映射成第i个整数Fi,从而将所述实数序列A={a1,a2,…,ai,…,an}映射成整数序列F={F1,F2,…,Fi,…,Fn}:

Fi=Round{ai×m} (2)

式(2)中,Round{ }是取整函数;m表示映射参数;

步骤3.3、统计所述整数序列F中互不相同的元素个数,记为t;t∈[1,n];

步骤3.4、由所述步骤3.1~步骤3.3的处理过程构成函数Logistic的函数体;由实数a0和Logistic参数u构成二元组(a0,u)作为第t个基本块bt的密钥keyt

步骤3.5、重复步骤3.1~步骤3.4,直到获得所有基本块的密钥作为第一套KEY={key1,key2,…,keyt,…,keyn};

步骤3.6、重复步骤3.1~步骤3.4,直到获得所有基本块的密钥作为第二套KEY′={key1′,key′2,…,key′t,…,key′n};

步骤4、基于控制流的混淆

步骤4.1、打乱所述函数fun中所有基本块的顺序,得到B′={b1′,b2′,…,bi′,…,b′n};bi′表示打乱后的第i个基本块;

步骤4.2、以所述第一套密钥KEY作为所述函数Logistic的参数;经过函数Logistic的函数体计算,得到下一个需要执行的基本块的编号;

以所述第二套密钥KEY′为作为所述函数Logistic的参数;经过函数Logistic的函数体计算,得到if-else控制语句中的条件变量,从而使用while循环语句和if-else控制语句对打乱后的所有基本块的顺序进行控制,使得打乱后的所有基本块的执行顺序与原来的执行顺序相同;

步骤5、基于外形的混淆

利用无意义的字符串对所述Python代码中局部的类名、函数名、变量名进行替换,从而形成混淆后的Python代码。

与已有技术相比,本发明提出的基于控制流和外形混淆的Python代码混淆方法,使代码的反向工程更加困难,创建让人理解困难的混淆代码,来隐藏使用Python开发的应用的核心代码,以便防止攻击者对应用进行篡改或反向工程。具体的说,有益效果体现在:

1、本发明基于现有的Logistic混沌映射算法,提出了一种新的密钥生成算法,基于此算法生成了两套密钥,并将密钥应用到控制流混淆中,使用while循环语句和if-else控制语句改变原先代码的逻辑结构,使得混淆后程序的结构更加复杂,更难被理解,但并不改变程序的执行过程及产生的结果,以此来增加攻击者理解代码的难度。

2、本发明将控制流混淆与外形混淆相结合,提供一种更加负载的面向Python程序的代码混淆方法,该方法能够保证混淆后的Python源代码在语义上不发生改变,不影响程序的正常执行;同时使得混淆后的Python源代码逻辑结构变的更加复杂,并且代码中局部的类名、函数名和变量名在外形混淆后变成无意义的字符串。从而使的混淆后的代码更加难以理解,以此来增加Python模块在被反编译成源代码之后的阅读和理解的难度,以达到保护软件版权的作用。

附图说明

图1是本发明实施例的整体流程框图;

图2是本发明将Python伪代码进行控制流混淆的示例图。

图3是本发明将Python伪代码进行外形混淆的示例图。

具体实施方式

本实施例中,一种基于控制流和外形混淆的Python代码混淆方法,按如图1所示步骤进行:

步骤1、首先,读取需要混淆的Python代码;其次,使用Python语言中自带的函数获取代码的解析树;然后,以一个函数的开始与结束为单位,将Python代码中所有函数进行划分,得到若干个单独的函数;

步骤2、针对任意一个单独的函数fun,如图2所示,对其函数体中若干个连续执行的代码进行分割,得到若干个基本块并依次进行编号,记为B={b1,b2,…,bi,…,bn};图2中基本块个数n=4,所以得到B={b1,b2,b3,b4};bi表示第i个基本块;第i个基本块bi中的代码只有一个入口和一个出口;1≤i≤n;以此来提取函数中的基本块;

步骤3、使用基于分段Logistic混沌映射的密钥生成算法,生成两套密钥;

步骤3.1、利用式(1)所示的分段Logistic混沌映射产生第i个实数ai,从而得到随机实数序列A={a1,a2,…,ai,…,an}:

式(1)中,a0=rand(0,1);u表示Logistic参数;且3.569946…≤u≤4;

如图2所示,基本块个数n=4,这里得到的随机实数序列为A={a1,a2,a3,a4}

步骤3.2、利用式(2)所示的映射函数将第i个实数ai映射成第i个整数Fi,从而将实数序列A={a1,a2,a3,a4}映射成整数序列F={F1,F2,F3,…,F4}:

Fi=Round{ai×m} (2)

式(2)中,Round{}是取整函数;m表示映射参数;

步骤3.3、统计整数序列F中互不相同的元素个数,记为t;t∈[1,n];

步骤3.4、由步骤3.1~步骤3.3的处理过程构成函数Logistic的函数体;由实数a0和Logistic参数u构成二元组(a0,u)作为第t个基本块bt的密钥keyt

步骤3.5、重复步骤3.1~步骤3.4,直到获得所有基本块的密钥作为第一套KEY={key1,key2,key3,key4};

步骤3.6、重复步骤3.1~步骤3.4,直到获得所有基本块的密钥作为第二套KEY′={key1′,key′2,key3′,key′4};

步骤4、基于控制流的混淆,接下来打乱基本块的顺序并插入while和if-else语句进行控制流混淆

步骤4.1、打乱函数fun中所有基本块的顺序,得到B′={b1′,b2′,b3′,b4′};bi′表示打乱后的第i个基本块,其与原先基本块的对应顺序为B′={b1′,b2′,b3′,b4′}={b3,b1,b4,b2}

步骤4.2、以第一套密钥KEY作为函数Logistic的参数;经过函数Logistic的函数体计算,得到下一个需要执行的基本块的编号;

以第二套密钥KEY′为作为函数Logistic的参数;经过函数Logistic的函数体计算,得到if-else控制语句中的条件变量,从而使用while循环语句和if-else控制语句对打乱后的所有基本块的顺序进行控制,图2中Logistic(keyi)=Logistic(keyi′),i∈[1,4]。因此,打乱后的基本块的执行顺序为{b2′,b4′,b1′,b3′},其对应的混淆前基本块的顺序为{b1,b2,b3,b4},因此,打乱后的所有基本块的执行顺序与原来的执行顺序相同;

步骤5、基于外形的混淆

利用无意义的字符串对Python代码中局部的类名、函数名、变量名进行替换,从而形成混淆后的Python代码。如图3所示,使用无意义的字符串对fun函数中的函数名和变量名进行了替换。从而增加了Python程序被反编译后分析代码语义的难度,保护使用Python语言开发的软件的知识产权。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1