第一次的Frida hook

admin 2025年6月1日17:40:28评论12 views字数 3820阅读12分44秒阅读模式
第一次的Frida hook

声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我会立即删除并致歉。谢谢

文章有疑问的,可以公众号发消息问我,或者留言。我每天都会看的。

第一次的Frida hook

字数 1272,阅读大约需 7 分钟

介绍

Android代码可以简单分为Java层和Native层的。
本文主要说明Java层的Frida相关操作。

如果了解过安卓开发,在一开始选择的时候,会有选择Java还是kotlin语言编写。这两者在代码层面表现形式有所区别,但即使是使用kotlin语言,最后还是会被编译器转换为Java字节码,在转换为smali代码。

因此,我们在使用反编译软件,比如jadx编译的时候,不管是Java还是kotlin都能正常的反编译。功能逻辑和流程是没问题。

编译流程对比

第一次的Frida hook
bc6f4766a588c91294a42748aac10b1d.png

同样的,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
第一次的Frida hook
91033c71db1b7e527d48546a9191071a.png

初次hook

安装apk:https://github.com/DERE-ad2001/Frida-Labs/blob/main/Frida%200x1/Challenge%200x1.apk

adb install xxx.apk
第一次的Frida hook
3f5bf8ed6042c95e5e55c9928cece3a4.png

启动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
第一次的Frida hook
e54c54fac6fb4fefe87dc3d77863d63f.png

APK介绍

输入数字,提示再次尝试

第一次的Frida hook
6028077e9bb465ecd9b9bad48f67e026.png

我们需要通过frida hook,让APK弹出flag

第一次的Frida hook
58926f2e07ce853f1d1f218185d032c6.png

通过下面的内容,将了解如何hook一个Java层方法,修改它的传入的参数值和返回值。

APK反编译

jadx反编译

查看包名与当前最顶层的Activity是哪一个

adb shell dumpsys window | grep CurrentFocus    // linux
adb shell dumpsys window | findstr CurrentFocus    // windows
第一次的Frida hook
4f5b0c8e5a9024fcebd41c702e1c3ada.png

可以看到是com.ad2001.frida0x1.MainActivity
在jadx的源代码中找到MainActivity来分析

第一次的Frida hook
d6ba62cd01f17b5840d0956ef742a403.png

onCreate方法

Activity 类的onCreate方法的主要功能是对 Activity 进行初始化,像设置布局、绑定数据等操作都会在此方法中完成。

第一次的Frida hook
93f06a1b04cc19ac7ec837a6e77693e7.png

APP监听到submit被点击时,从编辑框中获取字符串,将字符串转换为int类型。
如果转换成功,执行
MainActivity.this.check

第一次的Frida hook
64081c4a13a0057dc3adb3a229696164.png

要想得到最后的flag,需要让传入的参数满足下面的条件

(i * 2) + 4 == i2

其中i是随机的

第一次的Frida hook
5918e4c1fd9d39e464db8847d8c96714.png

jadx在方法上右键,可以直接复制为frida片段

第一次的Frida hook
b30896a0535be0cc04eb2434f1f7c261.png
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 hook
5f0fcf074bdee38e079c1916a953558f.png

frida执行下面的代码,如果是低版本的frida,后续要加 --no-pause

frida -U -f com.ad2001.frida0x1 -l test1.js

在编辑框中输入 666,点击submit

第一次的Frida hook
a1bfa7bdfd3266158a677a9f7cfe8bd3.png

i2是我们输入的内容,第一个参数是随机值,随机值可以看到这APP启动时就固定了,不会改变。
(i * 2) + 4 == i2
i2设置为156即可

第一次的Frida hook
b819dd6fc3dc306fb3a55b67fd7f1f61.png

那如果我们不想计算呢?
可以修改check参数传入的两个参数,将他们固定,令他们永远满足
(i * 2) + 4 == i2

设置i为1,i2为6

第一次的Frida hook
27f0cefe97dfac9bffac243b84d51e2f.png

此时,再次执行frida命令,输入任意值,提交即可

第一次的Frida hook
f704dd09045b70fadbbf9e5c6e292d75.png

上面我们是修改了check的传入参数,我们还可以修改get_random的返回值,令其为固定值

第一次的Frida hook
4abf45e681e8fdb1a337ffaf108e3dc0.png
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; // 修改此处
};
第一次的Frida hook
7014191214c8bd489c806c2b9014f4d7.png

免费知识星球,每日推送安全文章,欢迎加入。

第一次的Frida hook

原文始发于微信公众号(进击的HACK):第一次的Frida hook

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月1日17:40:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   第一次的Frida hookhttps://cn-sec.com/archives/4121057.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息