阅读 1462

Android逆向之逆向工具

原文链接

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还提供了其他功能:

  1. Magisk Hide隐藏root
  2. systemless方式修改hosts
  3. 修改Magisk应用名(可以绕过一些针对Magisk的检测)
  4. 通过 Google的SafetyNet检查
  5. 支持功能模块,可通过安装模块实现Exposed等

SuperSU

曾经最流行的root获取和授权工具,原生无广告,支持简体中文,界面简洁美观并且稳定。 但目前基本停止更新,不支持Android 8.0以上。

小米解锁BL工具

小米官方提供了解锁BL工具,可以很方便实现小米手机BL解锁,解锁流程:

  1. 进入“设置 -> 开发者选项 -> 设备解锁状态”中绑定账号和设备
  2. 手动进入Bootloader模式
  3. 通过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 有两个限制:

  1. 不支持修改系统(可以修改普通APP中对系统API的调用),因此重力工具箱,应用控制器等无法使用。
  2. 暂不支持资源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-unpackFrida hookhook libart.so中的OpenMemory或者libdexfile.so中的OpenCommon方法,得到dex地址7.0~10.0一代壳
FRIDA-DEXDumpFrida hook完整的dex,直接内存中暴力搜索magic魔数;抹头的dex,通过匹配一些特征查找5.0~12.0一代壳
drizzleDumperPtrace注入通过Ptrace附加需要脱壳的apk进程,然后在脱壳的apk进程的内存中进行dex文件的特征搜索,当搜索到dex文件时,进行dex文件的内存dump5.0一代壳
WrBug/dumpDexXposed hook根据APK内容特征判断是否为腾讯、360、百度、梆梆、爱加密一种,其余壳不支持。再Hook Instrumentation 类的 newApplication() 方法和 ClassLoader 类的 loadClass() 方法,获取 Application 或 Activity 所在的 dex 的数据。7.0~10.0一代特定壳
ApkShellingXposed hookhook 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范围内,不在则归为extra4.4.3二代指令抽取
FUPK3修改Android源码遍历dvmUserDexFiles获取dex,遍历触发函数,解析器处插桩,截取解密后的code_item,数组重组为dex4.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)三代动态解密

除此以外还有ZjDroidDexExtractorandroid-unpackerdexdump等很多种脱壳方式,这里没有再一一列举,感兴趣可以去查看源码研究下实现原理。

网络分析

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
文章标签