Frida Hook登录Activity异常求助:自动填充账号密码失败
解决方案:自动登录Frida脚本适配LoginActivity与TextInputEditText
一、解决LoginActivity未创建时执行代码的问题
首次运行脚本报错的核心原因是脚本启动时LoginActivity还未完成初始化,直接执行控件操作会找不到目标对象。解决方案是Hook LoginActivity的生命周期方法,在Activity完全就绪后再执行输入和点击逻辑:
核心思路
Hook LoginActivity的onResume方法(该方法在Activity首次创建完成后、从后台切回前台时都会触发),确保Activity和内部控件已经初始化完成后再执行操作。
二、适配TextInputEditText控件
TextInputEditText是EditText的子类,和普通EditText的操作逻辑一致,只需通过正确的方式找到控件实例即可。
完整Frida脚本示例
Java.perform(function() { // 替换为目标应用LoginActivity的完整类名(如com.example.app.LoginActivity) const LoginActivity = Java.use("com.your.package.LoginActivity"); // Hook onResume方法,确保Activity处于激活状态 LoginActivity.onResume.implementation = function() { // 先执行原onResume逻辑 this.onResume(); // 延迟500ms确保控件完全初始化(可根据应用加载速度调整) setTimeout(function() { Java.perform(function() { const activity = this; // 方式1:通过控件ID查找(推荐,需知道控件ID) // 替换为目标应用R.id对应的类名和控件ID const RId = Java.use("com.your.package.R$id"); const usernameEt = activity.findViewById(RId.username); const passwordEt = activity.findViewById(RId.password); const loginBtn = activity.findViewById(RId.login_btn); // 方式2:通过控件类型+hint文本查找(适用于不知道ID的情况) // const usernameEt = findTextInputEditText(activity, "请输入用户名"); // const passwordEt = findTextInputEditText(activity, "请输入密码"); // 设置用户名 if (usernameEt) { usernameEt.setText("your_target_username"); } // 设置密码 if (passwordEt) { passwordEt.setText("your_target_password"); } // 点击登录按钮 if (loginBtn) { loginBtn.performClick(); } }.bind(this)); }, 500); }; // 辅助函数:遍历控件树查找指定hint的TextInputEditText function findTextInputEditText(activity, hintText) { const rootView = activity.getWindow().getDecorView().getRootView(); let targetView = null; function traverseView(view) { const TextInputEditText = Java.use("google.android.material.textfield.TextInputEditText"); if (view instanceof TextInputEditText) { const hint = view.getHint().toString(); if (hint.includes(hintText)) { targetView = view; return; } } const ViewGroup = Java.use("android.view.ViewGroup"); if (view instanceof ViewGroup) { const childCount = view.getChildCount(); for (let i = 0; i < childCount; i++) { traverseView(view.getChildAt(i)); if (targetView) break; } } } traverseView(rootView); return targetView; } });
关键说明
- 替换占位内容:将脚本中的
com.your.package.LoginActivity、com.your.package.R$id、控件ID、hint文本、用户名密码替换为应用实际值。 - 延迟时间调整:如果应用加载较慢,可适当增大
setTimeout的延迟时间(如1000ms),确保控件完全初始化。 - 混淆处理:若应用开启混淆,需通过jadx等工具反编译确认LoginActivity的类名和控件ID的实际名称。
内容的提问来源于stack exchange,提问作者Sercan Yeniyurt
相关产品推荐
相关产品推荐

