声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我会立即删除并致歉。谢谢!
文章有疑问的,可以公众号发消息问我,或者留言。我每天都会看的。
字数 1272,阅读大约需 7 分钟
介绍
Android代码可以简单分为Java层和Native层的。
本文主要说明Java层的Frida相关操作。
如果了解过安卓开发,在一开始选择的时候,会有选择Java还是kotlin语言编写。这两者在代码层面表现形式有所区别,但即使是使用kotlin语言,最后还是会被编译器转换为Java字节码,在转换为smali代码。
因此,我们在使用反编译软件,比如jadx编译的时候,不管是Java还是kotlin都能正常的反编译。功能逻辑和流程是没问题。
编译流程对比
同样的,Java 和 Kotlin 的语言差异本身不会影响 Hook 的基本原理。Frida的hook代码在大部分场合下都是通用的,特殊情况可能有所差异。
实战中如果遇到这部分差异,直接问AI大模型怎么解决就好了。
环境准备
本文使用的apk项目地址:https://github.com/DERE-ad2001/Frida-Labs
-
• 安卓真机 -
• Frida16 -
• jadx https://github.com/skylot/jadx -
• adb
adb安装
- 这个一般装过androidstudio系统中就有了。
- 推荐一个安卓投屏的项目:scrcpy https://github.com/Genymobile/scrcpy
- 这个项目中自带adb.exe。把adb.exe的目录添加到`环境变量`里就可以了。
frida安装
frida选择哪个版本?
根据你的安卓机是android版本选择。一般老的android版本,不适合用比较新的frida-server。
给出r0ysue大佬推荐的版本搭配:安卓78/frida12 、安卓10/frida14 、安卓12即以上/frida16
给出的是大版本,小版本的话,用小版本里最高的,如果用不了,再依次换小版本里之前出的。frida有时候不够稳定,多换几个版本尝试。
frida和frida-server的对应关系:
不一定非要版本号完全一致,一般大版本一样就可以用。如果使用中出现莫名其妙的报错,那就替换成一样的版本号。
python版本推荐3.8及以上,我用3.8居多
其中,frida 与 frida-tools 对应关系参考https://bbs.kanxue.com/thread-280436.htm
python安装指定版本的frida和frida-tools
pip install frida==x.x.x frida-tools==a.a.a -i https://pypi.tuna.tsinghua.edu.cn/simple
下载frida-server
访问链接 https://github.com/frida/frida/releases/tag/16.7.18
根据你在上一步安装的Frida版本,选择要下载哪个版本的frida-server,替换上述链接中的16.7.18
然后选择其中带android-arm64
的,如果确定你的手机是32位的,选择android-arm
的
查看Android架构类型
adb shell getprop ro.product.cpu.abi
初次hook
安装apk:https://github.com/DERE-ad2001/Frida-Labs/blob/main/Frida%200x1/Challenge%200x1.apk
adb install xxx.apk
启动frida-server
// 将frida-server推送到Android上
adb push frida-server /data/local/tmp/
adb shell
su
cd /data/local/tmp/
chmod +x frida-server
./frida-server
测试frida,执行下面的命令,查看检验
frida -U -f com.ad2001.frida0x1
APK介绍
输入数字,提示再次尝试
我们需要通过frida hook,让APK弹出flag
通过下面的内容,将了解如何hook一个Java层方法,修改它的传入的参数值和返回值。
APK反编译
jadx反编译
查看包名与当前最顶层的Activity是哪一个
adb shell dumpsys window | grep CurrentFocus // linux
adb shell dumpsys window | findstr CurrentFocus // windows
可以看到是com.ad2001.frida0x1.MainActivity
在jadx的源代码中找到MainActivity来分析
onCreate方法
Activity 类的onCreate方法的主要功能是对 Activity 进行初始化,像设置布局、绑定数据等操作都会在此方法中完成。
APP监听到submit被点击时,从编辑框中获取字符串,将字符串转换为int类型。
如果转换成功,执行
MainActivity.this.check
要想得到最后的flag,需要让传入的参数满足下面的条件
(i * 2) + 4 == i2
其中i是随机的
jadx在方法上右键,可以直接复制为frida片段
let MainActivity = Java.use("com.ad2001.frida0x1.MainActivity");
MainActivity["check"].implementation = function (i, i2) {
console.log(`MainActivity.check is called: i=${i}, i2=${i2}`);
this["check"](i, i2);
};
如果是高版本的frida,可以在下面代码里直接用。
Java.perform(function () {
代码
})
如果是低版本的,我们可以借助大模型,让他帮忙改
提示词:
你是一个安卓逆向工程师,将下面的frida代码修改为适合低版本frida用的代码
frida执行下面的代码,如果是低版本的frida,后续要加 --no-pause
frida -U -f com.ad2001.frida0x1 -l test1.js
在编辑框中输入 666,点击submit
i2是我们输入的内容,第一个参数是随机值,随机值可以看到这APP启动时就固定了,不会改变。(i * 2) + 4 == i2
i2设置为156即可
那如果我们不想计算呢?
可以修改check参数传入的两个参数,将他们固定,令他们永远满足(i * 2) + 4 == i2
设置i为1,i2为6
此时,再次执行frida命令,输入任意值,提交即可
上面我们是修改了check的传入参数,我们还可以修改get_random的返回值,令其为固定值
let MainActivity = Java.use("com.ad2001.frida0x1.MainActivity");
MainActivity["get_random"].implementation = function () {
console.log(`MainActivity.get_random is called`);
let result = this["get_random"]();
console.log(`MainActivity.get_random result=${result}`);
return 1; // 修改此处
};
免费知识星球,每日推送安全文章,欢迎加入。
原文始发于微信公众号(进击的HACK):第一次的Frida hook
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论