""" Hook Executor v3.0 — 将 unified API 动作映射到 Frida rpc.exports 调用 职责: - 接收 unified 指令(send_message / get_contacts / add_friend / …) - 通过 FridaManager.call_rpc 调用微信内部函数 - Hook 失败时降级到 ADB/u2 通道 对接: - 服务端 unified.py → WebSocket 下发 → Agent → HookExecutor - 或 ADB 模式:unified.py → HookExecutor(本地 Frida) 支持 110 个操作 / 24 模块,与 wechat_hook_v3.0.js rpc.exports 一一对应 """ import logging from typing import Dict, Any from .frida_manager import FridaManager logger = logging.getLogger(__name__) ACTION_TO_RPC: Dict[str, str] = { # ── H17 消息发送 ── "send_message": "sendMessage", "send_group_message": "sendGroupMessage", # ── H15 消息获取 ── "get_messages": "getMessages", "get_recent_messages": "getRecentMessages", "search_messages": "searchMessages", # ── H16 联系人 ── "get_contacts": "getContacts", "get_contact_info": "getContactInfo", "search_contacts": "searchContacts", # ── H18/H19 好友管理 ── "add_friend": "addFriend", "accept_friend": "acceptFriend", "delete_friend": "deleteFriend", "set_friend_remark": "setFriendRemark", "get_friend_requests": "getFriendRequests", # ── H22 群管理 ── "get_groups": "getGroups", "get_group_info": "getGroupInfo", "get_group_members": "getGroupMembers", "create_group": "createGroup", "invite_to_group": "inviteToGroup", "remove_from_group": "removeFromGroup", "set_group_announcement": "setGroupAnnouncement", "set_group_name": "setGroupName", "quit_group": "quitGroup", # ── H20/H21 朋友圈 ── "post_moments": "postMoments", "get_moments": "getMoments", "like_moments": "likeMoments", "comment_moments": "commentMoments", "delete_moments": "deleteMoments", # ── H23 账号管理 ── "get_profile": "getProfile", "check_account_status": "checkAccountStatus", "set_nickname": "setNickname", "set_signature": "setSignature", "set_avatar": "setAvatar", "set_sex": "setSex", "set_region": "setRegion", "set_whats_up": "setWhatUp", # ── H24 账号安全 ── "unblock_self": "unblockSelf", "change_password": "changePassword", "bind_phone": "bindPhone", "unbind_phone": "unbindPhone", "get_login_devices": "getLoginDevices", "remove_login_device": "removeLoginDevice", "enable_fingerprint": "enableFingerprint", "set_account_protection": "setAccountProtection", # ── H25 支付 ── "send_red_packet": "sendRedPacket", "receive_red_packet": "receiveRedPacket", "send_transfer": "sendTransfer", "receive_transfer": "receiveTransfer", "get_wallet_balance": "getWalletBalance", "get_transaction_history": "getTransactionHistory", # ── H26 二维码 ── "scan_qr_code": "scanQrCode", "generate_my_qr_code": "generateMyQrCode", "generate_group_qr_code": "generateGroupQrCode", "add_friend_by_qr": "addFriendByQr", # ── H27 视频号 ── "browse_channels": "browseChannels", "like_channel_video": "likeChannelVideo", "comment_channel_video": "commentChannelVideo", "follow_channel": "followChannel", "unfollow_channel": "unfollowChannel", "share_channel_video": "shareChannelVideo", # ── H28 标签 ── "get_labels": "getLabels", "create_label": "createLabel", "delete_label": "deleteLabel", "set_contact_label": "setContactLabel", "get_contacts_by_label": "getContactsByLabel", # ── H29 收藏 ── "get_favorites": "getFavorites", "add_favorite": "addFavorite", "delete_favorite": "deleteFavorite", # ── H30 设置 ── "set_privacy": "setPrivacy", "set_notification": "setNotification", "clear_chat_history": "clearChatHistory", "set_chat_background": "setChatBackground", "set_do_not_disturb": "setDoNotDisturb", "pin_chat": "pinChat", # ── H31 搜索 ── "global_search": "globalSearch", # ── H32 小程序 ── "open_mini_program": "openMiniProgram", "get_recent_mini_programs": "getRecentMiniPrograms", "share_mini_program": "shareMiniProgram", # ── H33 文件传输 ── "send_image": "sendImage", "send_video": "sendVideo", "send_file": "sendFile", "send_voice": "sendVoice", "send_location": "sendLocation", "send_card": "sendCard", "send_link": "sendLink", # ── H34 消息转发 ── "forward_message": "forwardMessage", "forward_multiple": "forwardMultiple", "revoke_message": "revokeMessage", # ── H35 注册/登录 ── "register_account": "registerAccount", "login_by_password": "loginByPassword", "login_by_sms": "loginBySms", "logout": "logout", "switch_account": "switchAccount", "auto_register": "autoRegister", "check_login_state": "checkLoginState", "get_sim_phone": "getSimPhone", # ── H36 公众号 ── "get_official_accounts": "getOfficialAccounts", "follow_official_account": "followOfficialAccount", "unfollow_official_account": "unfollowOfficialAccount", "get_official_account_articles": "getOfficialAccountArticles", # ── H37 表情 ── "send_emoji": "sendEmoji", "add_custom_emoji": "addCustomEmoji", # ── H38 浮窗 ── "add_to_float": "addToFloat", "remove_from_float": "removeFromFloat", # ── H39 设备信息 ── "get_device_info": "getDeviceInfo", "get_storage_info": "getStorageInfo", "get_network_info": "getNetworkInfo", # ── 系统 ── "get_hook_status": "getHookStatus", "get_process_info": "getProcessInfo", "get_wechat_version": "getWechatVersion", "batch_execute": "batchExecute", } MODULE_NAMES = { "H15": "消息接收", "H16": "联系人", "H17": "消息发送", "H18": "好友请求", "H19": "好友管理", "H20": "朋友圈发布", "H21": "朋友圈浏览", "H22": "群管理", "H23": "账号管理", "H24": "账号安全", "H25": "支付", "H26": "二维码", "H27": "视频号", "H28": "标签", "H29": "收藏", "H30": "设置", "H31": "搜索", "H32": "小程序", "H33": "文件传输", "H34": "消息转发", "H35": "注册/登录", "H36": "公众号", "H37": "表情", "H38": "浮窗", "H39": "设备信息", } class HookExecutor: """将 unified 动作转为 Frida RPC 调用 — 110 个操作全覆盖""" def __init__(self, frida_mgr: FridaManager): self.frida = frida_mgr @property def available(self) -> bool: return self.frida.connected def execute(self, action: str, params: Dict[str, Any] = None) -> Dict[str, Any]: if not self.available: return {"success": False, "error": "Hook 通道不可用(Frida 未连接)", "channel": "hook"} rpc_method = ACTION_TO_RPC.get(action) if not rpc_method: return {"success": False, "error": f"Hook 不支持该动作: {action}", "channel": "hook"} logger.info(f"[HookExecutor] {action} → rpc.{rpc_method}") result = self.frida.call_rpc(rpc_method, params or {}) result["channel"] = "hook" return result def supports(self, action: str) -> bool: return action in ACTION_TO_RPC def get_supported_actions(self) -> list: return sorted(ACTION_TO_RPC.keys()) def get_status(self) -> Dict[str, Any]: return { "available": self.available, "total_actions": len(ACTION_TO_RPC), "supported_actions": self.get_supported_actions(), "modules": MODULE_NAMES, "frida": self.frida.get_status(), }