• 3. Android逆向-基于Frida的工具Objection


    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
    
    • 1
    • 2
    • 3

    可以到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
    
    • 1

    可以查看 问题 中的说明。

    使用

    在使用过程中,可能会遇到一些不大不小的问题,下面对在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
    
    • 1

    直接使用指令进行打包遇到的问题.

    1. aapt工具找不到:这个多半是没有配置aapt工具的环境变量,可以配置环境变量解决。一般开发时AS会完成对AAPT工具的使用。

    2. 提示 Failed to determine architecture. Is the device connected and authorized?:这个更容易理解,objection 需要知道apk运行的设备CPU架构,从而对应将 frida-gadget 嵌入到apk中。

    3. frida-gadget版本:需要注意的是,objection 是基于frida开发,frida更新版本快,objection 使用的frida版本不会是最新的,需要注意版本的一致。

    4. 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...
      
      • 1
      • 2
      • 3
      • 4

      aapt
      aapt2
      apksigner 版本是build-tools 版本31内取得。

      均通过配置环境变量路径到 $ANDROID_HOME/build-tools/[版本文件夹]/ 即可。

    5. 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...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    这样执行就成功了。之后再次安装重打包后的apk

    连接测试

    在重新安装后,进行连接。

    1. 非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] # 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26

      这里连接是成功的。

      注意的是,使用指令连接前,进程需要是存在的。

    2. 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.
      
      • 1

    已验证方法:

    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"}
    
    • 1

    逆向考虑下,在还 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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    现在换成手动方式。

    1. 手动下载frida-gadget-15.2.2-android-arm.so.xz,减压缩并且重命名为libfrida-gadget.so。

    2. 在.objection目录下创建文件gadget_versions文件,并编辑内容

      {"android_armeabi-v7a": "15.2.2"}
      
      • 1

      json格式的key是设备CPU架构,value是版本号。

    3. 使用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...
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27

      这些提示信息,说明可以成功的。

    问题

    运行objection出现的问题。

    1. 无法正常连接设备,并提示。

      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
      
      • 1

      上述提示发生时,我使用的Objection版本是1.11.0,但Frida版本是15.2.2

      这里就说明可能 设备中的 frida-server 版本与PC上安装的 版本不一致。目前Objection的最新版本是1.11.0,与之最匹配的Frida版本是14.2.14

  • 相关阅读:
    AWS 中文入门开发教学 10- 建立VPC - 建立我们自己的 IDC
    Aqara秋季品鉴会众新品亮相 空间智能全面进化
    性能测试方法全解
    【Linux网络】TCP/IP三次握手、四次挥手流程
    vs2019_qt6.2.4_dcmtk3.6.7_vtk9.2.2_itk5.3_opencv4.6.0编译记录
    【Vue】vue2与WebApi跨域CORS问题
    windows上传文件到linux的方法
    MySQL中的内置函数
    学习Android的第二十六天
    Delphi时间戳转日期、日期转时间戳
  • 原文地址:https://blog.csdn.net/snowgeneral/article/details/126571392