0%

Java筑基-:(08)FileIO项目实战—dex文件改造

一、背景

自己编译的模拟器,它可以在源码上打log,做到可控。并且,所有的行为都会经过模拟器,比如后面你的url请求

二、常用的思路

加固思路有以下几种:

  • 反模拟器,一旦发现模拟器,就停止核心代码运行

  • 代码虚拟化,自己写的代码先运行在自己写的虚拟机上,后续再运行到系统的虚拟机上
    加密,核心代码是以压缩或者加密形式存在的,被分割成一段一段的,需要的时候,再把目标段加载到内存。

  • 加壳方案,分为壳dex和源dex,壳不加密,源加密

关于第 3 种加固方案的总体示意图如下:

加固方案概览

最后为什么有个签名,因为加固过程会修改 APK,必然破坏了 APK ,因此需要重新签名。以上方案值得我们的思考的有几点:

  • 壳dex 与 源 dex 可以随意拼凑吗?

  • 壳 dex 怎么生成?

  • 如何签名?

  • 如果运行新的 apk(如何脱壳)?

四、Apk打包过程

简单说一下 APK 的打包过程,整体流程如下图所示:

Android打包流程

几个重要的过程:

  1. 首先 aapt 工具将资源文件生成 R.java 文件

  2. aidl 工具将 aidl 文件生成 Java 文件

  3. 将上述的 java 文件、项目自己的 java 文件,通过 Java compiler 一起生成 .class 文件

  4. .class 文件通过 dx 工具生成 dex 文件

  5. 将 dex 文件和那些资源文件一起压缩生成 apk

  6. 签名

加壳

生成原始 apk ,然后解压到目录 unzip 中文件夹中,当然,要把之前的签名文件给剔除;之后,找到所 unzip 中所有的 dex 文件,进行加密。

接下来,将项目中的一个 lib 生成的 aar 转成 dex 文件, dx 工具可以将 jar 转成 dex,当然,这个 lib 有自己的 Application ,在正式使用的时候,上述 原始 apk 中的 Application 在最开始的时候要通过反射的方式调用这个 lib 的 Application ,让其形式上作为 App 的默认 Application ,以便后续的解密。

将加密的 dex 和 aar 转成的 dex 一起放入 unzip 中,这样 ,unzip 文件夹中有了 加密的 dex 和 lib 的dex ,以及原始 apk 中所有的 资源,这时候通过 zip 压缩,就能将 unzip 中所有的内容压缩起来,改名 apk (这个打包apk 的过程需要确认)

最后,对这个 apk 进行签名,就形成了正式的apk 。

脱壳

上述打包的 APK 最终需要安装使用,安装成功后,

我们的安装包都会安装在

/data/data/包名/files/fake_apk/

这种目录下,在壳的 Application (那个lib 中的 Application)的 attachBaseContext 的时候,我们可以将这个apk加载进来,然后过滤出所有加密的 dex 文件,之后解密,然后将这些解密后的文件存入到指定的目录,后续就使用这些已经解密的dex 。当然,我们不需要每次都去解密这个 dex ,将其存起来就好了,下次直接使用。

对称加密、非对称加密

看了,但是笔记略

后续要根据视频内容自己写一下整个的加壳、脱壳的过程

谢谢你的鼓励