From 46398a7dd164d450d57028299f50d6eb600f0074 Mon Sep 17 00:00:00 2001 From: Victor Phan Date: Thu, 23 Jul 2026 22:47:11 +0700 Subject: [PATCH] feat: add script to locate and extract Zalo group database files via ADB --- serverPython/zalo_find_group.py | 64 +++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 serverPython/zalo_find_group.py diff --git a/serverPython/zalo_find_group.py b/serverPython/zalo_find_group.py new file mode 100644 index 0000000..cf3a830 --- /dev/null +++ b/serverPython/zalo_find_group.py @@ -0,0 +1,64 @@ +import os +import subprocess +import logging + +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +def run_adb_command(command: str): + """Chạy lệnh ADB shell và trả về kết quả""" + full_cmd = f"adb -s 192.168.1.193:5555 shell {command}" + try: + result = subprocess.run(full_cmd, shell=True, check=True, capture_output=True, text=True) + return result.stdout.strip() + except subprocess.CalledProcessError as e: + return None + +def find_group(): + target_id = "7173734528992370154" + zalo_db_path = "/data/data/com.zing.zalo/databases" + + logging.info(f"Đang tìm kiếm Group ID {target_id} trong {zalo_db_path}...") + + # Dùng lệnh find để tìm kiếm đệ quy + output = run_adb_command(f"su -c 'find {zalo_db_path} -name \"*{target_id}*\"'") + + if output: + logging.info("TÌM THẤY! Kết quả:") + logging.info(output) + + # Nếu tìm thấy DB, thử trích xuất về + for path in output.split('\n'): + if path.endswith('.db'): + logging.info(f"Đang kéo DB {path} về...") + filename = os.path.basename(path) + + run_adb_command(f"su -c 'cp {path} /sdcard/temp_{filename}'") + run_adb_command(f"su -c 'chmod 666 /sdcard/temp_{filename}'") + subprocess.run(f"adb -s 192.168.1.193:5555 pull /sdcard/temp_{filename} .", shell=True) + run_adb_command(f"su -c 'rm /sdcard/temp_{filename}'") + logging.info(f"Đã lưu file: {filename}") + break + else: + logging.warning(f"Không tìm thấy file nào chứa {target_id}. Có thể Zalo lưu tin nhắn trong 1 file DB chung.") + + # Nếu không tìm thấy file riêng, thử tìm chuỗi ID này bên trong các DB lớn + logging.info("Đang dò tìm chuỗi ID bên trong các file DB chung (quá trình này mất khoảng 1 phút)...") + # Quét các thư mục UID + uid_folders_out = run_adb_command(f"su -c 'ls -l {zalo_db_path}'") + uid_folders = [line.split()[-1] for line in uid_folders_out.split('\n') if line.startswith('d') and line.split()[-1].isdigit()] + + for uid in uid_folders: + logging.info(f"Đang quét UID: {uid}...") + # Dùng grep để tìm chuỗi trong file nhị phân + grep_out = run_adb_command(f"su -c 'grep -r -a \"{target_id}\" {zalo_db_path}/{uid}/'") + if grep_out: + logging.info(f"-> PHÁT HIỆN: Chuỗi ID {target_id} tồn tại bên trong các file thuộc UID {uid}!") + # In ra 5 dòng đầu tiên chứa kết quả để phỏng đoán tên file DB + for line in grep_out.split('\n')[:5]: + logging.info(" " + line[:100] + "...") + + logging.info("Vui lòng gửi lại cho tôi những dòng log trên để tôi xác định đúng file DB chứa tin nhắn!") + return + +if __name__ == "__main__": + find_group()