feat: v6 backend - explore_v6.py

This commit is contained in:
2026-05-18 21:16:48 +08:00
parent 79f479909d
commit bf5ef2b047

119
explore_v6.py Normal file
View File

@@ -0,0 +1,119 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""v6 探索脚本找到微信8.0.56真实类名和DB路径"""
import frida, time, json, subprocess
from datetime import datetime
PHONE_IP = "192.168.110.80"
FRIDA_PORT = 27042
ADB_SERIAL = "192.168.110.80:5555"
WECHAT_PID = 20745
BASE = "/Users/karuo/Documents/开发/2、私域银行/工作手机"
dm = frida.get_device_manager()
device = dm.add_remote_device(f"{PHONE_IP}:{FRIDA_PORT}")
session = device.attach(WECHAT_PID)
events = []
found_classes = {}
def on_msg(m, d):
if m.get("type") == "send":
p = m["payload"]
events.append(p)
t = p.get("type", "")
if t == "class_found":
cat = p.get("category", "")
name = p.get("name", "")
found_classes[cat] = name
print(f" 🎯 [{cat}] {name}")
elif t == "log":
print(f" [LOG] {p.get('msg', '')}")
elif t == "wcdb_insert":
print(f" [WCDB] {p.get('sql', '')[:60]} | stack: {p.get('stack', [])[:2]}")
elif t == "ready":
print(f"{p.get('msg', '')}")
with open(BASE + "/sdk/agent/hook/wechat_v6_backend.js", encoding="utf-8") as f:
src = f.read()
script = session.create_script(src)
script.on("message", on_msg)
script.load()
time.sleep(5)
rpc = script.exports_sync
print("\n" + "="*60)
print("v6 探索找关键类名和DB路径")
print("="*60)
# 1. 获取已找到的类
print("\n【已找到的类】")
r = rpc.get_found_classes()
print(json.dumps(r, ensure_ascii=False, indent=2))
# 2. 获取所有DB路径
print("\n【所有DB路径】")
r_db = rpc.get_all_db_paths()
for p in r_db.get("paths", []):
print(f" - {p}")
# 3. 在每个DB中查找SnsInfo表
print("\n【查找SnsInfo表】")
for db_path in r_db.get("paths", []):
r_sns = rpc.exec_in_db({
"db_path": db_path,
"sql": "SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '%Sns%'"
})
if r_sns.get("results"):
print(f" ✅ 找到SNS表: {db_path}")
for row in r_sns["results"]:
print(f" - {row}")
# 4. 枚举SNS包下的类
print("\n【枚举SNS包下的类前30个")
r_sns_classes = rpc.enum_package_classes({"pkg": "com.tencent.mm.plugin.sns"})
if r_sns_classes.get("classes"):
for c in r_sns_classes["classes"][:30]:
print(f" - {c}")
print(f" ... 共{r_sns_classes.get('count', 0)}个类")
# 5. 枚举chatting包下的类
print("\n【枚举chatting包下的类前20个")
r_chat_classes = rpc.enum_package_classes({"pkg": "com.tencent.mm.plugin.chatting"})
if r_chat_classes.get("classes"):
for c in r_chat_classes["classes"][:20]:
print(f" - {c}")
# 6. 枚举contact包下的类
print("\n【枚举contact包下的类前20个")
r_contact_classes = rpc.enum_package_classes({"pkg": "com.tencent.mm.plugin.contact"})
if r_contact_classes.get("classes"):
for c in r_contact_classes["classes"][:20]:
print(f" - {c}")
# 7. 枚举wallet包下的类
print("\n【枚举wallet包下的类前20个")
r_wallet_classes = rpc.enum_package_classes({"pkg": "com.tencent.mm.plugin.wallet"})
if r_wallet_classes.get("classes"):
for c in r_wallet_classes["classes"][:20]:
print(f" - {c}")
# 保存结果
output = {
"time": datetime.now().isoformat(),
"found_classes": found_classes,
"db_paths": r_db.get("paths", []),
"sns_classes": r_sns_classes.get("classes", []),
"chat_classes": r_chat_classes.get("classes", []),
"contact_classes": r_contact_classes.get("classes", []),
"wallet_classes": r_wallet_classes.get("classes", []),
"events": events
}
with open(BASE + "/explore_v6_results.json", "w", encoding="utf-8") as f:
json.dump(output, f, ensure_ascii=False, indent=2)
print(f"\n结果已保存: explore_v6_results.json")
try: script.unload()
except: pass
session.detach()