feat: v6 backend - explore_v6.py
This commit is contained in:
119
explore_v6.py
Normal file
119
explore_v6.py
Normal 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()
|
||||
Reference in New Issue
Block a user