使用 frida hook Android app

Frida:

一种基于动态插装(dynamic instrumentation)技术的工具包,它主要是为测试人员、开发人员和逆向工程爱好者创建,在目标程序运行时,允许用户将 JavaScript代码注入其中,实现动态修改和调试。

支持修改多个平台的应用: Windows, macOS, GNU/Linux, iOS, watchOS, tvOS, Android, FreeBSD and QNX.

Github:frida/frida

frida 官方文档:frida doc


调试 Android app:

与同样出名的 Xposed 相比,Frida 不仅可以 Hook Java 层,同样支持 native 层。下面我们来具体操作:

1.安装 frida python 库:

复制代码
pip install frida-tools
pip install frida        #可通过 pip install frida == 版本号 安装最佳适配自己手机的版本

虽然 JavaScript是用来编写实际注入和修改逻辑的语言,但官方提供了 Python库来管理 javascript 脚本和提供执行环境。输入 frida --version ,出现版本号即安装成功。

复制代码
frida --version 
>>16.3.3

2. 手机端 adb 连接到电脑:

推荐使用无线 adb 调试,手机和电脑处在同一局域网,手机端进入开发者模式,打开无线调试,找到使用配对码配对:

电脑端打开命令窗口,输入 adb pair [手机ip:端口],回车后输入配对码完成配对。

输入 adb connect [手机ip:端口],完成连接,此端口为无线调试页面中显示的端口,并非配对端口。

复制代码
adb pair [手机ip:端口]  #例如:adb pair 192.168.31.7:35405 端口每次配对都会发生变化
adb connect [手机ip:另一端口] #例如:adb pair 192.168.31.7:40535 

3. 推送 frida-server 到手机:

访问 https://github.com/frida/frida/releases 下载安卓平台的 frida-server,解压出来。需注意 frida-server 与 frida 和 frida-tools 版本需要匹配,最好保持一致。

将解压出来的文件 push 到安卓 /data/local/tmp目录下面:

复制代码
adb push C:/Users/Administrator/Desktop/frida-server-16.3.3 /data/local/tmp/frida-server-16.3.3

进入 adb shell,进入 tmp 目录并赋予 frida-server 可执行权限,注意需要输入 su 获取 root 权限,否则无法访问文件目录。无误后输入 ./frida-server-16.3.3,未报错即运行成功。

复制代码
adb shell
su  
cd data/local/tmp
chmod 777 frida-server-16.3.3

#运行:
./frida-server-16.3.3

注意:新版本 frida-server 不再需要端口转发,旧版需要新开一个 CMD 窗口执行 adb forward tcp:27042 tcp:27042,来将手机端口转发到电脑端口,便于通信。


Hook 前的最后一步:

以 Android 平台为例,了解一下 frida 的工作流程:

  1. frida-server:运行在安卓端,与电脑端进行通信,接收电脑端的调试请求,并将 JavaScript 编写的 hook 代码注入到目标 app 中。
  2. 电脑端:与 frida-server 通信,可以使用多种编程语言编写脚本和管理注入过程,最常用的是 Python。
  3. JavaScript脚本:编写具体的注入和修改逻辑,并通过电脑端提供的环境被推送到 frida-server 中,从而注入到目标 app。

对此,我们需要建立两个文件,一个 hook.js用于存放具体的修改逻辑,一个 hook.py用于自动管理注入流程,如:在合适的时机自动注入。

hook.py:

复制代码
import frida
import sys
import time

# 应用包名
app_package_name = 'com.tencent.karaoke'

# 延迟注入时间(秒),防止dex未加载
delay_time = 2

# hook脚本所在路径
hookJs='C:/Users/Administrator/Desktop/hook.js'


def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    elif message['type'] == 'error':
        print("[!] {0}".format(message['stack']))

# 启动应用程序
device = frida.get_usb_device()
pid = device.spawn([app_package_name])
device.resume(pid)
time.sleep(1)  # 等待应用程序启动

# 延迟注入
print(f"Waiting for {delay_time} seconds before injecting script...")
time.sleep(delay_time)

# 注入脚本
with open(hookJs, 'r',encoding='utf-8') as f:
    script_code = f.read()

session = device.attach(pid)
script = session.create_script(script_code)
script.on('message', on_message)
script.load()
print("[*] Script injected successfully.")
sys.stdin.read()

hook.js 示例:

复制代码
// 1.从内存中寻找包含android字样的类并打印
Java.perform(function() {
    Java.enumerateLoadedClasses({
        onMatch: function(className) {
            if (className.includes('android')) {
                console.log(className);
            }
        },
        onComplete: function() {
            console.log('Class enumeration complete');
        }
    });
});

将应用包名修改为需要被 hook 的 app,然后输入命令运行:

复制代码
 python hook.py

开始 hook 吧!!!!

相关推荐
肖永威4 分钟前
Python 工程化实战:从目录结构到 VSCode 完美配置
vscode·python·python工程
用户41659673693559 分钟前
记一次深坑:RecyclerView + FlexboxLayoutManager 导致 canScrollVertically 误判的剖析与修复
android
不甜情歌15 分钟前
JS对象入门|从创建到原理,一篇吃透核心知识点
前端·javascript
Be for thing42 分钟前
Android 音频硬件(Codec / 喇叭 / 麦克风)原理 + 功耗与问题定位实战(手机 / 手表通用)
android·学习·智能手机·音视频
六元七角八分43 分钟前
学习笔记一《JavaScript基础语法》
javascript·笔记·学习
吉哥机顶盒刷机44 分钟前
S905L3A/L3AB芯片迎来安卓14新纪元:Sicha移植版固件深度评测与刷机指南
android·经验分享·刷机
smj2302_796826521 小时前
解决leetcode第3869题.统计区间内奇妙数的数目
python·算法·leetcode
一个天蝎座 白勺 程序猿1 小时前
KingbaseES数据库MySQL兼容性解析:从TCO账本到“傻瓜式“迁移的密码
android·数据库·mysql·kingbasees
Be for thing1 小时前
Android 存储硬件(RAM/UFS/eMMC)底层原理 + 性能 / 功耗测试实战
android·学习·智能硬件
CodeCraft Studio1 小时前
Parasoft C/C++嵌入式软件测试解决方案:安全、可靠且符合标准
开发语言·c++·安全·单元测试·代码规范·parasoft·嵌入式软件测试