From 5a2b9076c40572831d75512337686cdac39f9671 Mon Sep 17 00:00:00 2001 From: H3CoF6 <1707889225@qq.com> Date: Wed, 29 Apr 2026 01:55:59 +0800 Subject: [PATCH] =?UTF-8?q?fix(wx=5Fkey):=20=E5=88=A0=E6=8E=89=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=8E=92=E5=BA=8F=E8=8E=B7=E5=8F=96=E4=B8=BBpid?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91=EF=BC=8C=E5=BC=BA=E5=88=B6=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=9B=B4=E7=A8=B3=E5=AE=9A=E7=9A=84=E6=9C=80=E7=9F=AD?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E8=A1=8C=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/wechat_decrypt_tool/key_service.py | 56 ++++++++++++++++---------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/src/wechat_decrypt_tool/key_service.py b/src/wechat_decrypt_tool/key_service.py index 84ffcf3..d9b7a4a 100644 --- a/src/wechat_decrypt_tool/key_service.py +++ b/src/wechat_decrypt_tool/key_service.py @@ -51,10 +51,10 @@ def _summarize_key_payload(payload: Optional[Dict[str, Any]]) -> Dict[str, Any]: def _resolve_wxid_dir_for_image_key( - account: Optional[str] = None, - *, - wxid_dir: Optional[str] = None, - db_storage_path: Optional[str] = None, + account: Optional[str] = None, + *, + wxid_dir: Optional[str] = None, + db_storage_path: Optional[str] = None, ) -> Path: explicit_wxid_dir = str(wxid_dir or "").strip() if explicit_wxid_dir: @@ -193,15 +193,26 @@ class WeChatKeyFetcher: process = subprocess.Popen(normalized_exe_path) time.sleep(2) candidates = [] - target_process_name = Path(normalized_exe_path).name.lower() - for proc in psutil.process_iter(['pid', 'name', 'create_time']): - proc_name = str(proc.info.get('name') or "").strip().lower() - if proc_name == target_process_name or self._is_wechat_process(proc_name): - candidates.append(proc) + + for proc in psutil.process_iter(['pid', 'name', 'exe', 'cmdline']): + try: + p_name = proc.info.get('name') + if p_name and p_name.lower() in self.process_names: + cmdline_list = proc.info.get('cmdline') or [] + cmdline_str = " ".join(cmdline_list).lower() + + if any(target.lower() in cmdline_str for target in WECHAT_EXECUTABLE_NAMES): + candidates.append({ + "pid": proc.info['pid'], + "cmd_len": len(cmdline_str) + }) + except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): + continue if candidates: - candidates.sort(key=lambda x: x.info['create_time'], reverse=True) - target_pid = candidates[0].info['pid'] + # 选择命令行最短的一个作为主进程 + main_proc = min(candidates, key=lambda x: x['cmd_len']) + target_pid = main_proc["pid"] return target_pid return process.pid @@ -275,6 +286,7 @@ class WeChatKeyFetcher: "db_key": found_db_key } + def get_db_key_workflow(wechat_install_path: Optional[str] = None): fetcher = WeChatKeyFetcher() return fetcher.fetch_db_key(wechat_install_path=wechat_install_path) @@ -295,13 +307,13 @@ def try_get_local_image_keys() -> List[Dict[str, Any]]: if wx_key is None or not hasattr(wx_key, 'get_image_key'): logger.info("[image_key] 本地算法不可用:wx_key.get_image_key 缺失") return [] - + try: res_json = wx_key.get_image_key() if not res_json: logger.info("[image_key] 本地算法返回空结果") return [] - + data = json.loads(res_json) accounts = data.get('accounts', []) results = [] @@ -329,10 +341,10 @@ def try_get_local_image_keys() -> List[Dict[str, Any]]: async def get_image_key_integrated_workflow( - account: Optional[str] = None, - *, - wxid_dir: Optional[str] = None, - db_storage_path: Optional[str] = None, + account: Optional[str] = None, + *, + wxid_dir: Optional[str] = None, + db_storage_path: Optional[str] = None, ) -> Dict[str, Any]: """ 集成图片密钥获取流程: @@ -341,7 +353,7 @@ async def get_image_key_integrated_workflow( """ # 1. 尝试本地提取 local_keys = try_get_local_image_keys() - + target_account_wxid = None if account or wxid_dir or db_storage_path: try: @@ -409,10 +421,10 @@ async def get_image_key_integrated_workflow( async def fetch_and_save_remote_keys( - account: Optional[str] = None, - *, - wxid_dir: Optional[str] = None, - db_storage_path: Optional[str] = None, + account: Optional[str] = None, + *, + wxid_dir: Optional[str] = None, + db_storage_path: Optional[str] = None, ) -> Dict[str, Any]: wx_id_dir = _resolve_wxid_dir_for_image_key( account,