APK加壳的原理
加壳涉及到三个部分的工程:
- 源APK
- 脱壳代码
- 加壳代码
加壳的原理
加壳有2种方式,具体看被加密的apk数据的位置
被加密的apk数据位于借壳数据的DEX文件的尾部
加壳的步骤:
- 加密源程序APK文件,处理成解壳数据
- 把解壳数据写入到解壳程序Dex文件的末尾,并在末尾添加个解壳数据的长度值
- 修改解壳程序Dex文件的header中的checksum、signature 和file_size头信息
- 修改源程序AndroidMainfest.xml文件并覆盖解壳程序AndroidMainfest.xml文件
被加密的apk数据位于借壳数据的DEX文件的头部
加壳的步骤:
- 加密源程序APK文件,处理成解壳数据
- 计算解壳数据长度,并添加该长度到解壳DEX文件头末尾,并继续解壳数据到文件头末尾(插入数据的位置为0x70处)
- 修改解壳程序DEX头中checksum、signature、file_size、header_size、string_ids_off、type_ids_off、proto_ids_off、field_ids_off、method_ids_off、class_defs_off和data_off相关项。 分析map_off 数据,修改相关的数据偏移量
- 修改源程序AndroidMainfest.xml文件并覆盖解壳程序AndroidMainfest.xml文件
解壳的步骤:
- 从0x70处读取解壳数据长度。
- 从DEX文件读取解壳数据,解密解壳数据。以文件形式保存解密数据到a.APK
- 通过DexClassLoader动态加载a.APK。
脱壳的原理
针对第一种加壳的方式进行解壳操作。
原理分析:
- 通过反射置换android.app.ActivityThread 中的mClassLoader为加载解密出APK的DexClassLoader。这样既保证了加载目标apk,同时也保留了原先加载的资源。
- 找到源程序里的Application,通过反射来运行。
主要的步骤:
- 从脱壳apk中的dex文件中,找到加壳的apk,并进行解密(如果做了加密)
- 加载解密之后的源程序Apk
- 找到源程序的Application程序,运行源程序