🛫 系列文章导航
- 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950
- 【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446
- 【Frida】【Android】03_RPC https://blog.csdn.net/kinghzking/article/details/137050967
- 【Frida】【Android】04_Objection安装和使用 https://blog.csdn.net/kinghzking/article/details/137071768
- 【Frida】【Android】05_Objection实战 https://blog.csdn.net/kinghzking/article/details/137071826
▒ 目录 ▒
- 🛫 系列文章导航
- 开发环境
- 1️⃣ 环境准备
- 安装apk
- 启动frida-server等
- 启动Junior的计算器
- 2️⃣ Objection实战
- 启动objection
- 获得计算器Activity类
- Hook 目标CalculatorActivity类
- Hook 目标CalculatorActivity类方法caculate
- jadx查看`calculate`方法实现
- Hook `Arith.add`方法
- 关于修改参数和返回值的说明
- 【失败】主动调用`Arith.add`方法
- 🛬 文章小结
- 📖 参考资料
开发环境
版本号 | 描述 | |
---|---|---|
文章日期 | 2024-03-24 | |
操作系统 | Win11 - 22H2 | 22621.2715 |
node -v | v20.10.0 | |
npm -v | 10.2.3 | |
夜神模拟器 | 7.0.5.8 | |
Android | 9 | |
python | 3.9.9 | |
frida | 16.2.1 | |
frida-tools | 12.3.0 | |
objection | 1.11.0 | |
1️⃣ 环境准备
安装apk
下面以样例程序Junior.apk为例(样本来自于《Android Studio开发实战:从零基础到App上线(第2版)》一书中的Junior样例,源代码在https://github.com/aqi00/android2上)。
也可以通过https://download.csdn.net/download/kinghzking/89045465下载获得。
也可以在gitcode.com地址 https://gitcode.com/android8/AndroidFridaBeginnersBook中找到。
直接将apk拖拽到模拟器中,会提示安装失败。
通过命令adb install junior.apk
安装会显示出报错信息:Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]
。
这是因为,Android Studio 3.0之后,在打包生成debug apk时,在apk的manifest文件的application标签里自动添加 android:testOnly="true"属性。
可以通过增加-t
方式安装:adb install -t junior.apk
启动frida-server等
REM # 开启logcat
start cmd /k "adb logcat && PAUSE"
REM # 端口映射
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
REM # 重启frida-server
start cmd /k adb shell pkill -9 fs64
ping 127.0.0.1 -n 2
start cmd /k adb shell /data/local/tmp/fs64 -l 0.0.0.0:27042
启动Junior的计算器
本小节将根据Junior应用重点计算器界面进行讲解。
- 打开junior:
- 如上图,打开“简单计算器”:
2️⃣ Objection实战
启动objection
经过第一小节的步骤,我们直接执行下面命令即可启动objection:
objection -g com.example.junior explore
获得计算器Activity类
- 方案一:
adb shell dumpsys window | findstr mCurrentFocus
- 方案二:
adb shell dumpsys activity activities | findstr ActivityRecord
显示的比较多,根据这些类猜测一个。
- 方案三:
android hooking list activities
上面三种方案,可以依此尝试,最终,我们可以确定目标类为:
com.example.junior.CalculatorActivity
。
Hook 目标CalculatorActivity类
执行命令:
android hooking watch class com.example.junior.CalculatorActivity
在界面上输入
1+1=
,
将打印如下内容:
不难看出,等号最终调用了caculate
方法。
Hook 目标CalculatorActivity类方法caculate
为了查看更多的信息,我们Hook
caculate
方法,打印参数、返回值、堆栈。
android hooking watch class_method com.example.junior.CalculatorActivity.caculate --dump-args --dump-backtrace --dump-return
在界面上输入
1+1=
,将打印如下内容:
从中可以看出,的确是onclick调用了calculate
方法。
jadx查看calculate
方法实现
通过jadx查看
calculate
方法实现,如下图:
我们可以看出,最终调用了Arith.add
方法。
Hook Arith.add
方法
执行下面命令,Hook
Arith.add
方法:
android hooking watch class_method com.example.junior.util.Arith.add --dump-args --dump-backtrace --dump-return
在界面上输入
1+1=
,将打印如下内容:
关于修改参数和返回值的说明
Objection只有一个
android hooking set return_value
命令可以修改返回值,而且只能将返回值改为true或者false。
所以,想修改参数和返回值,请使用
frida
命令!!!
【失败】主动调用Arith.add
方法
由于
com.example.junior.util.Arith.add
是静态(static)方法,无法使用objection调用。
目前只知道通过heap获取实例对象,然后通过android heap
命令执行非静态方法。
如有其它objection命令或者插件可以实现,欢迎留言。
这里记录下frida的方式吧。
Java.perform(function(){
var Arith = Java.use('com.example.junior.util.Arith')
var JavaString = Java.use('java.lang.String')
var result = Arith.sub(JavaString.$new("123"),JavaString.$new("111"))
console.log("123 - 111 =",result)
})
🛬 文章小结
本节通过实例演示objection的使用,算是对上一节《【Frida】【Android】04_Objection安装和使用 https://blog.csdn.net/kinghzking/article/details/137071768》的验证。
总的来说,逆向过程中,
- Objection起到
辅助定位
的作用。- 分析完成后,可以通过frida脚本修改参数、主动调用,
完成具体的功能
。- 最后可以通过python和ipc实现完整的应用。
📖 参考资料
- 《安卓Frida逆向与抓包实战》
- 【Frida】 00_简单介绍和使用 https://blog.csdn.net/kinghzking/article/details/123225580
- 本节源码地址 https://gitcode.com/android8/AndroidFridaBeginnersBook
ps: 文章中内容仅用于技术交流,请勿用于违规违法行为。