日期:Mar-3-2022
作者:狐狸大剑眼镜
参考
书籍:安卓Frida逆向与抓包实战-肉丝
https://www.52pojie.cn/thread-1161419-1-1.html
基础知识
Objection默认通过USB连接设备,这里不必和
Frida的命令行一样通过-U参数指定USB模式连接,同时主要通过-g参
数指定注入的进程并通过explore命令进入REPL模式。
首先,在确认手机使用USB线连接上手机后,运
行相应版本的frida-server,运行“设置”应用以通过frida-ps找到对
应的App及其包名
这里我的objection版本一直有个用数据线就连接超时的问题,用aroid studio wifi调试没问题。
当不知道命令时通过按空格键就会提示可用的命令,在出现提示后通过上下选择键及回车键便可以输入命令
help命令。不知道当前命令的效果是什么时,在当前命令前
加help(比如help env)再回车之后就会出现当前命令的解释信息,
如图所示。
jobs命令。作业系统很好用,用于查看和管理当前所执行
Hook的任务,建议一定要掌握,可以同时运行多项Hook作业。
Frida命令。查看Frida相关信息
内存漫游相关命令
Objection可以快速便捷地打印出内存
中的各种类的相关信息,这对App快速定位有着无可比拟的优势,下面
介绍几个常用命令。
①可以使用以下命令列出内存中的所有类。
# android hooking list classes
②可以使用以下命令在内存中所有已加载的类中搜索包含特定关键
词的类。
# android hooking search classes
这里搜索一下包含display关键词的类。
# android hooking search classes display
③可以使用以下命令从内存中搜索所有包含关键词key的方法。
# android hooking search methods <key>
从上文中可以发现,内存中已加载的类高达6103个。它们的方法
是类的个数的数倍,整个过程会相当耗时。这里展示搜索包含display
# android hooking search methods display
④搜索到我们感兴趣的类后,可以使用以下命令查看关心的类的所
有方法,例如,对android.hardware.display.DisplayManager这个类感
兴趣
# android hooking list class_methods android.hardware.display.DisplayManager
⑤以上介绍的都是最基础的一些Java类相关的内容。在Android
中,正如笔者在第2章中介绍的,四大组件的相关内容是非常值得关注
的,Objection在这方面也提供了支持,可以通过以下命令列出进程所
有的activity(活动)。
# android hooking list activities
⑥可以通过以下命令列出进程所有的service。
# android hooking list services
需要列出其他两个组件的信息时,只要将对应的地方更换为
receivers和providers即可
Hook相关命令
通过以下命令对指定的方法进行Hook。
# android hooking watch class_method <methodName>
这里选择Java中File类的构造函数进行Hook
# android hooking watch class_method java.io.File.$init --dump-args --dunmp-backtrace --dump-return
我们加上了--dump-args、--dump-backtrace、--dump-return三个参数,分别用于打印函数的参数、调用栈以及返回值。这三个参数对逆向分析的帮助是非常大的:有些函数的明文和密文非常有可能放在参数和返回值中,而打印调用栈可以让分析者快速进行调用链的溯源。
需要注意的是,此时虽然只确定了Hook构造函数,但是默认会Hook对应方法的所有重载。同时,在输出的最后一行显示Registering job 887108,这表示这个Hook被作为一个“作业”添加到Objection的作业系统中了,此时运行job list命令可以查看到这个“作业”的相关信息,如图所示。可以发现这里的Job ID对应的是887108 ,同时Hooks对应的6正是Hook的函数的数量。
当我们在“设置”应用中的任意位置进行点击时,会发现
java.io.File.File(java.io.File, java.lang.String)这一个函数被调用
了。在Backtrace之后打印的调用栈中,可以清楚地看到这个构造函数
的调用来源,如图所示。注意,调用栈的顺序是从下至上的,根
据Arguments那一行会发现打开的文件路径
奇怪我点账号设置没反应。
测试结束后,可以根据“作业”的ID来删除“作业”,取消对这些
函数的Hook
# jobs kill <id>
除了可以直接Hook一个函数之外,Objection还可以通过执行如下
命令实现对指定类classname中所有函数的Hook(这里的所有函数并
不包括构造函数的Hook)。
# android hooking watch class <classname>
主动调用相关命令
①基于最简单的Java.choose的实现,在Frida脚本中,对实例的
搜索在Objection中是使用以下命令实现的:
# android heap search instances <classname>
②在Objection中调用实例方法的方式有两种。第一种是使用以下
命令调用实例方法:
# android heap execute <Handle> <methodname>
如果要执行带参数的函数,则需要先执行以下命令:
# android heap evaluate <Handle>
在进入一个迷你编辑器环境后,输入想要执行的脚本内容,确认编
辑完成,然后按Esc键退出编辑器,最后按回车键,即会开始执行这行
脚本并输出结果。这里的脚本内容和在编辑器中直接编写的脚本内容是
一样的(使用File类的canWrite()函数和setWritable()函数进行测
试)
补充在window下部署frida
https://github.com/frida/frida/releases
https://github.com/sensepost/objection
因为电脑上常用python3.10,所以没有选择特定frida版本
斗胆安装的最新的, 应该没什么问题,凑活着用
pip install frida -i https://mirrors.aliyun.com/pypi/simple/
pip install frida-tools -i https://mirrors.aliyun.com/pypi/simple/
pip install objection -i https://mirrors.aliyun.com/pypi/simple/
# 最新版本
frida-15.1.17
frida-tools-10.5.4
objection-1.11.0
虚拟机安装frida-server
adb push frida-server-15.1.17-android-arm64 /data/local/tmp
adb shell
vbox86p:/ # cd /data/local/tmp #genymotion方便的是默认root
vbox86p:/data/local/tmp # ls
frida-server-15.1.17-android-arm64 <
vbox86p:/data/local/tmp # chmod 777 frida-server-15.1.17-android-arm64
结果报错,安装x86的试试,没问题了,总结,虚拟机还是用的电脑cpu所以肯定是x86🤪
实战分析
未完待续.....