草庐IT

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

sanren1024 2025-04-07 原文

文章目录

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

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

  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...
    

    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...

这样执行就成功了。之后再次安装重打包后的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] # 
    

    这里连接是成功的。

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

  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.
    

已验证方法:

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

现在换成手动方式。

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

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

    {"android_armeabi-v7a": "15.2.2"}
    

    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...
    

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

问题

运行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
    

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

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

有关3. Android逆向-基于Frida的工具Objection的更多相关文章

  1. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  2. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  5. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  6. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  7. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  8. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  9. ruby - 使用 Ruby 开发工具包将文件上传到 Amazon S3 - 2

    我正在尝试上传文件。一个简单的hello.txt。我正在关注文档,但无法将其上传到我的存储桶。#STARTAWSCLIENTs3=Aws::S3::Resource.newbucket=s3.bucket(BUCKET_NAME)begins3.buckets[BUCKET_NAME].objects[KEY].write(:file=>FILE_NAME)puts"Uploadingfile#{FILE_NAME}tobucket#{BUCKET_NAME}."bucket.objects.eachdo|obj|puts"#{obj.key}=>#{obj.etag}"endresc

  10. ruby - 在 Rakefile 中动态生成 Rake 测试任务(基于现有的测试文件) - 2

    我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n

随机推荐