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

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;
    }
});

关键说明

  1. 替换占位内容:将脚本中的com.your.package.LoginActivity、com.your.package.R$id、控件ID、hint文本、用户名密码替换为应用实际值。
  2. 延迟时间调整:如果应用加载较慢,可适当增大setTimeout的延迟时间(如1000ms),确保控件完全初始化。
  3. 混淆处理:若应用开启混淆,需通过jadx等工具反编译确认LoginActivity的类名和控件ID的实际名称。

内容的提问来源于stack exchange,提问作者Sercan Yeniyurt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:52:22