Android中的Apk的加固(加壳)原理解析和实现

加壳原理:
将源apk加密和壳Dex(负责解密)合并成新的Dex。
主要步骤:
用加密算法对源apk加密;再与壳apk进行合并得到新的Dex文件,最后替换壳程序中的dex文件即可。
他的主要工作是:负责解密源apk,然后加载apk,让其正常运行起来。
问题:如何将源apk和壳apk合并成新的dex。

Dex文件:

1、jd-gui:可以查看jar中的类,其实他就是解析class文件,只要了解class文件的格式就可以

2、dex2jar:将dex文件转化成jar,原理也是一样的,只要知道Dex文件的格式,能够解析出dex文件中的类信息就可以了

当然我们在分析这个文件的时候,最重要的还是头部信息,应该他是一个文件的开始部分,也是索引部分,内部信息很重要。

Android中的Apk的加固(加壳)原理解析和实现

我们今天只要关注上面红色标记的三个部分:

  1. checksum

文件校验码 ,使用alder32 算法校验文件除去 maigc ,checksum 外余下的所有文件区域 ,用于检查文件错误 。

  1. signature

使用 SHA-1 算法 hash 除去 magic ,checksum 和 signature 外余下的所有文件区域 ,用于唯一识别本文件 。

  1. file_size

Dex 文件的大小 。

问题:为什么只需关注这三个字段

因为我们需要将一个文件(加密之后的源Apk)写入到Dex中,那么我们肯定需要修改文件校验码(checksum).因为他是检查文件是否有错误。那么signature也是一样,也是唯一识别文件的算法。还有就是需要修改dex文件的大小。

不过这里还需要一个操作,就是标注一下我们加密的Apk的大小,因为我们在脱壳的时候,需要知道Apk的大小,才能正确的得到Apk。那么这个值放到哪呢?这个值直接放到文件的末尾就可以了。

所以总结一下我们需要做:修改Dex的三个文件头,将源Apk的大小追加到壳dex的末尾就可以了。(应该是脱壳apk的内容)

我们修改之后得到新的Dex文件样式如下:

Android中的Apk的加固(加壳)原理解析和实现

那么我们知道原理了,下面就是代码实现了。所以这里有三个工程:

1、源程序项目(需要加密的Apk)

2、脱壳项目(解密源Apk和加载Apk)

3、对源Apk进行加密和脱壳项目的Dex的合并