本发明涉及安全技术领域,尤其涉及一种加固sdk项目的方法及系统。
背景技术:
sdk(sfotwaredevelopkit)是一种软件开发工具包,由sdk开发者开发完成,发布到开发者平台上,供第三方软件开发者集成。由于sdk发布后,任意第三方软件开发者均可以下载该sdk的jar包,并将该jar包集成进自身软件中。目前市面上绝大多数的sdk对应的jar包仅仅只是对代码进行了混淆,可以通过反编译工具进行反编译,很容易读懂sdk中的代码逻辑,不法分子则可以通过反编译进行代码篡改,输入窃取用户信息、注入广告等恶意代码,并二次打包编译。sdk项目的安全性堪忧。
技术实现要素:
本发明所要解决的技术问题是:如何提高sdk项目的安全性。
为了解决上述技术问题,本发明采用的技术方案为:
本发明提供一种加固sdk项目的方法,包括:
s1、根据原始sdk项目生成原始dex文件;
s2、加密所述dex文件,得到dex加密文件;
s3、新建sdk项目,得到新建的sdk项目;
s4、在所述新建的sdk项目中创建与所述dex加密文件中的核心代码对应的接口类;所述接口类可反射调用所述dex加密文件中的核心代码;
s5、打包所述新建的sdk项目和所述dex加密文件,得到加固的sdk项目。
本发明还提供一种加固sdk项目的系统,包括:
第一生成模块,用于根据原始sdk项目生成原始dex文件;
加密模块,用于加密所述dex文件,得到dex加密文件;
新建模块,用于新建sdk项目,得到新建的sdk项目;
第二生成模块,用于在所述新建的sdk项目中创建与所述dex加密文件中的核心代码对应的接口类;所述接口类可反射调用所述dex加密文件中的核心代码;
打包模块,用于打包所述新建的sdk项目和所述dex加密文件,得到加固的sdk项目。
本发明的有益效果在于:由于加密会破坏文件结构,若未用相应的解密逻辑进行解密,相当于一个破损的文件,无法用工具还原成对应的jar包,因此,通过将原始sdk项目转换成dex加密文件,极大程度上增加了sdk项目的代码安全性;此外,新建sdk项目中包含可调用原始sdk项目核心代码的接口类,只将新建sdk项目中的接口类暴露给外部系统,外部系统通过调用新建sdk项目中的接口类达到调用原始sdk项目核心代码的目的,使得即使破解了新建sdk项目,也无法获取原始sdk项目中的核心代码,提高了sdk项目的安全性。
附图说明
图1为本发明提供一种加固sdk项目的方法的具体实施方式的流程框图;
图2为本发明提供一种加固sdk项目的系统的具体实施方式的系统框图;
标号说明:
1、第一生成模块;2、加密模块;3、新建模块;4、第二生成模块;5、打包模块;6、创建模块;7、加载模块;8、解密模块;9、设置模块;10、混淆模块;11、第三生成模块。
具体实施方式
为详细说明本发明的技术内容、所实现目的及效果,以下结合实施方式并配合附图予以说明。
如图1所示,本发明提供一种加固sdk项目的方法,包括:
s1、根据原始sdk项目生成原始dex文件;
s2、加密所述dex文件,得到dex加密文件;
s3、新建sdk项目,得到新建的sdk项目;
s4、在所述新建的sdk项目中创建与所述dex加密文件中的核心代码对应的接口类;所述接口类可反射调用所述dex加密文件中的核心代码;
s5、打包所述新建的sdk项目和所述dex加密文件,得到加固的sdk项目。
进一步地,所述s2之后,还包括:
根据md5算法生成与所述dex加密文件对应的md5值。
由上述描述可知,通过md5值可在jni中验证dex加密文件是否被篡改。
进一步地,创建与所述dex加密文件中的核心代码对应的接口类之前,还包括:
调用预设的java本地接口验证所述md5值,若所述md5值未通过验证,则标记所述dex加密文件被篡改;否则解密所述dex加密文件,得到dex解密文件;
创建类加载器;
所述类加载器加载所述dex解密文件。
由上述描述可知,由于c++的反编译难度较高,反编译后的逻辑可读性也较差,因此通过jni(java本地接口)解密dex加密文件,提高了解密逻辑的破解难度,从而提高了sdk项目的安全性。
进一步地,还包括:
设置所述接口类中的函数名称为所述核心代码中对应函数的名称。
进一步地,所述s1之前,还包括:
混淆所述原始sdk项目中的代码。
由上述描述可知,有利于提高sdk项目被反编译的难度,从而提高sdk项目的安全性。
本发明还提供一种加固sdk项目的系统,包括:
第一生成模块1,用于根据原始sdk项目生成原始dex文件;
加密模块2,用于加密所述dex文件,得到dex加密文件;
新建模块3,用于新建sdk项目,得到新建的sdk项目;
第二生成模块4,用于在所述新建的sdk项目中创建与所述dex加密文件中的核心代码对应的接口类;所述接口类可反射调用所述dex加密文件中的核心代码;
打包模块5,用于打包所述新建的sdk项目和所述dex加密文件,得到加固的sdk项目。
进一步地,还包括:
第三生成模块11,用于根据md5算法生成与所述dex加密文件对应的md5值。
进一步地,还包括:
解密模块8,用于调用预设的java本地接口验证所述md5值,若所述md5值未通过验证,则标记所述dex加密文件被篡改;否则解密所述dex加密文件,得到dex解密文件;
创建模块6,用于创建类加载器;
加载模块7,用于所述类加载器加载所述dex解密文件。
进一步地,还包括:
设置模块9,用于设置所述接口类中的函数名称为所述核心代码中对应函数的名称。
进一步地,还包括:
混淆模块10,用于混淆所述原始sdk项目中的代码。
本发明的实施例一为:
s1、混淆所述原始sdk项目中的代码,得到混淆的sdk项目;
其中,使用java的混淆工具proguard进行代码混淆,proguard是一个压缩、优化和混淆java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。常常用于android开发,用于混淆最终的项目,增加项目被反编译的难度。
其中,不混淆的代码包括:暴露的接口类、组件类(如activity组件和service组件)和自定义控件view。
s2、根据所述混淆的sdk项目生成原始dex文件;
其中,先打包混淆的sdk项目,得到对应的jar包;再通过androidsdkbuild-tools中的dx.bat工具将jar包转成dex文件。
s3、加密所述dex文件,得到dex加密文件;
其中,将加密后的dex文件放入到目标应用项目的assets文件夹下。
s4、根据md5算法生成与所述dex加密文件对应的md5值;
s5、在新建sdk项目中,调用预设的java本地接口验证所述md5值,若所述md5值未通过验证,则标记所述dex加密文件被篡改;否则解密所述dex加密文件,得到dex解密文件;创建类加载器;所述类加载器加载所述dex解密文件;根据所述dex解密文件,创建与所述dex加密文件中的核心代码对应的接口类;所述接口类可反射调用所述dex加密文件中的核心代码;设置所述接口类中的函数名称为所述核心代码中对应函数的名称;
其中,调用新建的类加载器dexclassloader的loadclass函数加载原始sdk项目中的接口类,并重新实现该接口类中的函数,重新实现的函数可反射调用原始sdk项目中对应的函数。
s6、打包所述新建的sdk项目和所述dex加密文件,得到加固的sdk项目;
其中,打包新建sdk项目得到对应的jar包,将该jar包、jni(java本地接口)的so文件、dex加密文件和集成文档一起提供给第三方开发者。
本发明的实施例二为:
混淆模块10混淆所述原始sdk项目中的代码;第一生成模块1根据原始sdk项目生成原始dex文件;加密模块2加密所述dex文件,得到dex加密文件;第三生成模块11根据md5算法生成与所述dex加密文件对应的md5值;创建模块6创建类加载器;解密模块8调用预设的java本地接口验证所述md5值,若所述md5值未通过验证,则标记所述dex加密文件被篡改;否则解密所述dex加密文件,得到dex解密文件;加载模块7所述类加载器加载所述dex解密文件;新建模块3新建sdk项目,得到新建的sdk项目;第二生成模块4在所述新建的sdk项目中创建与所述dex加密文件中的核心代码对应的接口类;所述接口类可反射调用所述dex加密文件中的核心代码;设置模块9设置所述接口类中的函数名称为所述核心代码中对应函数的名称;打包模块5打包所述新建的sdk项目和所述dex加密文件,得到加固的sdk项目。
综上所述,本发明提供的一种加固sdk项目的方法及系统,通过将原始sdk项目转换成dex加密文件,极大程度上增加了sdk项目的代码安全性;此外,新建sdk项目中包含可调用原始sdk项目核心代码的接口类,只将新建sdk项目中的接口类暴露给外部系统,使得即使破解了新建sdk项目,也无法获取原始sdk项目中的核心代码,提高了sdk项目的安全性。进一步地,通过jni(java本地接口)解密dex加密文件,提高了解密逻辑的破解难度,从而提高了sdk项目的安全性。进一步地,通过混淆原始sdk项目中的代码既能优化加密dex文件的包体大小,又有利于提高sdk项目被反编译的难度,从而提高sdk项目的安全性。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等同变换,或直接或间接运用在相关的技术领域,均同理包括在本发明的专利保护范围内。