Android逆向可能会用到的的工具整理,包括root、hook、apk反编译、脱壳、网络分析、反汇编、Magisk模块、Xposed模块等方面。
root
root具有系统中的最高权限,能够帮助用户越过手机制造商的限制,得以卸载本身预装的程序,或运行需要系统权限的动作。因为Android的内核为Linux,安卓root实际上就是取得Linux的root用户权限。
一般出厂机器会禁用常规Bootloader的直接刷机功能,因此实现root一般都要先解锁BL,每个厂商解锁BL方式和难度都不同,小米官方提供了解锁BL工具。
Magisk
是台湾学生topjohnwu开发的一套用于定制Android的开源工具,涵盖了root、引导脚本、SELinux 修补、移除 AVB2.0、强制加密等功能,支持版本为Android4.2 ~ 11。
Magisk以systemless
方式实现root,在系统分区之外创建了一个magisk分区,并没有直接修改/system。
除能实现root和root授权之外,Magisk还提供了其他功能:
- Magisk Hide隐藏root
- systemless方式修改hosts
- 修改Magisk应用名(可以绕过一些针对Magisk的检测)
- 通过 Google的SafetyNet检查
- 支持功能模块,可通过安装模块实现Exposed等
SuperSU
曾经最流行的root获取和授权工具,原生无广告,支持简体中文,界面简洁美观并且稳定。 但目前基本停止更新,不支持Android 8.0以上。
小米解锁BL工具
小米官方提供了解锁BL工具,可以很方便实现小米手机BL解锁,解锁流程:
- 进入“设置 -> 开发者选项 -> 设备解锁状态”中绑定账号和设备
- 手动进入Bootloader模式
- 通过USB连接手机,点击 “解锁”按钮
hook
Frida
是一种支持windows、macos、linux、android、ios多平台,采用动态二进制插桩技术(DBI)的hook框架,并支持native级别的hook。
注入脚本使用javascript语言编写,Frida的方面的介绍和使用可以参考Android逆向之frida一文。
Xposed
是一个著名的开源Java层Hook框架,支持功能模块,可以在不触摸任何APK的情况下更改系统和应用程序的行为,如何官方已经停止更新,官方支持版本为Android5.0 ~ 8.1。
运行原理:通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。
hook原理:修改ART/Davilk虚拟机,将需要hook的方法注册为Native层函数,当执行到这一方法是虚拟机会优先执行Native层函数,然后再去执行Java层函数,从而完成方法的hook。
由于过于流行,也导致不少APP针对xposed进行了检测。
EdXposed
基于Riru实现的开源ART hook框架,类似于Xposed,提供了与OG Xposed一致的API,提供YAHFA和SandHook两种实现方式,成为Xposed停止更新后的官方接任者,支持版本为Android 8.0 ~ 11。
可以通过Magisk安装模块实现EdXposed安装,比如EdXposed完整框架。
epic
是一个在虚拟机层面、以 Java Method 为粒度的运行时 AOP Hook 框架。简单来说,Epic 就是 ART 上的 Dexposed,可以拦截本进程内部几乎任意的 Java 方法调用,可用于实现 AOP 编程、运行时插桩、性能分析、安全审计等。Epic 被 VirtualXposed 以及 太极 使用,用来实现非 Root 场景下的 Xposed 功能。支持版本为Android 5.0 ~ 11。
VirtualXposed
是基于VirtualApp 和 epic 在非ROOT环境下运行Xposed模块的实现,支持版本为Android 5.0 ~ 10.0。
与 Xposed 相比,目前 VirtualXposed 有两个限制:
- 不支持修改系统(可以修改普通APP中对系统API的调用),因此重力工具箱,应用控制器等无法使用。
- 暂不支持资源HOOK,因此资源钩子不会起任何作用;使用资源HOOK的模块,相应的功能不会生效。
TaiChi太极
一个 类Xposed框架,本身与Xposed没有任何关系,设计思路、实现机制到运作逻辑也完全不同,但能够运行Xposed模块的框架,既能以传统的 Root/刷机方式运作,也能免 Root/ 免刷机运行。支持版本为Android 5.0 ~ 10.0。
有两种工作模式:免 root 模式和 magisk 模式。免 root 模式无法修改系统,magisk 模式具有更强大的功能。
Cydia Substrate
基于Cydia实现的早期hook框架,支持java、native层的hook,并同时支持ios和Android系统,支持版本为Android 2.3 ~ 4.4。
Android-Inline-Hook
一种hook native的实现方式,通过替换函数开始处的指令为跳转指令,使得原函数跳转到自己的函数,支持thumb16、thumb32、arm32指令。
hook脚本用C语言编写,使用ndk-build来执行hook脚本。
SandHook
在 Android ART 虚拟机上的 Java 层 Hook 框架,作用于进程内,不需要 Root,支持版本为Android 4.4 ~ 11。
主要基于 inline hook,条件不允许时进行 ArtMethod 入口替换,支持对象方法、Static 方法、构造方法、JNI 方法、系统方法的 hook 。
xHook
一个针对 Android 平台 ELF (可执行文件和动态库) 的 PLT (Procedure Linkage Table) hook 库,不需要 Root,支持版本为Android 4.0 ~ 10.0。
反编译
010 Editor
一个十六进位文件编辑器,可使用模板格式解析二进制文件,可用来分析Android的AndroidManifest.xml、resource.arsc、.dex等文件。
apktool
一个APK反编译工具,可以将资源解码得到资源文件与.smali文件,还可以重新打包为apk。
-
反编译
apktool d <apkPath> o <outputPath>
-
重新打包
apktool b <fileDirPath> -o <apkPath>
dex2jar
一个操作Android的.dex的工具集,常用来把.dex文件反编译转换为.jar文件。 将要反编译的APK后缀名改为.rar或者 .zip后解压,便可得到其中的classes.dex文件。
-
反编译
d2j-dex2jar <dexFilePath> -o <outputJarFilePath>
-
重编译
d2j-jar2dex <jarFilePath> -o <outputDexFilePath>
jd-gui
一个用来查看.jar源码的GUI工具,可以使用dex2jar得到.jar,再拖入jd-gui中查看源码。
jadx
一款反编译利器,支持命令行和图形界面,支持apk、dex、jar、aar等格式的文件查看,还可以将反编译的源码导出为Gradle工程。
AXMLPrinter2
可用来获取APK文件中的 包名、版本号及图标,可以二进制XML文件反编译明文输出,比如反编译得到AndroidManifest.xml:
java -jar AXMLPrinter2.jar AndroidManifest.xml > ok.xml
apksigner
在 Android 7.0 中引入了全新的 APK Signature Scheme v2签名方,apksigner是Google官方提供的v2签名及验证的专用工具。
-
使用
release.jks
(密钥库中唯一的密钥)为APK签名:apksigner sign --ks release.jks app.apk
-
使用私钥和证书(存储为不同的文件)为 APK 签名:
apksigner sign --key release.pk8 --cert release.x509.pem app.apk
-
验证 APK 签名:
apksigner verify app.apk
smali/baksmali
用于将dex文件与smali文件格式进行互相转换。
-
dex转smali:
java -jar baksmali.jar d classes.dex
-
smali转dex:
java -jar smali.jar a smali-dir
bytecode-viewer
一个java实现的GUI逆向工具。内置DJ-GUI/Core,Procyon,CFR,Fernflower,Krakatau和JADX-Core六个反编译器;使用CFIDE进行字节码反编译;内置恶意代码扫描程序;用Ranino编译器编译反编译的Java类;可通过Smali/Baksmali修改APK;使用JD-Core快速反编译类。
androguard
一个python实现的逆向工程、恶意程序分析工具集。提供了解析AndroidManifest.xml、解析resources.arsc、打印证书签名、反编译APK创建流程图、字节码反汇编、创建方法调用图等功能。
appmon
一个用于监视和篡改macOS,iOS和android上的本机应用程序的系统API调用的自动化框架,基于Frida实现。可用于扫描系统可疑安全问题,也可以通过脚本来修改系统功能逻辑,例如DeviceID欺骗、GPS欺骗、绕过TouchID等。
反汇编
IDA Pro
目前最棒的一个静态反编译软件,本质是一种递归下降反汇编器,支持Intel X86、Intel x86-64、MIPS、ARM等多达数十种CPU指令集。
可用来逆向分析Android中的so动态库文件,支持反调试。
JEB Decompiler
一个收费的逆向工程平台,支持对Android应用和Dalvik字节码反编译,还支持ARM 32、ARM-Thumb、Intel x86、Intel x86-64、MIPS 32的反汇编。
脱壳
利用Android反编译工具可以很容易得到源码和资源文件,还可以修改资源代码、重新打包编译。为了提高安全性,可以对APK进行加固,加固的方式有代码混淆、dex文件加密、dex method抽取到外部、so加密、dex method动态解密、对抗脱壳、vmp等,目前大致可分为四代壳,针对这些壳逆向人员也研究出各种脱壳技术。
Android 4.4之前以全部是Dalvik虚拟机,5.0以后则全部采用ART为默认虚拟机,因为目前市场大部分系统都基本高于5.0版本,因此此处整理大部分为针对5.0及以上ART的脱壳技术。
名称 | 实现方式 | 原理 | 已知适用Android版本 | 适用壳 |
---|---|---|---|---|
frida-unpack | Frida hook | hook libart.so中的OpenMemory或者libdexfile.so中的OpenCommon方法,得到dex地址 | 7.0~10.0 | 一代壳 |
FRIDA-DEXDump | Frida hook | 完整的dex,直接内存中暴力搜索magic魔数;抹头的dex,通过匹配一些特征查找 | 5.0~12.0 | 一代壳 |
drizzleDumper | Ptrace注入 | 通过Ptrace附加需要脱壳的apk进程,然后在脱壳的apk进程的内存中进行dex文件的特征搜索,当搜索到dex文件时,进行dex文件的内存dump | 5.0 | 一代壳 |
WrBug/dumpDex | Xposed hook | 根据APK内容特征判断是否为腾讯、360、百度、梆梆、爱加密一种,其余壳不支持。再Hook Instrumentation 类的 newApplication() 方法和 ClassLoader 类的 loadClass() 方法,获取 Application 或 Activity 所在的 dex 的数据。 | 7.0~10.0 | 一代特定壳 |
ApkShelling | Xposed hook | hook java.lang.ClassLoader类的loadClass方法,获得loadClass返回的Class对象,反射调用Class对象的getDex方法获得Dex对象,将Dex对象提交给写文件的线程并对dex去重,线程异步从队列中读取字节集写到文件中 | 5.1.1 | 一代特定壳 |
DexHunter | 修改Android源码 | 通过feature string定位dex地址,先从内存中从odex文件头到class_defs之前的文件数据内容;读取class_defs之后为data;遍历class_def_item,通过code_item_of判断方法是否在dex范围内,不在则归为extra | 4.4.3 | 二代指令抽取 |
FUPK3 | 修改Android源码 | 遍历dvmUserDexFiles获取dex,遍历触发函数,解析器处插桩,截取解密后的code_item,数组重组为dex | 4.4(Nexus5 hammerhead手机) | 三代动态解密 |
FART | 修改Android源码 | 通过选择合适的时机点获取到应用解密后的dex文件最终依附的Classloader,进而通过java的反射机制最终获取到对应的DexFile的结构体,并完成dex的dump;主动调用类中的每一个方法,并实现对应CodeItem的dump;通过主动调用dump下来的方法的CodeItem进行dex中被抽取的方法的修复。 | 6.0(理论支持任何ART) | 三代动态解密 |
AUPK | 修改Android源码 | 不管壳是否禁用了dex2oat,类的初始化函数始终运行Execute函数,修改该函数从中获取ArtMethod对象再获取DexFile对象;通过dex中Class对象获取所有ArtMethod对象,主动调用使壳做code_item修复,将code_item回填,部分壳还原dex_header中的 Magic 字段。 | 7.1.1(Nexuse 5X) | 三代动态解密 |
除此以外还有ZjDroid、DexExtractor、android-unpacker、dexdump等很多种脱壳方式,这里没有再一一列举,感兴趣可以去查看源码研究下实现原理。
网络分析
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
。
Xposed模块
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命名空间限制的实现。
参考
今天的文章Android逆向之逆向工具分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/22168.html