使用Frida Hook Android应用onCreate()方法失败的技术求助
问题分析与修复方案
原脚本核心问题
- 递归死循环:原脚本中
this.onCreate.overload("android.os.Bundle").call(this,var_0)会重复调用重写后的onCreate方法,触发无限递归,导致Hook逻辑无法正常执行。 - 私有方法调用隐患:直接调用
this.unreachable()可能存在上下文绑定问题,私有方法的调用需要确保实例上下文正确。 - 权限缺失: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常见异常的捕获,明确提示错误原因。
额外注意事项
- 权限配置:
- 在应用
AndroidManifest.xml中添加权限声明:<uses-permission android:name="android.permission.READ_PHONE_STATE"/> - Android 6及以上版本需动态申请权限,可手动在应用设置中授予,或在Hook脚本中添加权限申请逻辑。
- 在应用
- Frida环境验证:
- 确保设备上Frida Server版本与本地Frida版本一致(均为15.2.2)。
- 若需Hook冷启动的
onCreate,可替换为spawn+resume方式启动应用。
- 结果验证:
- 使用
adb logcat | grep ID命令查看unreachable()方法的Log输出,确认方法是否成功调用。
- 使用
内容的提问来源于stack exchange,提问作者Saksham Jain
相关产品推荐
相关产品推荐

