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,通过反射来运行。

主要的步骤:

  1. 从脱壳apk中的dex文件中,找到加壳的apk,并进行解密(如果做了加密)
  2. 加载解密之后的源程序Apk
  3. 找到源程序的Application程序,运行源程序

results matching ""

    No results matching ""