Files

75 lines
3.3 KiB
Python

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 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:
logging.error(f"Lỗi khi chạy lệnh: {full_cmd}")
logging.error(e.stderr)
return None
def scan_zalo_databases():
# Kiểm tra xem có quyền Root không (su)
test_root = run_adb_command("su -c 'echo root_ok'")
if test_root != "root_ok":
logging.error("Thiết bị chưa được cấp quyền Root cho ADB, hoặc không nhận lệnh su!")
return
logging.info("1. Đang liệt kê các file database của Zalo...")
zalo_db_path = "/data/data/com.zing.zalo/databases"
# Liệt kê các file .db
files_output = run_adb_command(f"su -c 'ls -l {zalo_db_path}'")
logging.info(f"Các file trong {zalo_db_path}:\n{files_output}\n")
# Tìm kiếm các file .db chính xác
db_list = run_adb_command(f"su -c 'ls {zalo_db_path}/*.db'")
if not db_list:
logging.error("Không tìm thấy file .db nào của Zalo!")
return
db_files = db_list.split('\n')
logging.info(f"Đã tìm thấy {len(db_files)} file database. Đang phân tích các bảng (tables)...")
# Mở file để ghi schema
with open("zalo_schema_dump.txt", "w", encoding="utf-8") as f:
f.write("=== DUMP CẤU TRÚC DATABASE ZALO ===\n")
# Duyệt qua từng DB và lấy cấu trúc bảng
for db in db_files:
db = db.strip()
if not db: continue
logging.info(f"\n--- Phân tích File: {db} ---")
# Sử dụng sqlite3 có sẵn trên Android để liệt kê bảng
tables = run_adb_command(f"su -c 'sqlite3 {db} \".tables\"'")
if tables:
logging.info(f"Các bảng trong {db}:")
logging.info(tables)
# Nếu thấy bảng có vẻ giống tin nhắn (như messages, chat, msg...)
if "msg" in tables.lower() or "chat" in tables.lower() or "message" in tables.lower():
logging.info(f"-> PHÁT HIỆN DB TIỀM NĂNG: {db}. Đang trích xuất cấu trúc...")
schema = run_adb_command(f"su -c 'sqlite3 {db} \".schema\"'")
with open("zalo_schema_dump.txt", "a", encoding="utf-8") as f:
f.write(f"\n--- Schema của {db} ---\n")
f.write(schema if schema else "Không thể đọc schema")
logging.info(f"Đã lưu schema của {db} vào file zalo_schema_dump.txt")
else:
logging.warning(f"Không thể đọc bảng từ {db} (Có thể bị khóa hoặc mã hóa)")
if __name__ == "__main__":
logging.info("BẮT ĐẦU QUÉT DATABASE ZALO")
# Đảm bảo kết nối ADB tới máy giả lập/điện thoại
subprocess.run("adb connect 10.160.138.2:5555", shell=True, capture_output=True)
scan_zalo_databases()
logging.info("Hoàn tất quét! Hãy kiểm tra file zalo_schema_dump.txt (nếu có)")