本发明属于信息安全技术领域,涉及一种针对androidjar(javaarchive)sdk(softwaredevelopmentkit)包的安全加固方法,能够防止sdk被破解、逆向分析及盗版。
背景技术:
随着移动设备的普及,android系统凭借其开源的优势,得到了国内外诸多开发者的支持。为了方便开发者开发基于android平台的应用,google公司提供了sdk包。sdk又名软件开发工具包。除了google提供用于开发android应用的sdk包外,还存在第三方sdk包。第三方sdk包用于实现包括广告、支付、统计、地图等类别服务,是广告商、支付公司、社交、地图服务商等第三方服务公司为了便于应用开发人员使用其提供的服务而开发的工具包。sdk包封装了一些复杂的逻辑实现以及请求,响应解析的api。
sdk包需对sdk包的应用者提供某项服务,在这个简单的运用场景中却存在很多安全问题。如sdk包被攻击者反编译后查看源码,sdk包被攻击者篡改后二次打包等。这些安全隐患都与sdk包的源码可读性与可见性有着密切的关系。
sdk包基于java语言开发。使用java语言封装的jar包作为一种字节码文件很容易被如jd-gui的反编译工具,反编译后得到源码。为了防止攻击者对公开的sdk进行源码分析和二次打包,需要对sdk包进行加固。sdk包的加固需要涉及sdk代码加密,sdk库文件加密,sdk防篡改保护,sdk防调试及dump保护。sdk代码加密(混淆),是对sdk源码中的变量名称和函数名称修改为无实际含义的字符串,用于防止在攻击者反编译得到源码后读取源码的业务逻辑。sdk防篡改保护,通过增加签名机制,防止攻击者将恶意篡改后的sdk包被使用。sdk防调试,防止攻击者使用如od,ida等分析工具,动态调试sdk包。dump保护是在对sdk包运行在内存中后防止被攻击者获取字节码的一种保护方式。
sdk用于开发者二次开发使用,因此在对sdk中的接口进行混淆时,需要考虑到在调用时依旧使用初始接口名称。
当前市面上对于android系统软件安全的保护大多集中于apk加固,很少有人能实现对于sdk包的加固。由于对android应用的开发数量远高于对androidsdk包的开发数量,因此对于apk加固的需求量远大于对于sdk包的加固。一个sdk包可能被多个android应用使用,因此对于sdk包的安全威胁波及范围更广。
技术实现要素:
为了克服上述现有技术的不足,本发明提供一种对于sdk包的加固方法,包括sdk代码加密(混淆)、sdk库文件加密、sdk防篡改保护、sdk防调试及dump保护,使得加固后的sdk包难以被破解,逆向分析及盗版,达到保护版权或防止对软件进行恶意篡改的目的。另外,需保证加固后的sdk包源代码可以正常被调用,不影响程序的正常执行。
本发明提供的技术方案如下:
一种针对android平台sdk包的加固方法,所述加固方法包括对sdk代码加密过程、对sdk库文件加密过程、sdk防篡改保护过程、sdk防调试过程和dump保护过程,具体包括如下步骤:
a.对sdk代码进行加密(混淆):
a1.分析原始提供的sdk文件,可获取sdk包字节码格式;
a2.分析不可修改字段:根据sdk包字节码格式,分析得到字节码文件中不可被混淆的变量名称和方法名称;
a3.更改变量名称及方法名称:对修改后不影响sdk包使用的、可被混淆的变量名称和方法名称进行修改;
b.对sdk库文件加密:
b1.分析原始sdk包中的库文件;
b2.对sdk包中的库文件进行加密,可以使用自定义的加密算法或者公开的通用加密算法实施加密操作,得到制作好的sdk包;
c.sdk防篡改保护,执行如下操作:
c1.对步骤b中制作好的sdk包进行签名;
c2.将签名好的sdk包与hash摘要、签名公钥一同发布;
d.sdk防调试:
d1.分析常用调试工具的调试特性,如od(ollydbg)、idapro等调试工具;
d2.根据调试工具的调试特性,在sdk的源代码中添加现有的反调试代码,使得在sdk源码被调试时停止sdk所在的进程,由此防止调试工具调试;
e.dump保护过程,执行如下操作:
e1.分析确定进程加载过程的模块列表用来读取进程的内存的函数;
e2.对e1中所确定的函数进行检测和拦截,禁止所述函数对所保护的字节码进行访问。
步骤e2可通过创建程序来实现。对于e2中所述的方法,函数拦截可以通过找到原始函数在内存中运行的位置,在内存层修改函数执行流程,达到函数拦截的目的。
与现有技术相比,本发明的有益效果是:
本发明提供一种针对android平台sdk包的加固方法,包括对sdk代码加密过程、对sdk库文件加密过程、sdk防篡改保护过程、sdk防调试过程和dump保护过程,同时保证加固后的sdk包源代码可以正常被调用,不影响程序的正常执行。利用本发明提供的技术方案,可以有效地隐藏sdk包的逻辑代码,使得加固后的sdk包难以被破解,逆向分析及盗版,从而对sdk包程序进行版权保护,防止其被逆向,篡改,二次打包。
附图说明
图1是本发明实施例中对sdk代码加密的流程框图。
图2是本发明实施例中对sdk库文件加密的流程框图。
图3是本发明实施例中sdk防篡改保护的流程框图。
图4是本发明实施例中sdk防调试的流程框图。
图5是本发明实施例中dump保护的流程框图。
图6是本发明提供加固模块的整体流程框图;
其中,(a)为sdk加固涉及的模块;(b)为(a)中加固模块对应的主要方法。
具体实施方式
下面结合附图,通过实施例进一步描述本发明,但不以任何方式限制本发明的范围。
本发明提供一种对于sdk包的加固方法,包括对sdk代码加密过程、对sdk库文件加密过程、sdk防篡改保护过程、sdk防调试过程和dump保护过程,使得加固后的sdk包难以被破解,逆向分析及盗版,达到保护版权或防止对软件进行恶意篡改的目的。另外,需保证加固后的sdk包源代码可以正常被调用,不影响程序的正常执行。
以下实施例将未加固的sdk包作为输入,利用本发明提供的加固方法,首先对sdk的字节码格式进行分析,将修改后不影响sdk包运行的函数名称或变量名称进行修改,替换为加密后的字节码;然后在sdk包加入可以预防反调试工具的代码;再对sdk包进行签名,并将sdk签名包的hash摘要发布;最后输出为加固后的sdk包。图6是本发明提供加固方法的整体流程框图,本实例的具体实施方式如下:
a.在对sdk代码加密时,按如下步骤进行(如图1所示):
a1.字节码格式分析:分析待加固的sdk包,了解打包后sdk包的字节码格式;
a2.不可修改字段分析:根据a1中分析的字节码格式,结合java底层运行原理,分析不可被混淆的变量名称和方法名称。由于sdk包需对外开放api接口,因此对外提供的接口名称不可做混淆;
a3.更改变量名称及方法名称:根据a2中的分析结果,对修改后不影响sdk包正常使用的变量名称或方法名称进行修改。
b.在对sdk进行解密操作时,可执行如下流程(如图2所示):
b1.加载加密后的字节码文件;
b2.加载解密算法;
b3.使用解密算法解密字节;
b4.生成解密后可运行的字节码文件。
c.在sdk防篡改保护时,可执行如下流程(如图3所示):
c1.获得使用过hash算法a处理后的sdk包;
c2.使用hash算法计算c1中sdk包的hash编码;
c3.将c2中产生的hash编码使用私钥加密,生成hash表摘要;
c4.将c1中的签名成功的sdk包,c3中产生的加密的hash表摘要和与c3中匹配的公钥发布;
c5.使用者在运用c4的发布的sdk包时,首先将发布内容解析为sdk包源码、hash表摘要、公钥;
c6.使用hash算法a(与c1中相同)对c5中sdk包源码做运算,获取到hash表1,根据c5中的hash表摘要、公钥得到hash表2;
c7.对比hash表1和hash表2内容是否一致;
c8.c7中对比结果一致表示sdk源码未被修改,否则表示被修改。
d.完成sdk防调试,可执行如下流程(如图4所示):
d1.了解od,ida等工具调试特性;
d2.根据d1中分析的特性,在源码中添加反调试代码(如监测是否有新的进程附加到当前进程),防止调试工具调试。
e.dump保护,可按如下流程操作(如图5所示):
e1.分析进程加载的模块列表通常要使用哪些函数来读取进程的内存。
e2.创建驱动程序,利用驱动在内核模式下拦截这些函数并禁止,函数拦截可以通过找到原始函数在内存中运行的位置,在内存层修改函数执行流程,达到函数拦截的目的。
需要注意的是,公布实施例的目的在于帮助进一步理解本发明,但是本领域的技术人员可以理解:在不脱离本发明及所附权利要求的精神和范围内,各种替换和修改都是可能的。因此,本发明不应局限于实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。