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

