You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Frida无法Hook Android方法:onBackPressed无日志输出求助

问题描述

尝试Hook一款无源码APK的posteitaliane.posteapp.appposteid.home.HomeAct.onBackPressed()方法(该方法触发退出确认弹窗),编写Frida脚本期望打印调用日志,但触发返回操作时弹窗正常显示,控制台无日志输出。

Hook脚本(script_hook.js):

Java.perform(function() {
    var homeActClass = Java.use("posteitaliane.posteapp.appposteid.home.HomeAct");
    homeActClass.onBackPressed.implementation = function(){
        console.log("[ + ] onBackPressed called! ");
        this.onBackPressed(); //Call the original function
    }
});

Frida启动脚本:

import frida, sys

with open("script_hook.js") as f:
        jscode = f.read()
process = frida.get_usb_device().attach('PosteID')
script = process.create_script(jscode)
print('[ * ] Attaching to PosteID application...')
script.load()
sys.stdin.read()
排查与解决方案

1. 确认Frida附加的是正确包名

frida.get_usb_device().attach('PosteID')中的PosteID是应用显示名称,Frida需要的是应用包名。获取包名的方式:

  • 执行adb shell dumpsys window | grep mCurrentFocus查看当前页面的包名/类名
  • 执行adb shell pm list packages | grep poste筛选应用包名

将attach参数替换为正确包名,例如包名为posteitaliane.posteapp.appposteid,修改Python脚本:

process = frida.get_usb_device().attach('posteitaliane.posteapp.appposteid')

2. 显式指定方法重载并添加异常捕获

如果onBackPressed存在重载方法,直接赋值implementation可能无法命中无参目标方法。可以显式指定重载,并添加异常捕获确认类/方法是否存在:

Java.perform(function() {
    try {
        var homeActClass = Java.use("posteitaliane.posteapp.appposteid.home.HomeAct");
        console.log("[ * ] Successfully loaded HomeAct class");
        
        var targetMethod = homeActClass.onBackPressed.overload();
        console.log("[ * ] Found target onBackPressed method");
        
        targetMethod.implementation = function(){
            console.log("[ + ] onBackPressed called! ");
            this.onBackPressed();
        }
    } catch (e) {
        console.error("[ - ] Error: " + e.message);
    }
});

3. 配置Frida日志回调

默认情况下,Frida脚本中的console.log输出需要通过Python脚本的消息回调才能显示在控制台。修改Python脚本添加日志处理:

import frida, sys

def on_message(message, data):
    if message['type'] == 'send':
        print(f"[LOG] {message['payload']}")
    elif message['type'] == 'error':
        print(f"[ERROR] {message['stack']}")

with open("script_hook.js") as f:
        jscode = f.read()
# 替换为正确包名
process = frida.get_usb_device().attach('posteitaliane.posteapp.appposteid')
script = process.create_script(jscode)
script.on('message', on_message)  # 添加消息回调
print('[ * ] Attaching to PosteID application...')
script.load()
sys.stdin.read()

4. 检查应用是否为多进程

如果HomeAct运行在独立进程中,当前Frida附加的主进程无法Hook到目标方法。确认方式:

  • 执行adb shell ps | grep poste查看应用的所有进程
  • 用frida -U -l script_hook.js -n <进程名>尝试附加到对应进程

5. 验证运行时类名是否正确

反编译dex中的类名可能因混淆或编译差异与运行时不一致。用Frida枚举当前加载的类确认:

Java.perform(function() {
    Java.enumerateLoadedClasses({
        onMatch: function(className) {
            if (className.includes("home")) {
                console.log("[LOADED CLASS] " + className);
            }
        },
        onComplete: function() {
            console.log("[ * ] Class enumeration complete");
        }
    });
});

运行脚本后,查看是否存在posteitaliane.posteapp.appposteid.home.HomeAct,若不存在则修正类名。

6. 确认返回操作的实际处理方法

部分应用会通过onKeyDown处理返回键,而非直接调用onBackPressed。HookonKeyDown验证:

Java.perform(function() {
    var homeActClass = Java.use("posteitaliane.posteapp.appposteid.home.HomeAct");
    homeActClass.onKeyDown.overload('int', 'android.view.KeyEvent').implementation = function(keyCode, event){
        console.log("[ + ] onKeyDown called, keyCode: " + keyCode);
        return this.onKeyDown(keyCode, event);
    }
});

若返回键触发该方法日志,说明应用通过onKeyDown处理返回逻辑,需调整Hook目标。


内容的提问来源于stack exchange,提问作者Federico Chiesa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:16:02