10.安卓逆向2-frida hook技术-frida基本使用-frida指令(用于hook)

发布于:2025-06-01 ⋅ 阅读:(26) ⋅ 点赞:(0)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:图灵Python学院

工具下载:

链接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwd=zy89

提取码:zy89

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:9.安卓逆向2-frida hook技术-frida基本使用-frida-ps指令

frida的hook主要是学习下图红框的参数,也并不需要全部学习,常用的就那几个

-U

使用usb线连接

frida -U

-f

指令app包名

-p

使用app的pid

-l

加载 hook脚本

-o

把脚本输出的信息保存到文件中

frida两种操作模式

cli命令行,javascript脚本注入进程

rpc,Python进行javascript脚本注入

frida两种操作app的方式

spwan模式,不管app运不运行它都会重启,然后注入,它的注入比较早,就是可以拦截app启动时执行的代码

attach模式,给一个正在运行的app进行注入,也就是说只有app运行了它才能进行注入,它比较晚,app启动时的代码没办法拦截(运行之后才注入怎么可能拦截启动时的代码)

到底是用spwan模式还是attach模式,-f指定包名 使用spwan模式,加了-f就会使用spwan模式,加-F使用attach模式

frida脚本都是使用JavaScript语言编写,它有个固定格式

Java.perform(function () {

});

首先启动一下手机里的 frida-server

attach模式注入脚本 frida -UF -l .\FridaHook初体验.js

Java.perform(function () {
    // 获取当前应用的上下文
    var currentApplication = Java.use('android.app.ActivityThread').currentApplication();
    var context = currentApplication.getApplicationContext();
    // 获取包名
    var packageName = context.getPackageName();
    // 输出包名
    console.log("当前应用的包名是: " + packageName);
    send(packageName)
});

直接写exit然后按回车键(Enter键)退出hook

使用Python启动脚本

核心是通过 frida.get_usb_device()获取frida功能

然后使用device.get_process("com.xxx.frodo").pid 获取app进程id

然后写JavaScript的hook脚本

js_cpde = '''
Java.perform(function () {
 // 获取当前应用的上下文
 var currentApplication = Java.use('android.app.ActivityThread').currentApplication();
 var context = currentApplication.getApplicationContext();
 // 获取包名
 var packageName = context.getPackageName();
 // 输出包名
 console.log("当前应用的包名是: " + packageName);
});
'''

然后使用 session.create_script(js_cpde) 加载脚本

然后使用 script.load() 把脚本注入到app中并执行脚本

spwan模式

指令 frida -Uf com.XXX.frodo -l .\FridaHook初体验.js

执行了上面的指令后会卡主,然后输入 %resume让app继续运行

Python使用spwan模式,,主要修改了下图红框的两行代码

# -*- coding: utf-8 -*-
import frida
import sys

def on_message(message, data):
    print("message", message)
    print("data", data)

# 通过Spawn模式启动一个新的应用程序进程,并在该进程中加载Frida脚本
device = frida.get_usb_device()

pid = device.spawn(["com.trs.xxxx.xxx"])
# 恢复应用程序的执行
device.resume(pid)

session = device.attach(pid)

js_cpde = '''
Java.perform(function () {
    // 获取当前应用的上下文
    var currentApplication = Java.use('android.app.ActivityThread').currentApplication();
    var context = currentApplication.getApplicationContext();
    // 获取包名
    var packageName = context.getPackageName();
    // 输出包名
    console.log("当前应用的包名是: " + packageName);
    send(packageName)
});
'''

script = session.create_script(js_cpde)
# 设置监听
script.on("message", on_message)
script.load()
# 阻塞主线程,以保持脚本运行
sys.stdin.read()

还有如下图红框

使用 script.on("message", on_message)设置监听message消息,然后通过 send(packageName)的send函数触发on_message函数,这样就可以在Python代码中获取JavaScript里的数据

frida远程模式,一般不使用,它有点麻烦

首先使用把刚刚启动的frida-server按CTRL+C进行退出,然后使用 ./frida-server-14.2.18-android-arm64 -l 0.0.0.0:8881指定frida-server的端口为8881启动

然后使用 adb forward tcp:8881 tcp:8881 指令映射端口(或者理解为开启端口)

然后这时的客户端指令,不是-U使用-H了,别的没变化

Python使用frida的远程模式

# -*- coding: utf-8 -*-

import frida, sys

jsCode = """
Java.perform(function () {
    // 获取当前应用的上下文
    var currentApplication = Java.use('android.app.ActivityThread').currentApplication();
    var context = currentApplication.getApplicationContext();
    // 获取包名
    var packageName = context.getPackageName();
    // 输出包名
    console.log("当前应用的包名是: " + packageName);
});
"""

def message(message, data):
    if message['type'] == 'send':
        print(f"[*] {message['payload']}")
    else:
        print(message)

# 远程连接服务端
device = frida.get_device_manager().add_remote_device('127.0.0.1:8881')
# 附着到已运行的应用
process = device.attach('com.trs.xxx.newsclient')
script = process.create_script(jsCode)
script.on("message",message)
script.load()

img