Android最新应用加固技术,涉及到的一些点

503 阅读5分钟

加固和逆向,其实就是防守端和攻击端在博弈,两者一直在较劲,谁都不敢懈怠。

  • 游戏加固:因为游戏APP主要由 Unity、Cocos、Unreal 、Godot 等游戏引擎来开发,APK 主要针对 so 文件进行加密保护。
  • 应用加固:普通原生应用开发,因为都会编译成 .class 字节码,所以加密保护的部分主要针对 dex 的保护。
一些 APP 没加固后,可能会导致以下几个场景问题。
  1. APP 被工信部下面的管局查到相关违规问题后,会被全方面的检测一遍,把 APP 里所有违规的问题给理出来。APP 如果没加固,管局会直接告知 APP 未加固引起的风险:恶意脚本注入、key泄露等。未加固的 APP 会增加被管局查到的风险。
  2. 单机游戏未加固,上架应用商店后。被别人用 ApkTool 进行反编译然后修改 .smali 相关文件,修改包名以及修改相关界面等,做出来个类似的APP,源码基本上是一样的,然后进行重签名后进行打包,发布到应用商店进行付费下载进行盈利。未加固的 APP,会被灰产给盯着。
  3. 未加固的 APK,会面临很多逆向或灰产工具的分析与攻击,比如:Magisk、Xposed、Frida、EdXposed、epic、VirtualApp、TaiChi、Android-Inline-Hook、Sand Hook、xHook、010 Editor、apkgtool、dex2jar、jd-gui、jadx、AXMLPrinter2、baksmali、bytecode-viewer、androguard、appmon、IDA Pro、JEB Decompiler 等,例如逆向工具找到 APP 相关代码的漏洞,然后进行针对性的攻击。有可能导致 APP 某个功能页面完全用不了。
  4. 攻击者可以利用低版本系统(android 4.4之前系统、android 5.0、android 6.0等)的 Android 手机进行攻击,越是低版本的手机,系统设计的时候安全保护机制相对来说本身就比较弱。
脱壳

利用Android反编译工具可以很容易得到源码和资源文件,还可以修改资源代码、重新打包编译。为了提高安全性,可以对APK进行加固,加固的方式有代码混淆、dex文件加密、dex method抽取到外部、so加密、dex method动态解密、对抗脱壳、vmp等,目前大致可分为四代壳,针对这些壳逆向人员也研究出各种脱壳技术。 Android 4.4之前以全部是Dalvik虚拟机,5.0以后则全部采用ART为默认虚拟机,因为目前市场大部分系统都基本高于5.0版本,因此此处整理大部分为针对5.0及以上ART的脱壳技术。 除此以外还有ZjDroidDexExtractorandroid-unpackerdexdump 、FDex2 等很多种脱壳方式,这里没有再一一列举,感兴趣可以去查看源码研究下实现原理。

网络分析:

Wireshark 一款跨平台 PC 端网络数据包分析器,支持Windows、MacOS、Linux等系统,支持协议很多也很全面,支持HTTPS抓包但不支持解密。 使用WinPCAP作为接口,直接与网卡进行数据报文交换。

Charles 一款 PC 端抓包分析工具,是收费软件,通过代理实现,支持Windows、MacOS、Linux等系统,支持 HTTP 和 HTTPS 网络封包,可对HTTPS进行解密。

Fiddler 一款 PC 端抓包分析工具,Fiddler Everywhere支持跨平台,也是基于代理实现,支持 HTTP 和 HTTPS 抓包与分析。 HttpCanary 一款Android平台上强大的抓包工具,支持支持HTTP、HTTPS、WebSocket等多种协议,并且支持数据筛选、请求注入、请求导出等功能。 无需root便可实现抓包,但是Android 7.0以上HTTPS证书安装仍需root权限。

AndroidHttpCapture 一款针对于移动流量劫持而开发的手机抓包软件,可以当作是Android版的"Fiddler",主要功能包括:手机端抓包、PING/DNS/TraceRoute诊断、抓包HAR数据上传分享。

Burp Suite 是一个 java 开发的用于攻击 web 应用程序的集成平台,包含了许多工具。 Burp Suite为这些工具设计了许多接口,以加快攻击应用程序的过程。所有工具都共享一个请求,并能处理对应的HTTP 消息、持久性、认证、代理、日志、警报。常用功能有:抓包、重放、爆破。

Magisk模块:

EdXposed完整框架 很方便安装EdXposed完整环境,内置了Riru、EdXposed、EdXposed Manager等部分。

ADB Root 可以让 adb 通过adb root命令获得root权限。

MagiskFrida 在启动时让magisk作为root运行frida-server。

Xpose模块:

RootCloak 隐藏root,绕过应用的root检测。

JustTrustMe 用来禁用、绕过 SSL 证书检查,对校验 SSL 证书的方法都进行了 Hook,从而绕过证书检查。

JustTrustMePlus JustTrustMe的升级版,能够对抗OkHttp的混淆加密。

TrustMeAlready 使用Mattia Vinci的方式绕过SSL证书检查和证书锁定。

AndroidIdChanger 查看并修改安卓手机设备信息: IMEI、AndroidID、Wifi Mac、SerialNum、Wifi SSID、手机号、Bluetooth Mac、Google Ad Id、Wifi BSSID、IMSI、Sim卡状态、运营商信息、机器型号、制造商、品牌、系统版本、CPU_ABI、CPU_ABI2、SDK、BuildID、分辨率、IP等。

SafetyNet Google的一种反滥用 API,让应用开发者能够评估运行其应用的 Android 设备。该 API 应该用作滥用检测系统的一部分,以帮助确定您的服务器是否与在真实 Android 设备上运行的真实应用互动。

ndk_dlopen 一个帮助绕过Android N的classloader命名空间限制的实现。

加固原理
  • 获取 app 的 application 名
  • 修改 app 的 AndroidManifest.xml 的 Application 为 dex 壳的 Application
  • 壳 dex 和源 dex 拼接成一个 dex,格式如下:
    1. 壳 dex + (1字节 application 名长度 + app 的 application 名 + 4字节源 dex 大小 + 源dex ) + 4字节源 dex2 大小 + [源 dex2 ] + 4字节源 dex3 大小 + [源 dex3 ] + ... + 4字节壳 dex 大小
    2. 小括号的数据前512字节进行 AES 加密
    3. 中括号的数据的 dex 头(也就是前112位进行异或)
壳 dex 处理
  • 解密出 app 的 application 名和 dex
  • 加载 app 的 dex
    1. Android8.0以下版本采用call libart的OpenMemory函数实现内存加载dex
    2. Android8.0及以上采用系统提供的InMemoryDexClassLoader实现内存加载dex
    • 壳 application 替换为 app 的 application