- dist/: 一键补丁脚本 + 验收 README + 分析文档 - pkg/: patch_binary(方案C)/ patch_dev_mode(方案A 备选) - 完整逆向分析文档(双副本结构、base91、RSA 材料、偏移速查)
59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
#!/usr/bin/env python3
|
||
"""方案A:开发态哨兵 —— 在已安装的 wxautox4/ui/ 下创建空 main.py。
|
||
|
||
ui/main.pyd 模块导入守卫的伪代码(静态逆向还原):
|
||
_d = dirname(__file__)
|
||
if exists(join(_d, 'main.py')): # 源码运行 → 跳过授权
|
||
pass
|
||
else:
|
||
try: nksa.lolic()
|
||
except WxautoLicenseError: print('>>> 未授权设备...'); sys.exit()
|
||
|
||
放一个空 main.py 即可让守卫认为"从源码运行"。
|
||
注意:Python 的 FileFinder 优先加载 .pyd,main.py 不会遮蔽 main.pyd,
|
||
只是让守卫的 exists() 探测翻转为 True —— 模块本体仍走编译版。
|
||
|
||
用法(Windows,Python 3.10):
|
||
python patch_dev_mode.py # 自动定位 site-packages
|
||
python patch_dev_mode.py --check # 只检查不改
|
||
"""
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
|
||
def find_pkg() -> Path:
|
||
try:
|
||
import wxautox4 # 目标包仅在 Windows 环境安装
|
||
except ImportError:
|
||
pass
|
||
else:
|
||
mod_file = getattr(wxautox4, "__file__", None)
|
||
if mod_file:
|
||
return Path(mod_file).parent
|
||
# 兜底:扫 sys.path
|
||
for p in map(Path, sys.path):
|
||
cand = p / "wxautox4" / "ui"
|
||
if cand.is_dir():
|
||
return cand.parent
|
||
sys.exit("未找到 wxautox4,请先 pip install wxautox4==41.1.1")
|
||
|
||
|
||
def main() -> None:
|
||
check_only = "--check" in sys.argv
|
||
ui_dir = find_pkg() / "ui"
|
||
sentinel = ui_dir / "main.py"
|
||
print(f"[+] 包目录: {ui_dir.parent}")
|
||
print(f"[+] 哨兵文件: {sentinel} 存在={sentinel.exists()}")
|
||
if check_only:
|
||
return
|
||
sentinel.write_text(
|
||
"# wxautox4 dev-mode sentinel — 守卫探测到本文件即视为源码运行,跳过授权校验\n",
|
||
encoding="utf-8",
|
||
)
|
||
print("[+] 已写入哨兵,重新 import wxautox4 验证:")
|
||
print(" python -c \"from wxautox4 import WeChat; print('guard passed')\"")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|