APK保护方法

最近在学习Android逆向相关的知识,了解APK的保护方法对逆向有很大的帮助。

0x01. Dex完整性校验

classes.dex 在 Android 系统上基本负责完成所有的逻辑业务,因此很多针对 Android 应用程序的篡改都是针对 classes.dex 文件的。在 APK 的自我保护上,也可以考虑对 classes.dex文件进行完整性校验,简单的可以通过 CRC 校验完成, 也可以检查 Hash 值。由于只是检查classes.dex,所以可以将 CRC 值存储在 string 资源文件中,当然也可以放在自己的服务器上,通过运行时从服务器获取校验值。基本步骤如下:

  • 首先在代码中完成校验值比对的逻辑,此部分代码后续不能再改变,否则 CRC 值会发生变化;
  • 从生成的 APK文 件中提取出 classes.dex 文件,计算其 CRC 值,其他 hash 值类似;
  • 将计算出的值放入 strings.xml 文件中。

0x02. APK完整性校验

虽然 Android 程序的主要逻辑通过 classes.dex 文件执行,但是其他文件也会影响到整个程序的逻辑走向,以上述 Dex 文件校验为例,如果程序依赖 strings.xml 文件中的某些值,则修改这些值就会影响程序的运行,所以进一步可以整个 APK 文件进行完整性校验。 但是如果对整个 APK 文件进行完整性校验,由于在开发 Android 应用程序时,无法知道完整 APK 文件的 Hash 值,所以这个 Hash 值的存储无法像 Dex 完整性校验那样放在 strings.xml 文件中,所以可以考虑将值放在服务器端。

0x03. 模拟器检测

一般在分析 APK 的过程中会借助于 Android 模拟器,比如分析网络行为,动态调试等。因此从 APK 自我保护的角度出发,可以增加对 APK 当前运行环境的检测,判断是否运行在模拟器中,如果运行在模拟器中可以选择退出整个应用程序的执行或者跳到其他分支。模拟器检测的手段有很多,下面逐一分析。

  1. 属性检测
    Android 属性系统类似于 Windows 的注册表机制, 所有的进程可以共享系统设置值 一些属性值在 Android 模拟器和真机上是不同的,根据这些属性值在真实机器和模拟器上的差别可以比较容易的。
  2. 虚拟机文件检测
    相对于真实设备,Android模拟器中存在一些特殊的文件或目录,如/system/bin/qemu-props,该可执行文件可以用来在模拟器中设置系统属性。 另外还有/system/lib/libc_malloc_debug_qemu.so 文件以及/sys/qemu_trace 目录。我们可以通过检测这些特殊文件或者目录是否存在来判断 Android 应用程序是否运行在模拟器中。

0x04. 调试器检测

在对 APK 逆向分析时,往往会采取动态调试技术,可以使用 netbeans+apktool 对反汇编生成的 smali 代码进行动态调试。为了防止 APK 被动态调试,可以检测是否有调试器连接。Android 系统在 android.os.Debug 类中提供了 isDebuggerConnected()方法,用于检测是否有调试器连接。可以在 Application 类中调用 isDebuggerConnected()方法,判断是否有调试器连接,如果有,直接退出程序。
除了 isDebuggerConnected 方法,还可以通过在 AndroidManifest 文件的 application 节点中加入 android:debuggable=”false”使得程序不可被调试,这样如果希望调试代码,则需要修改该值为 true,因此可以在代码中检查这个属性的值,判断程序是否被修改过,