#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import sys import re import struct import argparse import logging import javaobj from pyquery import PyQuery from pysqlcipher3 import dbapi2 as sqlite from hashlib import md5 from wechat.common.procutil import subproc_succ, subproc_call logger = logging.getLogger("wechat") RES_DIR = "/mnt/sdcard/tencent/MicroMsg" MM_DIR = "/data/data/com.tencent.mm" def get_uin(): candidates = [] try: uin = None out = subproc_succ(f"adb shell cat {MM_DIR}/shared_prefs/system_config_prefs.xml") for line in out.decode('utf-8').split("\n"): if "default_uin" in line: line = PyQuery(line) uin = line.attr["value"] break uin = int(uin) except Exception: logger.warning("uin not found in system_config_prefs.xml") else: candidates.append(uin) logger.info(f"found uin={uin} in system_config_prefs.xml") try: uin = None out = subproc_succ(f"adb shell cat {MM_DIR}/shared_prefs/com.tencent.mm_preferences.xml") for line in out.decode('utf-8').split("\n"): if "last_login_uin" in line: line = PyQuery(line) uin = line.text() break uin = int(uin) except Exception: logger.warning("uin not found in com.tencent.mm_preferences.xml") else: candidates.append(uin) logger.info(f"found uin={uin} in com.tencent.mm_preferences.xml") try: uin = None out = subproc_succ(f"adb shell cat {MM_DIR}/shared_prefs/auth_info_key_prefs.xml") for line in out.decode('utf-8').split("\n"): if "auth_uin" in line: line = PyQuery(line) uin = line.attr["value"] break uin = int(uin) except Exception: logger.warning("uin not found in auth_info_key_prefs.xml") else: candidates.append(uin) logger.info(f"found uin={uin} in auth_info_key_prefs.xml") try: out = subproc_succ(f"adb shell cat {MM_DIR}/MicroMsg/systemInfo.cfg") uin = javaobj.loads(out).get(1, 0) except: logger.warning("default uin not found in systemInfo.cfg") else: candidates.append(uin) logger.info(f"found uin={uin} in systemInfo.cfg") candidates = list({x for x in candidates if x != 0}) logger.info(f"Possible uin: {candidates}") return candidates def get_imei(): candidates = [] class Parcel(object): # https://gist.github.com/ktnr74/60ac7bcc2cd17b43f2cb def __init__(self, text): if text.startswith(b'Result: Parcel(') and text.endswith(b'\')'): self.data = b''.join([struct.pack('