背景技术
随着互联网技术的日益发展,软件的发展速度得以井喷似的壮大,随着开源技术的推广,虽然对软件的快速发展和强大带来了更大的变化,但是同时对于数据的保密,完整和安全性上带来了严重的考验。
例如Java应用软件,Java通过虚拟机方式运行,具有编程时无需考虑内存管理等优点,因此被广泛应用与各种应用软件。通常情况下,采用Java编写的应用软件源程序代码经过Java编译器编译后,生成Java字节码(.class文件),Java字节码独立于计算机硬件及操作系统,在运行时由Java虚拟机的Java解释器负责解释并通过及时编译器生产机器代码而执行。然而,由于Java字节码中包含大量的调试信息,例如:源文件名、行号、字段名、方法名、参数名和变量名等,这些调试信息很容易被反编译和通过逆向工程获得应用软件完整的源程序代码。
因此,人们开始投入大量的精力对于自己代码的安全维护成本上考虑,防止别人给自己的软件注入漏洞或者提取源代码获取加密信息。
代码混淆,是将计算机程序的代码转换成一种功能上的等价,但是难于阅读和理解的形式的行为。将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字,使得阅读的人无法根据名字猜测其用途。重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式,打乱代码的格式。
申请公布号CN 105404794 A,申请公布日2016年3月16日公开的发明专利申请公开了一种Java应用软件的保护方法和装置,通过获取Java应用软件的压缩包,该压缩包中包含至少一个类文件,根据其中的至少一个类文件中的指令访问权限,对至少一个类文件中的函数进行合并处理,从而将多个函数的指令合并到同一函数中,产生强混淆效果,同时减少了总函数数量,增加了通过反编译和通过逆向工程获的应用软件完整的远程代码的难度。
申请公布号CN 106326694A,申请公布日2017年1月11日的发明专利申请公布了一种基于C源代码的混淆的Andrid应用加固方法。采用NDK编程的方式,把重要代码保存在C动态链接库中,在对C源代码进行混淆,可以增强对软件的保护措施。同时,把重要代码写到so库中,还能增加代码的重用性,在其他应用中可以直接引入现成的so库,免去了二次开发的麻烦。
但是这些混淆技术并不全面,因为高级语言的程序结构体可以揭示软件的设计意图从而帮助他人理解,稍微懂一点技术的人就能很好的破解。
发明内容
本发明为了解决上述技术问题,提出一种代码加密方法,其特征在于,包括:步骤S1,获取原始代码文件;所述原始代码文件基于原始类实现任务;步骤S2,对所述原始代码文件进行类混合处理得到类混合代码文件,所述类混合代码文件包括与所述任务对应的任务类并且基于所述任务类实现所述任务。
作为优选,所述类混合处理是指按照所述原始代码文件执行的任务将所述原始代码文件中的多个原始类合并形成任务类。
作为优选,所述原始类包括原始变量和原始方法;所述任务类包括与所述原始类的与实现所述任务相关的所述原始变量一一对应的任务变量和与所述原始类的与实现所述任务相关的所述原始方法一一对应的任务方法。
作为优选,所述步骤2包括:步骤S2-1,查找实现所述任务所需的所有所述原始类;步骤S2-2,建立与所述任务对应的任务类并且按照类命名规则为所述任务类命名;步骤S2-3,为所述任务类添加任务变量和任务方法;步骤S2-4,根据所述原始代码文件中用于执行所述任务的代码段生成所述类混合代码文件的用于执行所述任务的代码段。。
作为优选,所述步骤S2-3包括:将所述步骤S2-1中查找到的所述原始类的原始变量和原始方法分别按照变量命名规则和任务命名规则重名以后作为所述任务类的所述任务变量和所述任务方法。
作为优选,还包括:步骤S3,将所述类混合代码文件进行代码混淆处理获得混淆代码文件。
作为优选,还包括:步骤S4,将混淆代码文件进行压缩处理获得压缩代码文件。
本发明还公开了一种代码加密系统,其特征在于,包括:类混合模块,对所述原始代码文件进行类混合处理得到类混合代码文件,所述类混合代码文件包括与所述任务对应的任务类并且基于所述任务类实现所述任务;所述原始类包括原始变量和原始方法;所述任务类包括与所述原始变量一一对应的任务变量和与所述原始方法一一对应的任务方法。
作为优选,还包括对所述类混合代码进行混淆处理以得到混淆代码文件的混淆模块。
作为优选,还包括对所述混淆代码文件进行压缩处理以得到压缩代码文件的压缩模块。
实施例一
一种代码加密系统,用于对执行任务以实现某些功能的原始代码文件进行加密。原始代码文件可以为由C语言、C++、C#、Java、Javascript、PHP等高级语言编程的应用程序的程序代码。原始代码文件中包括用于定义不同的类的类文件。通过实例化这些类,并且调用这些类中的方法,可以使得应用程序完成不同的任务、实现不同的功能。
代码加密系统包括类混合模块、混淆模块以及压缩模块。
一.类混合模块
类混合模块用于对原始代码文件进行类混合处理获得类混合代码文件。类混合处理是指按照原始代码文件执行的任务将原始代码文件中的多个原始类合并形成任务类。即将原始代码文件中与同一项任务相关的所有原始类合并为一个与该任务对应的任务类。原始代码文件基于实例化原始类对象并调用原始类对象的方法来完成的任务,在类混合代码文件中是基于实例化与该任务对应的任务类,并且调用该任务类的相应任务方法来实现的。
具体的,类混合模块包括原始类查找单元、任务类建立单元、任务实现单元。
对于原始代码文件执行的各项任务,原始类查找单元在原始代码文件查找实现该任务所需要的所有原始类以及该原始类中与实现该任务相关的所有原始变量和原始方法,并且传输给任务类建立单元。
任务类建立单元新建一个与该任务对应的任务类文件,并且按照预定的类命名规则为该任务类文件对应的任务类命名。类命名规则可以由程序员根据自己的编程习惯定义,其目的是为了方便程序员自己在程序调试、程序测试或者程序维护时对于任务类文件理解,因此,只要符合所使用的程序语言的类名定义规则的规则,可以不局限于任何的规则。一般来讲,建议采用与任务的内容相关的字符、字符串或者代码等符号为该任务类命名。任务类建立单元还依次将来自原始类查找单元的、与执行该任务有关的各原始类添加至该任务类中。具体的包括:在任务类中定义与需添加的原始类中的与实现任务相关的原始变量对应的任务变量以及在任务类中定义与需添加的原始类中的与实现任务相关的原始方法对应的任务方法。其中,任务变量的定义按照预先定义的变量命名规则进行命名。变量命名规则可以由程序员根据自己的编程习惯定义,其目的是为了方便程序员自己在程序调试、程序测试或者程序维护时对于任务类中的任务变量进行理解,因此,只要在符合所使用的程序语言的变量命名规则的规则前提下,可以不局限于任何的规则。一般来讲,建议采用与原始类名称和该原始两变量名称均相关的字符、字符串或者代码等符号为该任务类命名。同样,任务方法的定义按照预先定义的方法命名规则进行命名。变量命名规则可以由程序员根据自己的编程习惯定义,其目的是为了方便程序员自己在程序调试、程序测试或者程序维护时对于任务类中的任务变量进行理解,因此,只要在符合所使用的程序语言的变量命名规则的规则前提下,可以不局限于任何的规则。一般来讲,建议采用与原始类名称和该原始两变量名称均相关的字符、字符串或者代码等符号为该任务类命名。
任务实现单元,根据原始代码文件中用于执行任务的代码段生产类混合代码文件的用于执行任务的代码段。具体为:对于原始代码段中用于实现某任务的代码段,将该代码段中的原始类替换为与该任务对应的任务类,将该代码段中的各原始类的原始变量替换为与该任务对应的任务类中与该原始变量对应的任务变量,将该代码段中的各原始类的原始方法替换为与该任务对应的任务类中与该原始方法对应的任务方法。
二.混淆模块
混淆模块用于对经类混合模块处理得到的类混合代码文件进行混淆处理以得到混淆代码文件。混淆模块的实现方式有多种,其原理是:将计算机程序的代码,转换成一种功能上等价但是难于阅读和理解的形式。具体为:将代码中的各种元素,如变量、函数、类的名字改写成无意义的名字。比如改写成无意义的随机字母组合的字符串,使得阅读的人无法根据名字猜测其用途。重写代码中的部分逻辑:例如将while循环改写为for循环,将if语句改写为case语句,将循环改写成递归等等。打乱代码的格式,比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。可以采用现有技术中已存在的或者未来技术中将会出现的各种混淆器来实现。
三.压缩模块
通过用长度更短的字符替代混淆代码文件的中的某些长度较长的字符,以压缩混淆代码文件的大小,使得压缩后得到的压缩代码文件更加的精简。
上述三种模块可以相互的通过不同的应用程序独立实现,也可以部分或者全部集成在同一应用程序中来实现。例如,将混淆模块和压缩模块集成在一个应用程序中实现时:可以在混淆类混合代码文件的时候:将代码中的各种元素,如变量、函数、类的名字改写成单个字母、或是简段的无意义字母组合,甚至改写成“_”这种无意义的符号。重写代码中的部分逻辑:精简中间变量。打乱代码的格式,比如删除空格,将多行代码挤到一行中等等。可以采用现有技术中已存在的或者未来技术中将会出现的各种混淆压缩器来实现。
基于本实施例所述的代码加密系统的代码加密方法包括:
步骤S1,获取原始代码文件。原始代码文件基于原始类实现任务,原始类包括原始变量和原始方法。
步骤S2,由类混淆模块对所述原始代码文件进行类混合处理得到类混合代码文件。具体包括:
步骤S2-1,由类混淆模块的原始类查找单元在原始代码文件中查找实现所述任务所需的所有所述原始类以及该原始类中与实现该任务相关的所有原始变量和原始方法。
步骤S2-2,由类混淆模块的任务类建立单元建立与任务对应的任务类并且按照类命名规则为所述任务类命名;
步骤S2-3,由类混淆模块的任务类建立单元为建立的任务类添加任务变量和任务方法。包括:在任务类中定义与需添加的原始类中的与实现任务相关的原始变量对应的任务变量以及在任务类中定义与需添加的原始类中的与实现任务相关的原始方法对应的任务方法。
步骤S2-4,由类混淆模块的任务实现单元根据原始代码文件中用于执行任务的代码段生产类混合代码文件的用于执行任务的代码段。使得类混淆代码文件能够基于任务类实现对应的任务。
步骤S3,由混淆处理模块将类混合代码文件进行代码混淆处理获得混淆代码文件。
下面以一段原始代码文件为例进行对本实施例的类混淆处理方法进行描述:
假如原始代码段需要执行一个人骑着马车去某个地方的任务。原始代码段包括用于执行该任务的人类、载物类、动物类这三种类的对象:人、车、马。并且,人需要有骑马的方法,马需要有奔跑的功能(即方法),车需要有滚动的功能(即方法)。通过这样三个类对象的合作就可以让人骑着马车到任何想到的目的地。
原始代码段中,需要对应三个类的类文件:
人类文件(person.class.php)中的部分代码:
原始代码文件中还包括用于实现人骑着马车去某个地方的执行文件,执行文件中将引用并示例化上述三个对象,然后调用彼此的方法协同合作实现人骑着马车去某个地方的任务:
include person.class.php;
include traler.class.php;
include.animal.class.php;
p=new person();
t=new traler();
a=new animal();
//赋予人这个对象名叫小明,男,18岁
p.age=18;
p.name=xiaomig;
p.sex=man;
//创建一个两条腿的黑色的车
t.color=black;
t.legs=2;
t.size=big;
//创建一条3岁的绿色小狗
a.age=3;
a.name=paul;
a.color=green;
//人骑马
p->drive();
//马拉车
a->pull();
//车滚动
t->run();
对上述原始代码文件进行类混合以后的类混合文件,包括对应于人骑马车的任务的任务类(person.class.php):
混淆代码文件中还包括用于实现人骑着马车去某个地方的执行文件,执行文件中将引用并示例化上述类对象,然后调用其中的方法实现人骑着马车去某个地方的任务:
include person.class.php;
p=new person();
//赋予人这个对象名叫小明,男,18岁
p.p.age=18;
p.p.name=xiaomig;
p.p.sex=man;
//创建一个两条腿的黑色的车
p.t.color=black;
p.t.legs=2;
p.t.size=big;
//创建一条3岁的绿色小狗
p.a.age=3;
p.a.name=paul;
p.a.color=green;
//人骑马
p->drive();
//马拉车
p->pull();
//车滚动
p->run();
经过类混合处理以后的类混合代码文件,在经过混淆处理、压缩处理以后,即使混淆处理的加密被反向破解了,但是核心代码的类都是以任务为单位进行封装的,将多个不相干的对象实体混合为一个虚拟特制对象(即任务类对象),通过预定的命名规则定义形式,形成难以理解和分割的以任务为单位的功能块,这样代码被窃取依然无从下手。
本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。