feat: add script to pull and analyze Zalo SQLite database files via ADB
This commit is contained in:
@@ -0,0 +1,74 @@
|
|||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sqlite3
|
||||||
|
import logging
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
|
||||||
|
|
||||||
|
def run_adb_command(command: str):
|
||||||
|
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 analyze_specific_db(db_path):
|
||||||
|
filename = os.path.basename(db_path)
|
||||||
|
logging.info(f"Đang kéo file {filename} về server...")
|
||||||
|
|
||||||
|
# Copy DB ra thư mục temp trên android
|
||||||
|
run_adb_command(f"su -c 'cp {db_path} /sdcard/temp_{filename}'")
|
||||||
|
run_adb_command(f"su -c 'chmod 666 /sdcard/temp_{filename}'")
|
||||||
|
|
||||||
|
# Pull về server armbian
|
||||||
|
subprocess.run(f"adb -s 192.168.1.193:5555 pull /sdcard/temp_{filename} .", shell=True, capture_output=True)
|
||||||
|
run_adb_command(f"su -c 'rm /sdcard/temp_{filename}'")
|
||||||
|
|
||||||
|
if os.path.exists(filename):
|
||||||
|
logging.info(f"Đã lấy được {filename}. Đang đọc cấu trúc SQLite...")
|
||||||
|
try:
|
||||||
|
conn = sqlite3.connect(filename)
|
||||||
|
cursor = conn.cursor()
|
||||||
|
|
||||||
|
# Liệt kê các bảng
|
||||||
|
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
|
||||||
|
tables = [t[0] for t in cursor.fetchall()]
|
||||||
|
logging.info(f"Các bảng trong DB: {tables}")
|
||||||
|
|
||||||
|
# Tìm bảng chat
|
||||||
|
chat_table = None
|
||||||
|
for t in ["chat", "messages", "msg", "chat_msg"]:
|
||||||
|
if t in tables:
|
||||||
|
chat_table = t
|
||||||
|
break
|
||||||
|
|
||||||
|
if not chat_table and tables:
|
||||||
|
chat_table = tables[0] # lấy đại bảng đầu tiên nếu không thấy tên quen thuộc
|
||||||
|
|
||||||
|
if chat_table:
|
||||||
|
logging.info(f"Phát hiện bảng tin nhắn: {chat_table}")
|
||||||
|
cursor.execute(f"PRAGMA table_info({chat_table});")
|
||||||
|
cols = cursor.fetchall()
|
||||||
|
logging.info(f"Cấu trúc bảng {chat_table}:")
|
||||||
|
for col in cols:
|
||||||
|
logging.info(f" - {col[1]} ({col[2]})")
|
||||||
|
|
||||||
|
# In thử 3 tin nhắn mới nhất
|
||||||
|
logging.info(f"--- 3 tin nhắn mới nhất trong bảng {chat_table} ---")
|
||||||
|
try:
|
||||||
|
cursor.execute(f"SELECT * FROM {chat_table} ORDER BY _rowid_ DESC LIMIT 3;")
|
||||||
|
rows = cursor.fetchall()
|
||||||
|
for r in rows:
|
||||||
|
logging.info(str(r)[:200] + "...")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Lỗi khi đọc dữ liệu: {e}")
|
||||||
|
conn.close()
|
||||||
|
logging.info(f"Xong file {filename}!\n")
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Lỗi SQLite: {e}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
analyze_specific_db("/data/data/com.zing.zalo/databases/154819133/group_677752884_ext.db")
|
||||||
|
analyze_specific_db("/data/data/com.zing.zalo/databases/154819133/group_576776374.db")
|
||||||
|
analyze_specific_db("/data/data/com.zing.zalo/databases/154819133/group_662037447.db")
|
||||||
Reference in New Issue
Block a user