Objection安装使用
在开始熟悉Frida时,接触的示例是需要frida-server在一个root过的os环境中运行,便于读取/访问所有需要的数据或其他app。一般真机开发过程,都是一个比较纯粹的App开发,不会在一个Root过的Android设备上进行开发。这篇主要就是学习在非Root环境下hook app。
这里介绍并使用一个基于Frida开发的工具objection: 📱 objection - runtime mobile exploration (github.com)。
本篇文章主要描述下objection安装及在使用过程中遇到的问题。
安装
安装Objection工具前先确认系统中安装了Python 3.4以上版本,现在较新的版本基本都比3.4高来了,也可以使用python -V
指令查看版本号。另外更新pip3工具,使用命令pip install pip --upgrade
进行更新。
最后使用命令pip3 install -U objection
进行objection的安装。
Python的版本一定要是Python 3,而非Python 2,否则按照过程会报错。
Collecting objection
Could not find a version that satisfies the requirement objection (from versions: )
No matching distribution found for objection
可以到Objection wiki中查看安装条件及步骤,[跳转](Installation · sensepost/objection Wiki (github.com))到官网
在Windows上直接尝试了安装最新版本的Frida及Objection,遇到了问题,安装的坑,Objection安装版本需要配合Frida版本,不能在不指定版本的情况下直接安装Frida,因为默认会安装Frida最新版本,这样在运行objection会提示错误。
Unable to connect to the frida server: need Gadget to attach on jailed Android; its default location is: C:\Users\2006017018\AppData\Local\Microsoft\Windows\INetCache\frida\gadget-android-arm64.so
可以查看 问题 中的说明。
使用
在使用过程中,可能会遇到一些不大不小的问题,下面对在Ubuntu上及Windows操作过程出现问题的整理。
Ubuntu
重打包目的是将frida-gadget.so库嵌入到apk中,并且对apk做少许修改,以便可以通过工具进行指令交互。
需要的工具:
- aapt/aapt2 资源的编译工具,可以在 **$ANDROID_HOME/build-tools/[工具版本]/ ** 路径下找到。
- adb 指令工具,在 $ANDROID_HOME/paltform-tools/ 路径下找到。
- jarsigner jar包签名工具,可以在 $JAVA_HOME/bin l路径下找到。
- Apktool apk反编译工具,需要下载Apktool,ubuntu等linux系统下,不建议直接使用package manager方式安装,建议下载使用最新版本。
可以将这些工具方法同一个目录下便于使用。
下来使用 objection patchapk 指令进行重打包工作。
$ objection patchapk --source ../ruixi.apk
直接使用指令进行打包遇到的问题.
-
aapt工具找不到:这个多半是没有配置aapt工具的环境变量,可以配置环境变量解决。一般开发时AS会完成对AAPT工具的使用。
-
提示
Failed to determine architecture. Is the device connected and authorized?
:这个更容易理解,objection 需要知道apk运行的设备CPU架构,从而对应将 frida-gadget 嵌入到apk中。 -
frida-gadget版本:需要注意的是,objection 是基于frida开发,frida更新版本快,objection 使用的frida版本不会是最新的,需要注意版本的一致。
-
frida-gadget下载超时:在开始下载时,会有如下提示,将下载的 frida-gadget.so 放入到 home 目录的 ~/.objection/android/x86/ 的路径下。
Using manually specified version: 14.2.14 Remote FridaGadget version is v14.2.14, local is v0. Downloading... Downloading from: https://github.com/frida/frida/releases/download/14.2.14/frida-gadget-14.2.14-android-x86.so.xz Downloading x86 library to ~/.objection/android/x86/libfrida-gadget.so.xz...
aapt
aapt2
apksigner 版本是build-tools 版本31内取得。均通过配置环境变量路径到 $ANDROID_HOME/build-tools/[版本文件夹]/ 即可。
-
Apktool找不到。按照官网的安装步骤进行操作就可以解决。
上述5个问题基本就可以包含所有使用的工具包。
运行指令:
$ objection patchapk -a x86 -V 14.2.14 --source ../ruixi.apk
sing manually specified version: 14.2.14
Patcher will be using Gadget version: 14.2.14
Detected apktool version as: 2.6.1
Running apktool empty-framework-dir...
Unpacking ruixi.apk
App does not have android.permission.INTERNET, attempting to patch the AndroidManifest.xml...
Injecting permission: android.permission.INTERNET
Writing new Android manifest...
Setting extractNativeLibs to true...
Target class not specified, searching for launchable activity instead...
Reading smali from: /tmp/tmph5gwopp_.apktemp/smali/com/ruixi/android/app1/ui/activity/RXMainActivity.smali
Injecting into an existing constructor
Injecting loadLibrary call at line: 138
Attempting to fix the constructors .locals count
Current locals value is 2, updating to 3:
Writing patched smali back to: /tmp/tmph5gwopp_.apktemp/smali/com/ruixi/android/app1/ui/activity/RXMainActivity.smali
Creating library path: /tmp/tmph5gwopp_.apktemp/lib/x86
Copying Frida gadget to libs path...
Rebuilding the APK with the frida-gadget loaded...
Built new APK with injected loadLibrary and frida-gadget
Performing zipalign
Zipalign completed
Signing new APK.
Signed the new APK
Copying final apk from /tmp/tmph5gwopp_.apktemp.aligned.objection.apk to ruixi-20220615-1.0.1.80.objection.apk in current directory...
Cleaning up temp files...
这样执行就成功了。之后再次安装重打包后的apk。
连接测试
在重新安装后,进行连接。
-
非Root系统。
$ objection -g com.ruixi.android explore Using USB device `xCL` Agent injected and responds ok! _ _ _ _ ___| |_|_|___ ___| |_|_|___ ___ | . | . | | -_| _| _| | . | | |___|___| |___|___|_| |_|___|_|_| |___|(object)inject(ion) v1.11.0 Runtime Mobile Exploration by: @leonjza from @sensepost [tab] for command suggestions com.ruixi.android on (saio: 8.1.0) [usb] # env Name Path ---------------------- ------------------------------------------------------------- cacheDirectory /data/user/0/com.ruixi.android/cache codeCacheDirectory /data/user/0/com.ruixi.android/code_cache externalCacheDirectory /storage/emulated/0/Android/data/com.ruixi.android/cache filesDirectory /data/user/0/com.ruixi.android/files obbDir /storage/emulated/0/Android/obb/com.ruixi.android packageCodePath /data/app/com.ruixi.android-3KNHldf3u0HvkOOWzexSDA==/base.apk com.ruixi.android on (saio: 8.1.0) [usb] # com.ruixi.android on (saio: 8.1.0) [usb] #
这里连接是成功的。
注意的是,使用指令连接前,进程需要是存在的。
-
Root系统。
- 模拟器。运行失败
Unable to connect to the frida server: need Gadget to attach on jailed Android; its default location is: ~/.cache/frida/gadget-android-arm64.so
暂无解决办法。 - 真机。运行失败,无解决办法。
- 模拟器。运行失败
结论:frida-gadget 方式,只适用于非Root系统。Root系统环境下,不需要将frida-gadget.so库嵌入到app中,可以直接使用objection指令操作。
Windows
-
找不到 aapt/aapt2,将appt的目录设置到
PATH
环境变量。例如:D:\DevTools\android_sdk\build-tools\33.0.0-rc4 -
提示找不到 apktool,基于[APKTOOL官网](Apktool - How to Install (ibotpeaches.github.io)) 的windowsx下的安装方式,将apktool配置到环境变量中。
Unable to find apktool. Install it with: apt install apktool (Kali Linux) before continuing.
已验证方法:
windows系统下,有时候在使用objecton patchapk
对目标apk进行frida-gadget.so注入时,objection进行对应版本的frida-gadget.so.xz压缩包下载时,可能会由于带宽或网络延迟导致下载失败。
解决方法:
首先注意到C:盘用户目录下的.objection下下载好so文件的目录结构及android目录下的结构。
打开文件gadget_versions,内容是下载好的CPU结构及so版本信息。
{"android_armeabi-v7a": "15.2.2"}
逆向考虑下,在还 objection 没有下载前提下,我们首先手动下载需要的frida-gadget[版本号].so.xz版本。下载到本地,减压缩并且重名为libfrida-gadget.so。
在开始patchapk,信息提示从远程下载对应版本。
No architecture specified. Determining it using `adb`...
Detected target device architecture as: armeabi-v7a
Using latest Github gadget version: 15.2.2
Remote FridaGadget version is v15.2.2, local is v0. Downloading...
Downloading from: https://github.com/frida/frida/releases/download/15.2.2/frida-gadget-15.2.2-android-arm.so.xz
现在换成手动方式。
-
手动下载frida-gadget-15.2.2-android-arm.so.xz,减压缩并且重命名为libfrida-gadget.so。
-
在.objection目录下创建文件gadget_versions文件,并编辑内容
{"android_armeabi-v7a": "15.2.2"}
json格式的key是设备CPU架构,value是版本号。
-
使用patchapk命令再次尝试向apk注入so库。
objection patchapk --source .\homework_killer.apk No architecture specified. Determining it using `adb`... Detected target device architecture as: armeabi-v7a Using latest Github gadget version: 15.2.2 Patcher will be using Gadget version: 15.2.2 Detected apktool version as: 2.6.1 Running apktool empty-framework-dir... I: Removing 1.apk framework file... Press any key to continue . . . Unpacking .\homework_killer.apk App already has android.permission.INTERNET Target class not specified, searching for launchable activity instead... Reading smali from: D:\TEMP\tmpfj1n_wzo.apktemp\smali\com/kanxue/ctf/MainActivity.smali Injecting into an existing constructor Injecting loadLibrary call at line: 14 Attempting to fix the constructors .locals count Current locals value is 1, updating to 2: Writing patched smali back to: D:\TEMP\tmpfj1n_wzo.apktemp\smali\com/kanxue/ctf/MainActivity.smali Copying Frida gadget to libs path... Rebuilding the APK with the frida-gadget loaded... Built new APK with injected loadLibrary and frida-gadget Performing zipalign Zipalign completed Signing new APK. Signed the new APK Copying final apk from D:\TEMP\tmpfj1n_wzo.apktemp.aligned.objection.apk to .\homework_killer.objection.apk in current directory... Cleaning up temp files...
这些提示信息,说明可以成功的。
问题
运行objection出现的问题。
-
无法正常连接设备,并提示。
Unable to connect to the frida server: need Gadget to attach on jailed Android; its default location is: C:\Users\2006017018\AppData\Local\Microsoft\Windows\INetCache\frida\gadget-android-arm64.so
上述提示发生时,我使用的Objection版本是
1.11.0
,但Frida版本是15.2.2
。这里就说明可能 设备中的 frida-server 版本与PC上安装的 版本不一致。目前Objection的最新版本是
1.11.0
,与之最匹配的Frida版本是14.2.14
。