android文件IO的应用场景dex文件加密(粗粒度)

1,225 阅读3分钟

一、加固的手段

1.反模拟器

在发现是模拟器的时候,会停止核心代码的运行。(模拟器可以自己编译,加很多东西)

2.代码虚拟化

自己创建一个虚拟执行的引擎,把原生可执行的代码转换成自定义的指令进行虚拟执行。(代码在自己的虚拟机上运行。)

3.加密

把核心代码进行加密,不核心代码运行的时候会对加密代码进行解密。

二、加密加固的总体框架

1.把核心的dex分离出来。
2.对核心dex进行AES对称加密。
3.把壳dex2(用于解密核心dex的dex)和加密后的dex合并在一起。
4.重新打包成APK.
5.进行重新签名。

image.png

三、加密的基础原理

Dex文件的结构

当数据区的类的定义区存在,但数据区被加密了,咱们反编译出来的方法,会存在方法名和定义,但是里面却没有实现。

image.png

APK的打包流程

1.把整个应用的资源文件通过aapt工具打包成R.java文件。
2.把所有的.aidl文件通过aidl工具生成java接口文件。
3.把上述两个文件和本身的.java文件 通过java的编译器,编译成。class文件。
4.通过dx.bat工具把class文件生成.dex文件。
5.把资源文件、.dex文件和其它资源文件通过aplbuilder工具打包成APK.
6.通过keyStore(签名文件)进行签名,变成可执行的apk。

image.png

三、实现加密流程

1.把APK中的dex进行加密处理

1.把apk解压出来。

2.把除了签名文件外的所有文件放入新的文件夹。

3.再用文件过滤器把.dex文件拿出来。

 //获得所有的dex (需要处理分包情况)
        File[] dexFiles = dstApkFile.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File file, String s) {
                return s.endsWith(".dex");
            }
        });
  1. 把.dex文件读成字节流读入内存。

 public static byte[] getBytes(File dexFile) throws Exception {
      RandomAccessFile fis = new RandomAccessFile(dexFile, "r");
      byte[] buffer = new byte[(int)fis.length()];
      fis.readFully(buffer);
      fis.close();
      return buffer;
  }
  1. 把内存的字节流进行加密,然后写回文件。

2.壳dex生成,用于解密处理。

壳的代码是在module里编写,所以生成的是.aar

aar和apk的区别:

1)一个没有签名文件,一个有签名文件。

2)一个是jar,一个是dex文件。

1.把.arr文件解压到文件夹里。

2.把jar转换成dex(dx工具)

3.把壳的dex写入加密的dex文件下。

4.把壳dex,加密dex,资源文件等进行压缩打包

5.cmd命令,进行签名。

3.脱壳流程

  1. 在application的attach方法里,找到对应的APK。

  2. 解压APK,筛选出里面的dex文件。

  3. 把除application的dex外所有的dex文件进行解密处理,写入文件夹。

  4. 通过热修复的原理,把dex文件通过hook技术,加载到pathClassLoader里。

Hook:可以理解为,通过反射技术来修改源码的。