加固和逆向,其实就是防守端和攻击端在博弈,两者一直在较劲,谁都不敢懈怠。
- 游戏加固:因为游戏APP主要由 Unity、Cocos、Unreal 、Godot 等游戏引擎来开发,APK 主要针对 so 文件进行加密保护。
- 应用加固:普通原生应用开发,因为都会编译成 .class 字节码,所以加密保护的部分主要针对 dex 的保护。
一些 APP 没加固后,可能会导致以下几个场景问题。
- APP 被工信部下面的管局查到相关违规问题后,会被全方面的检测一遍,把 APP 里所有违规的问题给理出来。APP 如果没加固,管局会直接告知 APP 未加固引起的风险:恶意脚本注入、key泄露等。未加固的 APP 会增加被管局查到的风险。
- 单机游戏未加固,上架应用商店后。被别人用 ApkTool 进行反编译然后修改 .smali 相关文件,修改包名以及修改相关界面等,做出来个类似的APP,源码基本上是一样的,然后进行重签名后进行打包,发布到应用商店进行付费下载进行盈利。未加固的 APP,会被灰产给盯着。
- 未加固的 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 某个功能页面完全用不了。
- 攻击者可以利用低版本系统(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的脱壳技术。
除此以外还有ZjDroid、DexExtractor、android-unpacker、dexdump 、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,格式如下:
- 壳 dex + (1字节 application 名长度 + app 的 application 名 + 4字节源 dex 大小 + 源dex ) + 4字节源 dex2 大小 + [源 dex2 ] + 4字节源 dex3 大小 + [源 dex3 ] + ... + 4字节壳 dex 大小
- 小括号的数据前512字节进行 AES 加密
- 中括号的数据的 dex 头(也就是前112位进行异或)
壳 dex 处理
- 解密出 app 的 application 名和 dex
- 加载 app 的 dex
- Android8.0以下版本采用call libart的OpenMemory函数实现内存加载dex
- Android8.0及以上采用系统提供的InMemoryDexClassLoader实现内存加载dex
- 壳 application 替换为 app 的 application