著录项信息
专利名称 | 一种Android系统的应用程序的加固方法 |
申请号 | CN201610034627.8 | 申请日期 | 2016-01-19 |
法律状态 | 权利终止 | 申报国家 | 中国 |
公开/公告日 | 2016-03-23 | 公开/公告号 | CN105426708A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F21/14 | IPC分类号 | G;0;6;F;2;1;/;1;4查看分类表>
|
申请人 | 北京鼎源科技有限公司 | 申请人地址 | 北京市海淀区知春路113号银网中心A座606室
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 北京鼎源科技有限公司 | 当前权利人 | 北京鼎源科技有限公司 |
发明人 | 文伟平 |
代理机构 | 北京万象新悦知识产权代理事务所(普通合伙) | 代理人 | 张肖琪 |
摘要
本发明公布了一种Android系统的应用程序的加固方法,通过二进制流加密对Android应用程序中的关键代码进行加固,保护应用程序代码;包括:解析classes.dex文件;定位到关键方法;进行第一次加密,得到中间数据;对中间数据进行第二次加密;计算新的dex文件的Hash值,加密后存入so文件中;计算得到新的dex文件checksum和signature的值,更新dex文件;重新生成apk,即完成加密过程。解密时,计算dex文件的Hash值,进行加密得到的Hash值与so文件中的值比较;进行二次解密操作,得到关键代码。本发明可使得无法通过反编译工具查看Android源码,且只对关键代码加密保护,保护代码的完整性,有效抵抗静态分析,防止Android程序代码被篡改,保证程序运行效率。
1.一种Android系统的应用程序的加固方法,通过二进制流加密方法对Android应用程序中的关键代码进行加固,使得Android应用程序代码得到保护;所述加固方法包括加密过程和解密过程,具体包括如下步骤:
A.针对需要保护的Android应用程序,对关键代码进行加密,执行如下操作:
A1.首先对需要保护的Android应用程序解压,获得Android应用程序中的classes.dex文件,对所述classes.dex文件进行解析;
A2.设定需要加密的特定类的关键方法,定位到需要加密的特定类的关键方法;所述设定需要加密的特定类的关键方法,具体包括重要算法方法、验证登陆方法、系统关键流程方法中的一个或多个;
A3.设定密钥key1,使用密钥key1对步骤A2所述关键方法的指令进行第一次加密,得到第一次加密后的中间数据;
A4.设定密钥key2,使用密钥key2对步骤A3所述中间数据进行第二次加密;
A5.将二次加密后得到数据更新到dex文件中,得到新的dex文件;
A6.计算步骤A5所述新的dex文件的Hash值,该Hash值用于校验dex的完整性;对Hash值进行加密后存入到so文件中;
A7.对于步骤A5所述新的dex文件,重新计算得到checksum和signature的值,更新dex文件;
A8.压缩重新生成apk,即完成加密过程;所述重新生成的apk中包含关键代码加密的dex文件和包含解密和dex校验信息的so文件;
B.开始执行Android应用程序时,对加密的Android应用程序进行解密得到关键代码,执行如下操作:
B1.Android应用程序被载入内存后,执行so文件中的程序;
B2.在内存中找到dex文件;
B3.对于得到的dex文件,计算dex文件的Hash值,然后对Hash进行加密,得到加密后的Hash值;
B4.将步骤B3所述加密后的Hash值和步骤A6所述so文件中保存的值进行比较;如果一致,则执行步骤B5,否则返回错误码,程序停止运行;
B5.执行关键代码时,从so文件中取得密钥key2,对关键代码进行解密,得到中间代码;
B6.针对步骤B5得到的中间代码,从so文件中取得密钥key1,进行第二次解密,得到最终的关键代码;
B7.进行关键代码的方法调用。
2.如权利要求1所述Android系统的应用程序的加固方法,其特征是,步骤A3所述第一次加密或步骤A4所述第二次加密均可采用AES加密方法,所述AES加密方法包括采用自行编写的AES加密程序或使用AES的加密工具。
3.如权利要求1所述Android系统的应用程序的加固方法,其特征是,步骤A6所述加密为MD5加密方法。
4.如权利要求1所述Android系统的应用程序的加固方法,其特征是,步骤B1所述执行so文件中的程序,具体为通过JNI调用机制调用so文件中的方法。
一种Android系统的应用程序的加固方法\n技术领域\n[0001] 本发明涉及信息安全技术领域,尤其涉及一种Android系统的应用程序的加固方法。\n背景技术\n[0002] 安卓(Android)操作系统由Google公司与OHA成员共同开发的开源操作系统,主要应用于移动设备,如智能手机、平板电脑等。自2007年推出以来,Android操作系统以其基于Linux内核、开放源码等特点迅速得到广大开发人员以及许多厂商的支持。与此同时,基于Android平台的应用程序数目飞速增长。2013年7月,Google公司宣布Google Play商店的应用程序数量已经超过100万个,成为全球最大的应用商店。\n[0003] 目前,大多Android程序都仅使用Android SDK编写,但是传统的Java语言编写的程序很容易遭到逆向破解。Android系统在安全方面所面临的主要问题是盗版应用和恶意软件。盗版应用的盛行极大损害了广大开发者的利益和积极性,而恶意代码的植入使得Android用户面临隐私泄漏和财产损失的风险。在Android产业链中,盗版组织异常活跃。他们紧紧追随Android应用,哪些应用火,就“山寨”什么应用。“打包党”轻者在山寨应用中植入恶意广告插件,通过广告弹出牟利;重者将Android木马、后门植入其中,对用户移动终端进行远程控制。\n[0004] Windows平台的软件保护技术由于广泛的使用以及安全人员多年研究,已经形成了一套完整的保护体系。但由于Android平台与Windows平台底层实现的差别,导致在Windows平台一系列针对软件保护的理念及机制不能有效地移植到Android平台。同时,由于Android平台诞生时间较短,软件保护方面的研究尚处于起步阶段,针对越来越成熟的破解技术并不能够提供比较有效的保护,软件开发者的知识产权受到侵犯的事件屡见不鲜。\n[0005] 现有的一些Android应用程序加固方法,大多采用静态处理的方法,即对dex文件进行一些修改来增加攻击的难度。这种加固方法只是增加了代码阅读难度,但其防护效果有限,攻击者依然能够得到程序的代码,无法保证应用程序的安全性。\n发明内容\n[0006] 为了克服上述现有技术的不足,本发明提供一种Android系统的应用程序的加固方法,该方法基于Android系统利用二进制流加密方法进行加固,对Android应用程序中的关键代码进行加密,以达到保护Android应用程序的目的。\n[0007] 本发明提供的技术方案是:\n[0008] 一种Android系统的应用程序的加固方法,通过二进制流加密方法对Android应用程序中的关键代码进行加固,使得Android应用程序代码得到保护;所述加固方法包括加密过程和解密过程,具体包括如下步骤:\n[0009] A.针对需要保护的Android应用程序,对关键代码进行加密,执行如下操作:\n[0010] A1.首先对需要保护的Android应用程序解压,获得Android应用程序中的classes.dex文件,对所述dex文件进行解析;\n[0011] A2.设定需要加密的特定类的关键方法,定位到需要加密的特定类的关键方法;\n[0012] A3.设定密钥key1,使用密钥key1对步骤A2所述关键方法的指令进行第一次加密,得到第一次加密后的中间数据;\n[0013] A4.设定密钥key2,使用密钥key2对步骤A3所述中间数据进行第二次加密;\n[0014] A5.将二次加密后得到数据更新到dex文件中,得到新的dex文件;\n[0015] A6.计算步骤A5所述新的dex文件的Hash值,该值用于校验dex的完整性;对Hash值进行加密后存入到so文件中;\n[0016] A7.对于步骤A5所述新的dex文件,重新计算得到checksum和signature的值,更新dex文件;\n[0017] A8.压缩重新生成apk,即完成加密过程;所述重新生成的apk中包含关键代码加密的dex文件和包含解密和dex校验信息的so文件;\n[0018] B.开始执行Android应用程序时,对加密的Android应用程序进行解密得到关键代码,执行如下操作:\n[0019] B1.Android应用程序被载入内存后,执行so文件中的程序;\n[0020] B2.在内存中找到dex文件;\n[0021] B3.对于得到的dex文件,计算dex文件的Hash值,然后对Hash进行加密,得到加密后的Hash值;\n[0022] B4.将步骤B3所述加密后的Hash值和步骤A6所述so文件中保存的值进行比较;如果一致,则执行步骤B5,否则返回错误码,程序停止运行;\n[0023] B5.执行关键代码时,从so文件中取得密钥key2,对关键代码进行解密,得到中间代码;\n[0024] B6.针对步骤B5得到的中间代码,从so文件中取得密钥key1,进行第二次解密,得到最终的关键代码;\n[0025] B7.进行关键代码的方法调用。\n[0026] 上述Android系统的应用程序的加固方法,进一步地,步骤A2所述设定需要加密的特定类的关键方法,具体包括重要算法方法、验证登陆方法、系统关键流程方法中的一个或多个。\n[0027] 上述Android系统的应用程序的加固方法,进一步地,步骤A3所述第一次加密或步骤A4所述第二次加密均可采用AES加密方法,所述AES加密方法包括采用自行编写的AES加密程序或使用AES的加密工具。\n[0028] 上述Android系统的应用程序的加固方法,进一步地,步骤A6所述加密为MD5加密方法。\n[0029] 上述Android系统的应用程序的加固方法,进一步地,步骤B1所述执行so文件中的程序,具体为通过JNI调用机制调用so文件中的方法。\n[0030] 与现有技术相比,本发明的有益效果是:\n[0031] 现有Android应用程序加固方法,大多采用静态处理的方法,即对dex文件进行一些修改来增加攻击的难度。这种加固方法只是增加了代码阅读难度,但其防护效果有限,攻击者依然能够得到程序的代码。利用本发明提供的技术方案,可以动态地解密程序。本发明提供的加固方法对关键函数进行双层加密保护,并增加了dex的安全校验,让攻击者拿不到代码,并且修改的程序也无法运行,可以实现对代码的完整性进行保护,有效地抵抗了静态分析,防止Android应用程序的代码被篡改,并使得黑客不能通过反编译等工具查看Android源码,而且只对关键代码进行加密保护,保证了程序的运行效率。\n附图说明\n[0032] 图1是本发明提供方法的流程框图。\n[0033] 图2是Android应用程序中的dex文件的文件组成结构图。\n具体实施方式\n[0034] 下面结合附图,通过实施例进一步描述本发明,但不以任何方式限制本发明的范围。\n[0035] 本发明提供一种基于Android系统二进制流加密技术的加固方法,图1是本发明提供方法的流程框图,包括如下步骤:\n[0036] A.对关键代码进行加密,执行如下操作:\n[0037] A1.解析classes.dex文件;\n[0038] A2.定位到特定的类和方法;\n[0039] A3.使用密钥key1进行第一次加密;\n[0040] A4.使用密钥key2进行第二次加密;\n[0041] A5.更新dex文件;\n[0042] A6.计算classes.dex文件的Hash值并对Hash值进行加密,存放到so文件中;\n[0043] B.对加密的代码进行解密,执行如下操作:\n[0044] B1.找到dex的起始地址;\n[0045] B2.对dex文件进行Hash值运算,将得到的结果进行加密,和so文件中保存的值进行比较;\n[0046] B3.使用密钥key1进行第一次解密;\n[0047] B4.使用密钥key2进行第二次解密;\n[0048] B5进行关键代码的方法调用。\n[0049] 本发明提供的基于Android系统二进制流加密技术的加固方法包括加密过程和解密过程;以下通过实施例说明本发明方法的具体实施:\n[0050] 加密过程:\n[0051] 对于需要保护的Android应用程序(apk),首先解压获得apk中的classes.dex文件,然后对dex文件进行解析;\n[0052] 开发者设定需要加密的特定类的关键方法(需要加密的特定类关键方法根据开发者的需求进行判断设定,例如,某些重要算法方法,或者验证登陆方法,或者某一个系统关键流程),然后定位到需要加密的特定类的关键方法;\n[0053] 由加固者设定密钥key1(加固者需要保密,在解密的时候需要用这个密钥对密文进行解密),先使用密钥key1对关键方法的指令进行第一次加密(采用AES加密,可采用自行编写的AES加密程序,也可以使用AES的加密工具),得到第一次加密后的中间数据;\n[0054] 然后设定密钥key2,使用密钥key2对中间数据进行第二次加密(也采用AES加密);\n连续两次AES加密,可增加安全性;\n[0055] 更新dex文件:将二次加密后得到数据更新到dex文件中,得到新的dex文件;\n[0056] 计算新的dex文件的Hash值,该值用于校验dex的完整性;对Hash值进行加密(MD5加密)后存入到so文件中;即在so文件中加入了对dex文件的校验和解密参数;\n[0057] 对于修改后的dex文件,重新计算得到checksum和signature的值,更新dex文件;\n[0058] 压缩重新生成apk,即完成加密过程。\n[0059] 重新生成的apk中,包含已经部分关键代码加密的dex文件、so文件(是加固者提供的一段程序C程序,默认是安全的),so文件中包含解密过程和dex的校验过程。\n[0060] 解密过程:\n[0061] 开始执行程序(AES加密的apk程序),首先执行so文件中的程序:\n[0062] 具体地,AES加密程序被载入内存后,在程序开始执行的时候先通过JNI(Java Native Interface)调用机制,执行so文件中的校验和解密以及恢复代码,具体是通过Java代码调用so文件(so库)中的方法,先搜索程序内存,找到经过加密处理后需要还原的相应的类和方法。寻找时可预制一些标签在程序中,来帮助寻找需要解密的部分;\n[0063] 然后,在内存中寻找dex文件:图2是dex文件的组成结构图,dex文件主要包括dex文件头、字符串标识符列表、类型标识项、函数原型标识表、区域标识符列表、函数标识表、类标识表、数据区(即上面各个表列出的数据保存在数据区)、静态链接数据段(可为空),寻找方法具体是:\n[0064] 从odex文件中找到dex文件,dex文件的起始magic字段用于表示dex版本,目前它的值固定为“6465780a 30333500”,转换为字符串“dex.035”,因此可以通过正向搜索内存页,直到找到dex文件的magic字段,此处即为dex文件的起始地址;找到dex文件之后,可以根据图2中的dex文件结构,解析dex文件头(dex header)。dex文件头记录了dex文件其他部分在dex文件中的偏移,从而可以定位到dex其他部分所在的区域,以供进一步解析。\n[0065] Dex文件头部(Dex文件头)主要包括校验和以及其他结构的偏移地址和长度信息,具体见表1:\n[0066] 表1 Dex文件头记录的信息和相应含义\n[0067]\n[0068]\n[0069] 对于得到的dex文件,计算dex文件的Hash值,然后对Hash进行加密((MD5加密)),和so文件中保存的值进行比较,如果一致,则说明程序未被修改,否则返回错误码,程序停止运行。\n[0070] 当执行关键代码时,从so文件中取得密钥key2,对关键代码进行解密,得到中间代码。对于得到的中间代码,从so文件中取得密钥key1,进行第二次解密得到最终的关键代码;两次解密过程分别对应两次加密过程,以确保应用程序的安全。\n[0071] 最后,实现正确安全地调用关键代码的方法。\n[0072] 需要注意的是,公布实施例的目的在于帮助进一步理解本发明,但是本领域的技术人员可以理解:在不脱离本发明及所附权利要求的精神和范围内,各种替换和修改都是可能的。因此,本发明不应局限于实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。
法律信息
- 2021-01-01
未缴年费专利权终止
IPC(主分类): G06F 21/14
专利号: ZL 201610034627.8
申请日: 2016.01.19
授权公告日: 2018.08.21
- 2018-08-21
- 2016-04-20
实质审查的生效
IPC(主分类): G06F 21/14
专利申请号: 201610034627.8
申请日: 2016.01.19
- 2016-03-23
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2015-01-28
|
2014-11-09
| | |
2
| |
2013-05-22
|
2011-11-17
| | |
3
| |
2015-03-25
|
2014-11-09
| | |
4
| |
2015-08-26
|
2015-06-04
| | |
5
| | 暂无 |
2015-01-08
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |