《一种防逆向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 。