一种防逆向APK文件的动态加载方法.pdf

上传人:54 文档编号:4561018 上传时间:2018-10-20 格式:PDF 页数:9 大小:1.31MB
返回 下载 相关 举报
摘要
申请专利号:

CN201410663307.X

申请日:

2014.11.18

公开号:

CN104318155A

公开日:

2015.01.28

当前法律状态:

撤回

有效性:

无权

法律详情:

发明专利申请公布后的视为撤回IPC(主分类):G06F 21/51申请公布日:20150128|||实质审查的生效IPC(主分类):G06F 21/51申请日:20141118|||公开

IPC分类号:

G06F21/51(2013.01)I

主分类号:

G06F21/51

申请人:

刘鹏

发明人:

刘鹏

地址:

528133 广东省佛山市三水区西南街道汇丰豪园30座203

优先权:

专利代理机构:

佛山市广盈专利商标事务所(普通合伙) 44339

代理人:

杨乐兵;傅俊朝

PDF下载: PDF下载
内容摘要

本发明公开一种防逆向APK文件的动态加载方法,其包括步骤:加载第一Classes.dex文件,调用Entry.so文件,利用Entry.so文件对Encrypt’.so文件进行解密处理,得到解密后的Encrypt.so文件;利用Entry.so文件对第二Classes.dex文件进行解密,得到加固处理前的APK文件中的原Classes.dex文件;对原Classes.dex文件进行动态加载,并找到存放APK文件功能的源代码的物理地址,将源代码动态加载至内存;从物理内存上删除解密后的原Classes.dex文件。本发明可以规避现有Android逆向工具的反编译,增加反编译的难度,从而可以极大程度地提高APK文件的安全性。

权利要求书

权利要求书
1.  一种防逆向APK文件的动态加载方法,其特征在于,包括步骤:
加载第一Classes.dex文件,调用Entry.so文件,利用Entry.so文件对Encrypt’.so文件进行解密处理,得到解密后的Encrypt.so文件;
利用Entry.so文件对第二Classes.dex文件进行解密,得到加固处理前的APK文件中的原Classes.dex文件;
对原Classes.dex文件进行动态加载,并找到存放APK文件功能的源代码的物理地址,将源代码动态加载至内存;
从物理内存上删除解密后的原Classes.dex文件;
其中,第一Classes.dex文件中仅包含原Classes.dex文件的的文件头部结构,第二Classes.dex文件及Encrypt’.so文件存放在文件目录res之下,Entry.so文件存放在文件目录libs之下,由第一Classes.dex文件、AndroidManifest’.xml文件、文件目录res、文件目录libs及resources.ars文件封装后形成所述防逆向APK文件。

2.  根据权利要求1所述一种防逆向APK文件的动态加载方法,其特征在于,对第二Classes.dex文件进行解密之前还包括对原Classes.dex文件进行完整性检查的步骤。

3.  根据权利要求2所述一种防逆向APK文件的动态加载方法,其特征在于,利用第一Classes.dex文件的文件头结构所包含字段信息,对解密获得的原Classes.dex文件进行完整性检查。

4.  根据权利要求1所述一种防逆向APK文件的动态加载方法,其特征在于,对原Classes.dex文件进行动态加载的具体包括:新建一个带有源程序Classes.dex的DexClassLoader对象,通过反射的方式替换到系统默认的加载类中的属性mClassLoader。

5.  根据权利要求1所述一种防逆向APK文件的动态加载方法,其特征 在于,根据原Classes.dex文件中文件头部结构中data_size字段及data_off字段信息,并找到存放APK文件功能的源代码的物理地址。

6.  根据权利要求1所述一种防逆向APK文件的动态加载方法,其特征在于,将源代码动态加载至内存的步骤具体包括:
利用自定义的onCreate方法,通过AndroidManifest中application中的meta-data属性,找到源代码的物理地址,从而替换成源程序的Application;
将内存中现有的“第一Application文件”从调用集合中移除,并新建一个Application对象app,将原Classes.dex文件的属性绑定至app,再把app加入到内存的调用集合中;
由于组件Provider在onCreate方法前就被系统注册,因此把app绑定到源程序中Provider的context上,然后启动系统级onCreate方法。

说明书

说明书一种防逆向APK文件的动态加载方法
技术领域
本发明涉及移动终端应用安全领域,特别涉及一种防逆向APK文件的动态加载方法。
背景技术
APK(Android PacKage的缩写)即Android安装包。将APK文件(即APK应用程序)直接传到Android模拟器或Android操作系统的终端设备(比如安卓智能手机)中执行即可安装。APK文件其实是zip格式,但后缀名被修改为apk,在windows系统上可以通过解压缩工具(比如winrar软件)直接解压查看。解压APK文件后,一般的可看到的目录结构如下表1所示:

表1
Android应用程序开发的最后阶段是打包签名,生成APK文件供用户下载安装,打包封装成APK文件如图1所示。由此可以看出,如果能够对Dex文件和AndroidManifest.XML进行逆向,即可还原出应用APK文件的源代码,若在源代码的基础上加入恶意代码,重新签名打包,即可生成携带恶意代码的APK文件。
随着Android移动终端平台的日益发展,第三方应用程序大量涌现,对第三方应用的盗版和重打包现象日益严重。由于Android平台软件使用的编程语言是Java,而Java源代码编译后的二进制代码极易被反编译,导致其破解难度远小于其他使用编译性语言编写的程序。鉴于Android下APK文件能够很容易的由dex2jar和JD-GUI、JAD等反编译工具反编译为易于阅读的JAVA代码,从而代码中的明文字符串、库函数调用、核心功能函数等都一目了然,使得非法开发者对第三方应用程序的盗版或者核心功能的逆向工程变得更加容易。
发明内容
为了降低APK文件被逆向的风险,本发明提供了一种一种防逆向APK文件的动态加载方法,解决了APK文件(即APK应用程序)易于被反编译显示并容易泄密的问题,能够使第三方应用程序加固,最大化保护APK应用程序的安全。
本发明采用如下技术方案实现:一种防逆向APK文件的动态加载方法,其包括步骤:加载第一Classes.dex文件,调用Entry.so文件,利用Entry.so文件对Encrypt’.so文件进行解密处理,得到解密后的Encrypt.so文件;
利用Entry.so文件对第二Classes.dex文件进行解密,得到加固处理前的APK文件中的原Classes.dex文件;
对原Classes.dex文件进行动态加载,并找到存放APK文件功能的源代码的物理地址,将源代码动态加载至内存;
从物理内存上删除解密后的原Classes.dex文件;
其中,第一Classes.dex文件中仅包含原Classes.dex文件的的文件头部结构,第二Classes.dex文件及Encrypt’.so文件存放在文件目录res之下,Entry.so文件存放在文件目录libs之下,由第一Classes.dex文件、AndroidManifest’.xml 文件、文件目录res、文件目录libs及resources.ars文件封装后形成所述防逆向APK文件。
其中,对第二Classes.dex文件进行解密之前还包括对原Classes.dex文件进行完整性检查的步骤。
其中,利用第一Classes.dex文件的文件头结构所包含字段信息,对解密获得的原Classes.dex文件进行完整性检查。
其中,对原Classes.dex文件进行动态加载的具体包括:新建一个带有源程序Classes.dex的DexClassLoader对象,通过反射的方式替换到系统默认的加载类中的属性mClassLoader。
其中,根据原Classes.dex文件中文件头部结构中data_size字段及data_off字段信息,并找到存放APK文件功能的源代码的物理地址。
其中,将源代码动态加载至内存的步骤具体包括:
利用自定义的onCreate方法,通过AndroidManifest中application中的meta-data属性,找到源代码的物理地址,从而替换成源程序的Application;
将内存中现有的“第一Application文件”从调用集合中移除,并新建一个Application对象app,将原Classes.dex文件的属性绑定至app,再把app加入到内存的调用集合中;
由于组件Provider在onCreate方法前就被系统注册,因此把app绑定到源程序中Provider的context上,然后启动系统级onCreate方法。
现有技术相比,本发明具有如下有益效果:
利用上述加固方法进行加固的APK文件,分别使用目前最流行的Android逆向工具dex2jar与apktool进行逆向编译,由于逆向编译出来的第一Classes.dex文件中并没有源代码,而实现一个APK文件主要功能的源代码仍存放在原Classes.dex文件,但该原Classes.dex文件被加密成第二Classes.dex文件后得以存放在指定的文件目录下,利用逆向工具dex2jar与apktool很难 找到解密后的第二Classes.dex文件,即使找到第二Classes.dex文件,由于无法找到解密第二Classes.dex文件的Encrypt’.so文件而无法进行解密,从而可以有效防止APK文件被逆向修改后泄密。由此可见,利用本申请提到的加固方法加固处理后,实现了APK文件的源代码的加密隐藏,可以规避现有Android逆向工具的反编译,从而可以极大程度地提高APK文件的安全性。
附图说明
图1是APK文件的打包封装流程示意图。
图2是本发明APK文件防逆向的加固方法的流程示意图。
图3是APK文件加固前后的文件目录结构的对比示意图。
图4是加固后APK文件实现动态加载的流程示意图。
具体实施方式
为了便于理解本申请的技术方案,申请人先对APK文件目录结构中classes.dex文件先做进一步的详细介绍:
classes.dex文件是java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。classes.dex文件由文件头、索引区和数据区三大部分组成。其中,classes.dex文件头部分结构定义如下表2所示。
字段名称说明checksum校验码signatureSHA-1签名file_sizeDex文件的总长度data_size数据段的大小,必须以4字节对齐data_off数据段基地址
表2
在Android源码中,Dalvik虚拟机的实现位于dalvik/目录下,其中 dalvik/vm是虚拟机的实现部分,将会编译成libdvm.so;而dalvik/libdex将会编译成libdex.a静态库作为dex工具;dalvik/dexdump是.dex文件的反编译工具;虚拟机的可执行程序位于dalvik/dalvikvm中,将会编译成dalvikvm可执行文件。
在Android平台运行APK文件时,先由Dalvik虚拟机(在Android源码中,Dalvik虚拟机的实现位于dalvik/目录下)加载解压APK文件并校验完整性,提取Classes.dex文件,然后执行classes.dex文件中的字节码。在执行classes.dex文件时,Dalvik虚拟机首先会检查其文件头部分的checksum字段和siganature字段,确保classes.dex文件没有被损坏或篡改,然后才根据文件头里定义的其他结构的偏移地址和长度信息进行寻址解析与执行。最后dalvik虚拟机会从classes.dex文件中读取指令和数据,进而运行该APK文件的程序逻辑。
结合图2所示,本发明的一个优选实施例包括如下实现步骤:
步骤S11、将待加固的APK文件中原Classes.dex文件复制一份,在复制所得的Classes.dex文件中删除APK文件的功能源代码后,保存得到第一Classes.dex文件。因此,第一Classes.dex文件中只保留了原Classes.dex文件的文件头部结构,并未包含APK文件的功能代码。
步骤S12、将原Classes.dex文件用预设的加密解密算法进行加密处理,得到第二Classes.dex文件。因此,APK文件主要的功能代码仍在第二Classes.dex文件之中,隐藏、保护第二Classes.dex文件是加固APK文件的关系,也是防止APK文件被逆向的重要环节。
步骤S13、生成用于解密第二Classes.dex文件的Encrypt.so文件,对该Encrypt.so文件进行二次加密,得到Encrypt’.so文件。
步骤S14、生成Entry.so文件,该Entry.so文件是在APK文件运行时的入口文件,通过调用入口文件Entry.so中的native方法将Encrypt’.so文件解密为 Encrypt.so文件。
步骤S15、将待加固的APK文件中原AndroidManifest.xml文件的源程序入口指向,由指向原Classes.dex文件更改为指向第一Classes.dex文件,修改处理后的文件记为AndroidManifest’.xml文件。
步骤S16、将第二Classes.dex文件及Encrypt’.so文件存放在文件目录res之下,将Entry.so文件存放在文件目录libs之下,以第一Classes.dex文件、AndroidManifest’.xml文件、文件目录res、文件目录libs及resources.ars文件进行打包封装后封装文件,再使用Android SDK中提供的签名工具对封装文件进行签名,即完成了APK文件的加固处理。具体来说,加固前后的APK文件的文件目录结构对比示意图如图3所示。
加固后的APK文件运行时,结合图4所示,加载运行过程包括如下步骤:
步骤S21、根据AndroidManifest’.xml文件中的源程序入口指向,加固后的APK文件运行时,先由Dalvik虚拟机加载第一Classes.dex文件。
步骤S22、由第一Classes.dex文件调用Entry.so文件,利用Entry.so文件对存放在文件目录res之下的Encrypt’.so文件进行解密处理,得到解密后的Encrypt.so文件。
步骤S23、利用Entry.so文件按照预设的加密解密算法对存放在文件目录res之下的第二Classes.dex文件进行解密,从而得到加固处理前APK文件中的原Classes.dex文件。
步骤S24、利用第一Classes.dex文件的文件头结构所包含字段信息,对解密获得的原Classes.dex文件进行完整性检查,通过完整性检查后进入步骤S26。
步骤S25、由Dalvik虚拟机根据Android类动态加载技术(DexClassLoader程序)对原Classes.dex文件进行动态加载。具体过程是,新建一个带有源程序Classes.dex的DexClassLoader对象,通过反射的方式替换到系统默认的加 载类中的属性mClassLoader。
步骤S26、根据原Classes.dex文件中文件头部结构中data_size字段及data_off字段信息,找到存放APK文件功能的源代码的物理地址,将源代码动态加载至内存。具体来说,利用自定义的onCreate方法,通过AndroidManifest中application中的meta-data属性,找到源代码的物理地址,从而替换成源程序的Application;将现有的“第一Application文件”从系统调用集合中移除,并新建一个Application对象app,将原Classes.dex文件的属性绑定至app,再把app加入到系统调用集合中;最后,由于组件Provider在onCreate方法前就被系统注册,因此把app绑定到源程序中Provider的context上,然后启动系统级onCreate方法。
步骤S27、从系统的物理内存上删除解密后的原Classes.dex文件,防止被攻击者窃取。
利用上述加固方法进行加固的APK文件,分别使用目前最流行的Android逆向工具dex2jar与apktool进行逆向编译,由于逆向编译出来的第一Classes.dex文件中并没有源代码,而实现一个APK文件主要功能的源代码仍存放在原Classes.dex文件,但该原Classes.dex文件被加密成第二Classes.dex文件后得以存放在指定的文件目录下,利用逆向工具dex2jar与apktool很难找到解密后的第二Classes.dex文件,即使找到第二Classes.dex文件,由于无法找到解密第二Classes.dex文件的Encrypt’.so文件而无法进行解密,从而可以有效防止APK文件被逆向修改后泄密。由此可见,利用本申请提到的加固方法加固处理后,实现了APK文件的源代码的加密隐藏,可以规避现有Android逆向工具的反编译,从而可以极大程度地提高APK文件的安全性。
本发明可用于众多通用或专用的计算系统环境或配置中。例如:个人计算机、服务器、手持设备或便携式设备、平板型设备、多处理器系统、基于微处理器的系统、安卓系统的数字电视接收装置、可编程的消费电子设备、 网络PC、小型计算机、大型计算机、包括以上任何系统或设备的分布式计算环境等等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

一种防逆向APK文件的动态加载方法.pdf_第1页
第1页 / 共9页
一种防逆向APK文件的动态加载方法.pdf_第2页
第2页 / 共9页
一种防逆向APK文件的动态加载方法.pdf_第3页
第3页 / 共9页
点击查看更多>>
资源描述

《一种防逆向APK文件的动态加载方法.pdf》由会员分享,可在线阅读,更多相关《一种防逆向APK文件的动态加载方法.pdf(9页珍藏版)》请在专利查询网上搜索。

1、(10)申请公布号 CN 104318155 A (43)申请公布日 2015.01.28 CN 104318155 A (21)申请号 201410663307.X (22)申请日 2014.11.18 G06F 21/51(2013.01) (71)申请人 刘鹏 地址 528133 广东省佛山市三水区西南街道 汇丰豪园 30 座 203 (72)发明人 刘鹏 (74)专利代理机构 佛山市广盈专利商标事务所 ( 普通合伙 ) 44339 代理人 杨乐兵 傅俊朝 (54) 发明名称 一种防逆向 APK 文件的动态加载方法 (57) 摘要 本发明公开一种防逆向 APK 文件的动态加 载方法, 其。

2、包括步骤 : 加载第一 Classes.dex 文 件,调 用 Entry.so 文 件, 利 用 Entry.so 文 件 对 Encrypt .so 文件进行解密处理, 得到解密 后 的 Encrypt.so 文 件 ; 利 用 Entry.so 文 件 对 第二 Classes.dex 文件进行解密, 得到加固处 理前的 APK 文件中的原 Classes.dex 文件 ; 对 原 Classes.dex 文件进行动态加载, 并找到存 放 APK 文件功能的源代码的物理地址, 将源代码 动态加载至内存 ; 从物理内存上删除解密后的原 Classes.dex文件。 本发明可以规避现有And。

3、roid 逆向工具的反编译, 增加反编译的难度, 从而可以 极大程度地提高 APK 文件的安全性。 (51)Int.Cl. 权利要求书 1 页 说明书 5 页 附图 2 页 (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书1页 说明书5页 附图2页 (10)申请公布号 CN 104318155 A CN 104318155 A 1/1 页 2 1. 一种防逆向 APK 文件的动态加载方法, 其特征在于, 包括步骤 : 加载第一 Classes.dex 文件, 调用 Entry.so 文件, 利用 Entry.so 文件对 Encrypt .so 文件进行解密处理, 得到解。

4、密后的 Encrypt.so 文件 ; 利用 Entry.so 文件对第二 Classes.dex 文件进行解密, 得到加固处理前的 APK 文件中 的原 Classes.dex 文件 ; 对原Classes.dex文件进行动态加载, 并找到存放APK文件功能的源代码的物理地址, 将源代码动态加载至内存 ; 从物理内存上删除解密后的原 Classes.dex 文件 ; 其中, 第一 Classes.dex 文件中仅包含原 Classes.dex 文件的的文件头部结构, 第二 Classes.dex 文件及 Encrypt .so 文件存放在文件目录 res 之下, Entry.so 文件存放在。

5、文 件目录 libs 之下, 由第一 Classes.dex 文件、 AndroidManifest .xml 文件、 文件目录 res、 文件目录 libs 及 resources.ars 文件封装后形成所述防逆向 APK 文件。 2. 根据权利要求 1 所述一种防逆向 APK 文件的动态加载方法, 其特征在于, 对第二 Classes.dex 文件进行解密之前还包括对原 Classes.dex 文件进行完整性检查的步骤。 3. 根据权利要求 2 所述一种防逆向 APK 文件的动态加载方法, 其特征在于, 利用第一 Classes.dex 文件的文件头结构所包含字段信息, 对解密获得的原 C。

6、lasses.dex 文件进行 完整性检查。 4. 根据权利要求 1 所述一种防逆向 APK 文件的动态加载方法, 其特征在于, 对 原 Classes.dex 文件进行动态加载的具体包括 : 新建一个带有源程序 Classes.dex 的 DexClassLoader 对象, 通过反射的方式替换到系统默认的加载类中的属性 mClassLoader。 5. 根据权利要求 1 所述一种防逆向 APK 文件的动态加载方法, 其特征在于, 根据原 Classes.dex 文件中文件头部结构中 data_size 字段及 data_off 字段信息, 并找到存放 APK 文件功能的源代码的物理地址。 。

7、6.根据权利要求1所述一种防逆向APK文件的动态加载方法, 其特征在于, 将源代码动 态加载至内存的步骤具体包括 : 利用自定义的 onCreate 方法, 通过 AndroidManifest 中 application 中的 meta-data 属性, 找到源代码的物理地址, 从而替换成源程序的 Application ; 将 内 存 中 现 有 的 “第 一 Application 文 件”从 调 用 集 合 中 移 除, 并 新 建 一 个 Application对象app, 将原Classes.dex文件的属性绑定至app, 再把app加入到内存的调 用集合中 ; 由于组件 Prov。

8、ider 在 onCreate 方法前就被系统注册, 因此把 app 绑定到源程序中 Provider 的 context 上, 然后启动系统级 onCreate 方法。 权 利 要 求 书 CN 104318155 A 2 1/5 页 3 一种防逆向 APK 文件的动态加载方法 技术领域 0001 本发明涉及移动终端应用安全领域, 特别涉及一种防逆向 APK 文件的动态加载方 法。 背景技术 0002 APK(Android PacKage 的缩写 ) 即 Android 安装包。将 APK 文件 ( 即 APK 应用程 序 ) 直接传到 Android 模拟器或 Android 操作系统的。

9、终端设备 ( 比如安卓智能手机 ) 中执 行即可安装。APK 文件其实是 zip 格式, 但后缀名被修改为 apk, 在 windows 系统上可以通 过解压缩工具 ( 比如 winrar 软件 ) 直接解压查看。解压 APK 文件后, 一般的可看到的目录 结构如下表 1 所示 : 0003 0004 表 1 0005 Android 应用程序开发的最后阶段是打包签名, 生成 APK 文件供用户下载安装, 打 包封装成 APK 文件如图 1 所示。由此可以看出, 如果能够对 Dex 文件和 AndroidManifest. XML 进行逆向, 即可还原出应用 APK 文件的源代码, 若在源代码。

10、的基础上加入恶意代码, 重 新签名打包, 即可生成携带恶意代码的 APK 文件。 0006 随着 Android 移动终端平台的日益发展, 第三方应用程序大量涌现, 对第三方应 用的盗版和重打包现象日益严重。由于 Android 平台软件使用的编程语言是 Java, 而 Java 源代码编译后的二进制代码极易被反编译, 导致其破解难度远小于其他使用编译性语言编 写的程序。鉴于 Android 下 APK 文件能够很容易的由 dex2jar 和 JD-GUI、 JAD 等反编译工 具反编译为易于阅读的 JAVA 代码, 从而代码中的明文字符串、 库函数调用、 核心功能函数 等都一目了然, 使得非。

11、法开发者对第三方应用程序的盗版或者核心功能的逆向工程变得更 加容易。 发明内容 说 明 书 CN 104318155 A 3 2/5 页 4 0007 为了降低 APK 文件被逆向的风险, 本发明提供了一种一种防逆向 APK 文件的动态 加载方法, 解决了 APK 文件 ( 即 APK 应用程序 ) 易于被反编译显示并容易泄密的问题, 能够 使第三方应用程序加固, 最大化保护 APK 应用程序的安全。 0008 本发明采用如下技术方案实现 : 一种防逆向 APK 文件的动态加载方法, 其包括步 骤 : 加载第一 Classes.dex 文件, 调用 Entry.so 文件, 利用 Entry.。

12、so 文件对 Encrypt .so 文件进行解密处理, 得到解密后的 Encrypt.so 文件 ; 0009 利用 Entry.so 文件对第二 Classes.dex 文件进行解密, 得到加固处理前的 APK 文 件中的原 Classes.dex 文件 ; 0010 对原 Classes.dex 文件进行动态加载, 并找到存放 APK 文件功能的源代码的物理 地址, 将源代码动态加载至内存 ; 0011 从物理内存上删除解密后的原 Classes.dex 文件 ; 0012 其中, 第一Classes.dex文件中仅包含原Classes.dex文件的的文件头部结构, 第 二 Classe。

13、s.dex 文件及 Encrypt .so 文件存放在文件目录 res 之下, Entry.so 文件存放 在文件目录 libs 之下, 由第一 Classes.dex 文件、 AndroidManifest .xml 文件、 文件目录 res、 文件目录 libs 及 resources.ars 文件封装后形成所述防逆向 APK 文件。 0013 其中, 对第二 Classes.dex 文件进行解密之前还包括对原 Classes.dex 文件进行 完整性检查的步骤。 0014 其中, 利用第一 Classes.dex 文件的文件头结构所包含字段信息, 对解密获得的 原 Classes.dex。

14、 文件进行完整性检查。 0015 其中, 对原 Classes.dex 文件进行动态加载的具体包括 : 新建一个带有源程序 Classes.dex 的 DexClassLoader 对象, 通过反射的方式替换到系统默认的加载类中的属性 mClassLoader。 0016 其中, 根据原 Classes.dex 文件中文件头部结构中 data_size 字段及 data_off 字 段信息, 并找到存放 APK 文件功能的源代码的物理地址。 0017 其中, 将源代码动态加载至内存的步骤具体包括 : 0018 利 用 自 定 义 的 onCreate 方 法, 通 过 AndroidManif。

15、est 中 application 中 的 meta-data 属性, 找到源代码的物理地址, 从而替换成源程序的 Application ; 0019 将内存中现有的 “第一 Application 文件”从调用集合中移除, 并新建一个 Application对象app, 将原Classes.dex文件的属性绑定至app, 再把app加入到内存的调 用集合中 ; 0020 由于组件 Provider 在 onCreate 方法前就被系统注册, 因此把 app 绑定到源程序 中 Provider 的 context 上, 然后启动系统级 onCreate 方法。 0021 现有技术相比, 本发。

16、明具有如下有益效果 : 0022 利用上述加固方法进行加固的 APK 文件, 分别使用目前最流行的 Android 逆向工 具 dex2jar 与 apktool 进行逆向编译, 由于逆向编译出来的第一 Classes.dex 文件中并 没有源代码, 而实现一个 APK 文件主要功能的源代码仍存放在原 Classes.dex 文件, 但该 原 Classes.dex 文件被加密成第二 Classes.dex 文件后得以存放在指定的文件目录下, 利 用逆向工具 dex2jar 与 apktool 很难找到解密后的第二 Classes.dex 文件, 即使找到第二 Classes.dex 文件, 。

17、由于无法找到解密第二 Classes.dex 文件的 Encrypt .so 文件而无法 说 明 书 CN 104318155 A 4 3/5 页 5 进行解密, 从而可以有效防止 APK 文件被逆向修改后泄密。由此可见, 利用本申请提到的加 固方法加固处理后, 实现了APK文件的源代码的加密隐藏, 可以规避现有Android逆向工具 的反编译, 从而可以极大程度地提高 APK 文件的安全性。 附图说明 0023 图 1 是 APK 文件的打包封装流程示意图。 0024 图 2 是本发明 APK 文件防逆向的加固方法的流程示意图。 0025 图 3 是 APK 文件加固前后的文件目录结构的对比。

18、示意图。 0026 图 4 是加固后 APK 文件实现动态加载的流程示意图。 具体实施方式 0027 为了便于理解本申请的技术方案, 申请人先对 APK 文件目录结构中 classes.dex 文件先做进一步的详细介绍 : 0028 classes.dex 文件是 java 源码编译后生成的 java 字节码文件。但由于 Android 使用的 dalvik 虚拟机与标准的 java 虚拟机是不兼容的, dex 文件与 class 文件相比, 不论 是文件结构还是 opcode 都不一样。classes.dex 文件由文件头、 索引区和数据区三大部分 组成。其中, classes.dex 文件。

19、头部分结构定义如下表 2 所示。 0029 字段名称说明 checksum校验码 signatureSHA-1 签名 fi le_sizeDex 文件的总长度 data_size数据段的大小, 必须以 4 字节对齐 data_off数据段基地址 0030 表 2 0031 在 Android 源码中, Dalvik 虚拟机的实现位于 dalvik/ 目录下, 其中 dalvik/vm 是虚拟机的实现部分, 将会编译成 libdvm.so ; 而 dalvik/libdex 将会编译成 libdex.a 静 态库作为dex工具 ; dalvik/dexdump是.dex文件的反编译工具 ; 虚拟。

20、机的可执行程序位于 dalvik/dalvikvm 中, 将会编译成 dalvikvm 可执行文件。 0032 在Android平台运行APK文件时, 先由Dalvik虚拟机(在Android源码中, Dalvik 虚拟机的实现位于 dalvik/ 目录下 ) 加载解压 APK 文件并校验完整性, 提取 Classes.dex 文件, 然后执行classes.dex文件中的字节码。 在执行classes.dex文件时, Dalvik虚拟机 首先会检查其文件头部分的 checksum 字段和 siganature 字段, 确保 classes.dex 文件没 有被损坏或篡改, 然后才根据文件头里。

21、定义的其他结构的偏移地址和长度信息进行寻址解 析与执行。最后 dalvik 虚拟机会从 classes.dex 文件中读取指令和数据, 进而运行该 APK 说 明 书 CN 104318155 A 5 4/5 页 6 文件的程序逻辑。 0033 结合图 2 所示, 本发明的一个优选实施例包括如下实现步骤 : 0034 步骤 S11、 将待加固的 APK 文件中原 Classes.dex 文件复制一份, 在复制所得的 Classes.dex 文件中删除 APK 文件的功能源代码后, 保存得到第一 Classes.dex 文件。因 此, 第一 Classes.dex 文件中只保留了原 Classe。

22、s.dex 文件的文件头部结构, 并未包含 APK 文件的功能代码。 0035 步骤 S12、 将原 Classes.dex 文件用预设的加密解密算法进行加密处理, 得到第二 Classes.dex 文件。因此, APK 文件主要的功能代码仍在第二 Classes.dex 文件之中, 隐藏、 保护第二 Classes.dex 文件是加固 APK 文件的关系, 也是防止 APK 文件被逆向的重要环节。 0036 步 骤 S13、 生 成 用 于 解 密 第 二 Classes.dex 文 件 的 Encrypt.so 文 件, 对 该 Encrypt.so 文件进行二次加密, 得到 Encryp。

23、t .so 文件。 0037 步骤S14、 生成Entry.so文件, 该Entry.so文件是在APK文件运行时的入口文件, 通过调用入口文件 Entry.so 中的 native 方法将 Encrypt .so 文件解密为 Encrypt.so 文 件。 0038 步骤 S15、 将待加固的 APK 文件中原 AndroidManifest.xml 文件的源程序入口指 向, 由指向原Classes.dex文件更改为指向第一Classes.dex文件, 修改处理后的文件记为 AndroidManifest .xml 文件。 0039 步 骤 S16、 将 第 二 Classes.dex 文 。

24、件 及 Encrypt .so 文 件 存 放 在 文 件 目 录 res 之 下, 将 Entry.so 文 件 存 放 在 文 件 目 录 libs 之 下, 以 第 一 Classes.dex 文 件、 AndroidManifest .xml 文件、 文件目录 res、 文件目录 libs 及 resources.ars 文件进行打 包封装后封装文件, 再使用Android SDK中提供的签名工具对封装文件进行签名, 即完成了 APK文件的加固处理。 具体来说, 加固前后的APK文件的文件目录结构对比示意图如图3所 示。 0040 加固后的 APK 文件运行时, 结合图 4 所示, 加。

25、载运行过程包括如下步骤 : 0041 步骤 S21、 根据 AndroidManifest .xml 文件中的源程序入口指向, 加固后的 APK 文件运行时, 先由 Dalvik 虚拟机加载第一 Classes.dex 文件。 0042 步骤 S22、 由第一 Classes.dex 文件调用 Entry.so 文件, 利用 Entry.so 文件对存 放在文件目录 res 之下的 Encrypt .so 文件进行解密处理, 得到解密后的 Encrypt.so 文 件。 0043 步骤 S23、 利用 Entry.so 文件按照预设的加密解密算法对存放在文件目录 res 之 下的第二 Clas。

26、ses.dex 文件进行解密, 从而得到加固处理前 APK 文件中的原 Classes.dex 文件。 0044 步骤 S24、 利用第一 Classes.dex 文件的文件头结构所包含字段信息, 对解密获得 的原 Classes.dex 文件进行完整性检查, 通过完整性检查后进入步骤 S26。 0045 步骤S25、 由Dalvik虚拟机根据Android类动态加载技术(DexClassLoader程序) 对原 Classes.dex 文件进行动态加载。具体过程是, 新建一个带有源程序 Classes.dex 的 DexClassLoader 对象, 通过反射的方式替换到系统默认的加载类中的。

27、属性 mClassLoader。 0046 步骤 S26、 根据原 Classes.dex 文件中文件头部结构中 data_size 字段及 data_ off 字段信息, 找到存放 APK 文件功能的源代码的物理地址, 将源代码动态加载至内存。 说 明 书 CN 104318155 A 6 5/5 页 7 具体来说, 利用自定义的 onCreate 方法, 通过 AndroidManifest 中 application 中的 meta-data 属性, 找到源代码的物理地址, 从而替换成源程序的 Application ; 将现有的 “第一 Application 文件” 从系统调用集合中。

28、移除, 并新建一个 Application 对象 app, 将 原 Classes.dex 文件的属性绑定至 app, 再把 app 加入到系统调用集合中 ; 最后, 由于组 件 Provider 在 onCreate 方法前就被系统注册, 因此把 app 绑定到源程序中 Provider 的 context 上, 然后启动系统级 onCreate 方法。 0047 步骤 S27、 从系统的物理内存上删除解密后的原 Classes.dex 文件, 防止被攻击者 窃取。 0048 利用上述加固方法进行加固的 APK 文件, 分别使用目前最流行的 Android 逆向工 具 dex2jar 与 a。

29、pktool 进行逆向编译, 由于逆向编译出来的第一 Classes.dex 文件中并 没有源代码, 而实现一个 APK 文件主要功能的源代码仍存放在原 Classes.dex 文件, 但该 原 Classes.dex 文件被加密成第二 Classes.dex 文件后得以存放在指定的文件目录下, 利 用逆向工具 dex2jar 与 apktool 很难找到解密后的第二 Classes.dex 文件, 即使找到第二 Classes.dex 文件, 由于无法找到解密第二 Classes.dex 文件的 Encrypt .so 文件而无法 进行解密, 从而可以有效防止 APK 文件被逆向修改后泄密。。

30、由此可见, 利用本申请提到的加 固方法加固处理后, 实现了APK文件的源代码的加密隐藏, 可以规避现有Android逆向工具 的反编译, 从而可以极大程度地提高 APK 文件的安全性。 0049 本发明可用于众多通用或专用的计算系统环境或配置中。 例如 : 个人计算机、 服务 器、 手持设备或便携式设备、 平板型设备、 多处理器系统、 基于微处理器的系统、 安卓系统的 数字电视接收装置、 可编程的消费电子设备、 网络 PC、 小型计算机、 大型计算机、 包括以上任 何系统或设备的分布式计算环境等等。 0050 以上所述仅为本发明的较佳实施例而已, 并不用以限制本发明, 凡在本发明的精 神和原则之内所作的任何修改、 等同替换和改进等, 均应包含在本发明的保护范围之内。 说 明 书 CN 104318155 A 7 1/2 页 8 图 1 图 2 说 明 书 附 图 CN 104318155 A 8 2/2 页 9 图 3 图 4 说 明 书 附 图 CN 104318155 A 9 。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 >


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1