|
|
本帖最后由 黄金 于 2026-7-12 21:42 编辑
import subprocess, sys, re
from collections import defaultdict
def run(cmd):
return subprocess.run(cmd, capture_output=True, text=True, timeout=30)
# 1. 获取所有包 + UID
print("[1] 获取所有包 UID 列表...")
rp = run(["pm", "list", "packages", "-U"])
if rp.returncode != 0:
print("ERROR:", rp.stderr)
sys.exit(1)
uid_pkgs = defaultdict(list)
for line in rp.stdout.strip().splitlines():
line = line.strip()
if not line.startswith("package:"):
continue
m = re.match(r'package:(\S+)\s+uid:(\S+)', line)
if m:
uid_pkgs[m.group(2)].append(m.group(1))
# 2. 只保留有共享的 UID(>=2 个包)
shared = {uid: pkgs for uid, pkgs in uid_pkgs.items() if len(pkgs) >= 2}
if not shared:
print("没有找到共享 UID 的包")
sys.exit(0)
print(f"找到 {len(shared)} 个共享 UID 组,共 {sum(len(v) for v in shared.values())} 个包")
# print(f"只需查询 {len(shared)} 次 dumpsip(每组查一个代表包)")
print()
# 3. 每组只查第一个包
uid_suid = {} # uid -> su_name
for uid, pkgs in sorted(shared.items()):
rep = pkgs[0] # 代表包
# sys.stdout.write(f" 查 {uid}: {rep} ... ")
# sys.stdout.flush()
rd = run(["dumpsys", "package", rep])
su_name = ""
if rd.returncode == 0:
for ln in rd.stdout.splitlines():
if "sharedUser=" in ln:
m2 = re.search(r'SharedUserSetting\{[^ ]* ([^/]+)/', ln)
if m2:
su_name = m2.group(1)
else:
m2 = re.search(r'SharedUserSetting\{[^}]* ([^}]+)\}', ln)
if m2:
su_name = m2.group(1)
break
uid_suid[uid] = su_name
print(f"-> {su_name or '(无sharedUserId/单包UID)'}")
print("\n" + "=" * 60)
print(" sharedUserId 分组结果")
print("=" * 60)
# 按 sharedUserId 聚合
su_groups = defaultdict(list) # su_name -> [(uid, pkgs...)]
for uid, pkgs in sorted(shared.items()):
su = uid_suid.get(uid, "")
key = su if su else f"(UID {uid} 共享但未查到 sharedUserId)"
su_groups[key].append((uid, pkgs))
idx = 0
for su_name in sorted(su_groups.keys()):
items = su_groups[su_name]
idx += 1
total_pkgs = sum(len(pkgs) for _, pkgs in items)
uids = [uid for uid, _ in items]
print(f"\n{idx}. sharedUserId = \"{su_name}\"")
print(f" UID: {', '.join(uids)} | 包数: {total_pkgs}")
for uid, pkgs in items:
for p in pkgs:
print(f" -> {p}")
print()
print("=" * 60)
print(f" 完成,共 {len(shared)} 组,{sum(len(v) for v in shared.values())} 个包")
这个是编译好的c,适合没有root的设备,adb权限也能看
https://www.lanzoub.com/iv1WJ3w1yjkf
让ai给我搓了个可以查看有哪些应用占了哪些shareuid的小脚本 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|