一种应用程序中so文件的加密方法、解密方法和***
技术领域
本发明涉及数据安全领域,更具体地,涉及应用程序中so文件的加密方法、解密方法和***。
背景技术
目前,Android应用程序都会将核心功能编写到so文件中,so文件是unix的动态连接库文件,作用相当于windows下的.dll文件。由于so文件是用C语言或者C++编写的,所以其安全性要比使用JAVA写的高很多。在Android应用程序发布的时候,so文件会放到最终的APK文件中。随着Android程序开发的模块化,一般会将独立的功能编写到一个SO文件中,然后主程序来加载每个独立功能的SO来完成相应的功能。
黑客通过解压缩APK文件可以很容易地获取到APK包中的所有so文件,从而盗取了开发者的知识产权。
现有技术通常采用so文件循环依赖的方法保护so文件,所谓循环依赖,通俗地说,就是如果存在a、b以及c三个so文件,那么让a文件校验b和c文件,但是这种方法中a文件并没有被校验,因此,黑客就可以通过修改a的校验程序绕过所有的校验步骤。显然,现有技术对so文件的保护存在巨大的漏洞。
发明内容
本发明提供一种克服上述问题或者至少部分地解决上述问题的应用程序中so文件的加密方法和***。
根据本发明的一个方面,提供一种应用程序中so文件的加密方法,包括:
S1、通过RSA算法生成应用程序中的每个so文件的公私密钥对,任意两个so文件的公私密钥对不相同;
S2、对于待加密so文件,配置有用于存储所述待加密so文件的加密数据的第一节信息以及用于存储所述待加密so文件的配对so文件的私钥的第二节信息;以及
S3、通过所述待加密so文件的公钥,对所述待加密so文件自身的数据进行加密,获得所述加密数据,将所述加密数据存储在所述第一节信息中,在所述第二节信息存储所述配对so文件的私钥。
根据本发明的另一个方面,本发明还提供一种与加密方法对应的解密方法,包括:
对于待解密so文件,获取所述待解密so文件中用于存放加密数据的字符数组的地址;
将所述字符数组权限修改为可写属性;
检索解密该字符数组的私钥和解密函数的地址;以及
调用私钥和解密函数对所述字符数组进行解密。
根据本发明的另一个方面,本发明还提供一种应用程序中so文件的加密***,包括:
密钥生成模块,用于通过RSA算法生成应用程序中的每个so文件的公私密钥对,任意两个so文件的公私密钥对不相同;
创建节模块,用于对于待加密so文件,配置有用于存储所述待加密so文件的加密数据的第一节信息以及用于存储所述待加密so文件的配对so文件的私钥的第二节信息;以及
存储模块,用于通过所述待加密so文件的公钥,对所述待加密so文件自身的数据进行加密,获得所述加密数据,将所述加密数据存储在所述第一节信息中,在所述第二节信息存储所述配对so文件的私钥。
根据本发明的另一个方面,本发明还提供一种应用程序中so文件的解密***,包括:
第一地址检索模块,用于对于待解密so文件,获取所述待解密so文件中用于存放加密数据的字符数组的地址;
属性修改模块,用于将所述字符数组权限修改为可写属性;
第二地址检索模块,用于检索解密该字符数组的私钥和解密函数的地址;以及
解密模块,用于调用私钥和解密函数对所述字符数组进行解密。
本申请提出一种应用程序中so文件的加密方法、解密方法和***,通过在应用程序的一个so文件中存储用于解密另一个so文件的密钥,使每一个so文件都依赖于另一个so文件,进而无法独立使用其中任何一个so文件,实现了对so文件的保护作用,通过调用解密每个so文件的密钥的地址,使得开发者可以调用任意一个so文件,方法简单,同时提高了效率。
附图说明
图1为本发明一个实施例的应用程序中so文件的加密方法的流程图;
图2为本发明另一个实施例的应用程序中so文件的加密方法的图;
图3为本发明实施例的一种应用程序中so文件的解密方法的流程图;
图4为本发明实施例的获取该so文件中用于存放加密数据的字符数组的地址的流程图;
图5为本发明实施例的应用程序中so文件的加密***的结构框图;
图6为本发明实施例的应用程序中so文件的解密***的结构框图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
现有技术通常采用so文件循环依赖的方法保护so文件,所谓循环依赖,通俗地说,就是如果存在a、b以及c三个so文件,那么让a文件校验b和c文件,但是这种方法中a文件并没有被校验,因此,黑客就可以通过修改a的校验程序绕过所有的校验步骤。
为了克服现有技术存在的上述缺陷,本发明提供一种应用程序中so文件的加密方法,如图1所示,具体包括:
S1、通过RSA算法生成应用程序中的每个so文件的公私密钥对,任意两个so文件的公私密钥对不相同;
S2、对于待加密so文件,配置有用于存储所述待加密so文件的加密数据的第一节信息以及用于存储所述待加密so文件的配对so文件的私钥的第二节信息;
S3、通过所述待加密so文件的公钥,对所述待加密so文件自身的数据进行加密,获得所述加密数据,将所述加密数据存储在所述第一节信息中,在所述第二节信息存储所述配对so文件的私钥。
需要注意的是,本加密方法通过在应用程序中每个待加密so文件中存储用于解密配对so文件的密钥,使每一个so文件都依赖于另一个so文件,进而无法独立使用其中任何一个so文件,实现了对so文件的保护作用。
需要注意的是,本实施例为了将加密数据和解密密钥的存储位置互不干涉,通过在每个so文件中创建两个节,即第一节信息和第二节信息来实现。
需要注意的是,加密前的数据包括so文件需要使用的表格数据、参数、系数或字符串。
在一个可选实施例中,所述步骤S2中在所述待加密so文件中创建用于存储加密数据的第一节信息,进一步包括:
在所述第一节信息中创建用于存放全局变量的字符数组。
在一个可选实施例中,所述步骤S3中将加密数据存储在所述第一节中,进一步包括:将所述加密数据作为全局变量存放至所述字符数组中。
需要注意的是,通过将数据统一定义到一个全局的字符数组中,而该字符数组定义在节中,同时对全局的字符数组进行加密,实现了每个so文件中的字符数组都是加密的。
在一个可选实施例中,所述步骤S3进一步包括:
将所述配对so文件的私钥对应的解密函数存储在所述待加密so文件中。
需要注意的是,解密的过程不止需要私钥,还需要解密函数,解密函数用于结合私钥对加密数据进行解密,因此,每个私钥都存在一个对应的解密函数。
图2示出了本发明中加密方法的另一个实施例的流程图,如图2可知,本加密方法除了前一个实施例包括的3个步骤,还进一步包括:
S4、存储解密所述配对so文件中加密数据的私钥和解密函数的地址。
需要注意的是,如何安排每个so文件的私钥的存储位置,具有两者方法,一种是按照顺序进行放置,例如将第一个so文件的私钥放置在第二个so文件中,将第二个so文件的私钥放置在第三个so文件中,依次类推,但是这样存在的问题就是,如果黑客希望解密某个so文件,只要按顺序获取该so文件以及排序在它后面的so文件,调用它后面的so文件中的密钥和解密函数,就可以解密该so文件。因此,还存在随机进行放置的方法,显然,在随机放置后,记录每一个私钥的存储位置就显得尤为重要,只有记录了每个私钥的存储位置,后期调用时才不许盲目地乱试。
图3示出了本发明实施例的一种应用程序中so文件的解密方法的流程图,如图3可知,该解密方法包括:
301、对于待解密so文件,获取所述待解密so文件中用于存放加密数据的字符数组的地址;
302、将所述字符数组权限修改为可写属性;
303、检索解密该字符数组的私钥和解密函数的地址;以及
304、调用私钥和解密函数对所述字符数组进行解密。
需要注意的是,字符数组的权限在常规状态下为只读属性,并不能修改,因此,在调用so文件时,首先要将字符数组的权限修改为可写属性。
需要注意的是,当主程序启动后,会加载所有so文件到内存中,同时会调用每个so文件的解密函数功能,来实现每个so文件对其他so文件中的加密数据进行解密,从而使得所有SO文件可以正常使用。
在一个具体实施例,so文件的解密方法还包括:在对所述字符数组进行解密后,将所述字符数组的权限还原为只读属性。
图4示出了获取该so文件中用于存放加密数据的字符数组的地址的流程图,如图4可知,该步骤包括:
401、获取所述待解密so文件的加载基址;
402、根据所述待解密so文件的文件格式,获取该字符数组节在所述待解密so文件的私钥so文件中的偏移;以及
403、根据所述加载基址和偏移,获得该字符数组的地址。
为了更清楚地阐明本发明应用程序中so文件的加密方法,下面结合具体实施例进行说明。
1、使用RSA算法来生成一对公钥PublicKey和私钥SecretKey。RSA.CreatePairKey(SecretKey,PublicKey)。
2、在每个so文件中增加一个节用于存放全局的字符数组。在xx.so文件中定义的字符数组为:
int g_var[max]__attribute__((section(".data")))={xx};
先使用RSA的加密算法来将数据加密来再填入到g_var字符数组中。从而实现g_var存储的数据就是已经加过密的。
其中__attribute__((section(".data")))表示将g_var字符数组添加到节名为“.data”的节中。
对数据进行加密则使用RSA.encrypt(PublicKey,g_var,size);语句,其中RSA.encrypt是RSA算法的加密接口,PublicKey是加密使用的公钥KEY,g_var是字符数组的内容,size则是占用内存的大小。
3、在另一个so文件中添加第二节信息,用于存储私钥SecretKey,具体实现如下:String SecretKey[]__attribute__((section(".key")))={xx};其中SecretKey是需使用的私钥SecretKey,__attribute__((section(".key")))表示将SecretKey添加到新增加的第二节信息.key中。
为了更清楚地阐明本发明应用程序中so文件的解密方法,下面结合具体实施例进行说明。
1、通过读取***文件/proc/PID/maps读取到每个so文件的加载基址,其中PID表示当前应用的进程ID值。
2、获取到so文件的基址后,由于so文件的格式是公开的,依据so文件的文件格式来获取到字符数组节所在so文件中的偏移,从而加上基址则可以得到字符数组在内存中的地址。
3、将字符数组的权限修改为可写属性,具体调用API函数mprotect来修改:
mprotect((void*)(addr,size,PROT_READ|PROT_EXEC|PROT_WRI TE))
通过这个API函数则将内存地址为addr,大小为size的内存修改成可以写、可以读以及可以执行的内存属性。
在一个具体实施例中,调用解密函数来对加密数据进行解密操作,RSA.decrypt(SecretKey,addr,size)。
在一个具体实施例中,对数据进行了解密后,需要对内存属性进行还原。具体还是调用mprotect函数来还原:mprotect((void*)(addr,size,PROT_READ|PROT_EXEC)),将其中的写属性去掉,改为只读和可执行。
在一个实施例中,本发明还提供一种应用程序中so文件的加密***,如图5所示,包括:
密钥生成模块,用于通过RSA算法生成应用程序中的每个so文件的公私密钥对,任意两个so文件的公私密钥对不相同;
创建节模块,用于对于待加密so文件,配置有用于存储所述待加密so文件的加密数据的第一节信息以及用于存储所述待加密so文件的配对so文件的私钥的第二节信息;以及
存储模块,用于通过所述待加密so文件的公钥,对所述待加密so文件自身的数据进行加密,获得所述加密数据,将所述加密数据存储在所述第一节信息中,在所述第二节信息存储所述配对so文件的私钥。
在一个可选实施例中,创建节模块进一步用于:在所述第一节信息中创建用于存放全局变量的字符数组,存储模块进一步用于将所述加密数据作为全局变量存放至所述字符数组中。
在一个可选实施例中,存储模块进一步用于:将所述配对so文件的私钥对应的解密函数存储在所述待加密so文件中。
在一个可选实施例中,加密***除了上述模块外,还包括:
存储密钥模块,用于存储解密所述配对so文件中加密数据的私钥和解密函数的地址。
在一个实施例中,本发明还提供一种应用程序中so文件的解密***,如图6所示,包括:
第一地址检索模块,用于对于待解密so文件,获取所述待解密so文件中用于存放加密数据的字符数组的地址;
属性修改模块,用于将所述字符数组权限修改为可写属性;
第二地址检索模块,用于检索解密该字符数组的私钥和解密函数的地址;以及
解密模块,用于调用私钥和解密函数对所述字符数组进行解密。
在一个可选实施例中,解密***还包括:
权限还原模块,用于在对所述字符数组进行解密后,将所述字符数组的权限还原为只读属性。
在一个可选实施例中,第一地址检索模块进一步包括:
加载基址单元,用于获取所述待解密so文件的加载基址;
偏移单元,根据所述待解密so文件的文件格式,获取该字符数组节在所述待解密so文件的私钥so文件中的偏移;以及
地址获取单元,用于根据所述加载基址和偏移,获得该字符数组的地址。
在一个实施例中,本发明公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:
S1、通过RSA算法生成应用程序中的每个so文件的公私密钥对,任意两个so文件的公私密钥对不相同;
S2、对于待加密so文件,配置有用于存储所述待加密so文件的加密数据的第一节信息以及用于存储所述待加密so文件的配对so文件的私钥的第二节信息;以及
S3、通过所述待加密so文件的公钥,对所述待加密so文件自身的数据进行加密,获得所述加密数据,将所述加密数据存储在所述第一节信息中,在所述第二节信息存储所述配对so文件的私钥。
在一个实施例中,本发明公开了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:
S1、通过RSA算法生成应用程序中的每个so文件的公私密钥对,任意两个so文件的公私密钥对不相同;
S2、对于待加密so文件,配置有用于存储所述待加密so文件的加密数据的第一节信息以及用于存储所述待加密so文件的配对so文件的私钥的第二节信息;以及
S3、通过所述待加密so文件的公钥,对所述待加密so文件自身的数据进行加密,获得所述加密数据,将所述加密数据存储在所述第一节信息中,在所述第二节信息存储所述配对so文件的私钥。
最后,本申请的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。