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

使用Frida Hook Android应用onCreate()方法失败的技术求助

问题分析与修复方案

原脚本核心问题

  1. 递归死循环:原脚本中this.onCreate.overload("android.os.Bundle").call(this,var_0)会重复调用重写后的onCreate方法,触发无限递归,导致Hook逻辑无法正常执行。
  2. 私有方法调用隐患:直接调用this.unreachable()可能存在上下文绑定问题,私有方法的调用需要确保实例上下文正确。
  3. 权限缺失:Android 9中调用getDeviceId()需要READ_PHONE_STATE权限,若应用未声明或未授予该权限,会抛出异常导致方法执行失败。

修正后的Frida脚本

Python端代码

import frida
import sys

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

jscode = """
Java.perform(function() {
    console.log("[*] Starting hook...");
    var TargetActivity = Java.use("com.example.UnreachableCode");
    
    // 重写onCreate方法
    TargetActivity.onCreate.overload("android.os.Bundle").implementation = function(bundle) {
        // 调用父类onCreate实现,避免递归
        this.$super.onCreate(bundle);
        console.log("[+] onCreate executed, calling unreachable()...");
        
        try {
            // 显式绑定上下文调用私有方法
            this.unreachable.call(this);
            console.log("[+] unreachable() called successfully");
        } catch (e) {
            console.log("[-] Failed to call unreachable(): " + e.message);
        }
    };
    
    send("Hook installed successfully");
});
"""

try:
    # 连接USB设备并附加到目标应用,增加超时避免连接失败
    device = frida.get_usb_device(1000)
    session = device.attach('com.example')
    script = session.create_script(jscode)
    script.on('message', on_message)
    print("[*] Loading script...")
    script.load()
    sys.stdin.read()
except frida.ServerNotRunningError:
    print("[-] Frida server not running on device")
except frida.DeviceNotFoundError:
    print("[-] No USB device found")
except frida.ProcessNotFoundError:
    print("[-] Target app not running or package name incorrect")
except KeyboardInterrupt:
    print("\n[!] Exiting...")

关键修正说明

  • 避免递归:使用this.$super.onCreate(bundle)调用父类的onCreate方法,替代原脚本中触发递归的call方式。
  • 安全调用私有方法:通过this.unreachable.call(this)确保私有方法在当前实例的上下文中执行。
  • 异常捕获:增加try-catch块捕获调用私有方法时的异常,便于排查权限不足等问题。
  • 增强错误处理:Python端增加多种Frida常见异常的捕获,明确提示错误原因。

额外注意事项

  1. 权限配置:
    • 在应用AndroidManifest.xml中添加权限声明:<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    • Android 6及以上版本需动态申请权限,可手动在应用设置中授予,或在Hook脚本中添加权限申请逻辑。
  2. Frida环境验证:
    • 确保设备上Frida Server版本与本地Frida版本一致(均为15.2.2)。
    • 若需Hook冷启动的onCreate,可替换为spawn+resume方式启动应用。
  3. 结果验证:
    • 使用adb logcat | grep ID命令查看unreachable()方法的Log输出,确认方法是否成功调用。

内容的提问来源于stack exchange,提问作者Saksham Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:10:34