# Hermes WeChat SendMsg — LSPosed/Xposed Module LSPosed 模块,目标 WeChat 8.0.72,用于绕过 ContentProvider 权限校验并暴露消息发送接口。 ## 功能 1. **Auth Bypass** — Hook `ExtContentProviderBase.h()` 和 `b()`,使任意调用者通过权限校验 2. **AESUtil Bypass** — 跳过联系人 ID 的加密/解密,直接使用明文 wxid 3. **消息发送** — 外部应用通过 ContentProvider 写入发送请求,模块在 WeChat 主进程内通过广播接收并调用内部 NetSceneSendMsg API 发送 4. **消息监控** — Hook `MsgInfo.setContent()`,将收发消息实时记录到日志 ## 项目结构 ``` lsposed-wechat-sendmsg/ ├── app/build.gradle # App 模块构建配置 ├── app/src/main/ │ ├── AndroidManifest.xml # 模块声明 + Provider 暴露 │ ├── assets/xposed_init # 模块入口类名 │ └── java/com/hermes/wechat/xposed/ │ ├── HermesWeChatModule.java # Xposed 入口:Hook + 广播接收器 │ └── HermesWeChatProvider.java # ContentProvider:外部 API ``` ## 编译 ### Mac 本地编译 ```bash # 1. 安装 Java(如尚未安装) brew install openjdk@17 export JAVA_HOME=/opt/homebrew/opt/openjdk@17 # 2. 安装 Android SDK mkdir -p ~/android-sdk/cmdline-tools cd ~/android-sdk/cmdline-tools curl -O https://dl.google.com/android/repository/commandlinetools-mac-11076708_latest.zip unzip commandlinetools-mac-11076708_latest.zip mv cmdline-tools latest export ANDROID_HOME=~/android-sdk export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin # 3. 接受许可并安装必要组件 yes | sdkmanager --licenses sdkmanager "platform-tools" "build-tools;34.0.0" "platforms;android-34" # 4. 编译 APK cd lsposed-wechat-sendmsg export ANDROID_HOME=~/android-sdk ./gradlew assembleRelease # 输出:app/build/outputs/apk/release/app-release-unsigned.apk # 签名: keytool -genkey -v -keystore hermes-debug.keystore -alias hermes -keyalg RSA -keysize 2048 -validity 10000 -storepass hermes123 -keypass hermes123 -dname "CN=Hermes" $ANDROID_HOME/build-tools/34.0.0/apksigner sign --ks hermes-debug.keystore --ks-pass pass:hermes123 --key-pass pass:hermes123 --in app/build/outputs/apk/release/app-release-unsigned.apk --out app/build/outputs/apk/release/app-release.apk ``` ## 安装 ### 前提:LSPosed 框架(Zygisk 版) 1. 确保 Magisk 已安装且 **Zygisk 已启用**(Magisk 设置 → Zygisk → 开) 2. 下载 [LSPosed Zygisk 版](https://github.com/JingMatrix/LSPosed/releases)(或 Vector 2.0+) 3. 在 Magisk 中安装 LSPosed 模块,重启手机 4. 安装本模块 APK:`adb install app/build/outputs/apk/release/app-release.apk` 5. 打开 LSPosed Manager → 模块 → 启用 HermesWeChatSendMsg 6. **作用域**中选择 **微信(com.tencent.mm)** 7. 强行停止微信,重新打开 ## 使用 模块安装并启用后,可通过 `adb shell content` 命令与模块交互。 ### 发送文本消息 ```bash adb shell content insert \ --uri content://com.hermes.wechat.xposed.provider/send \ --bind toUser:s:filehelper \ --bind content:s:"你好,这是测试消息" ``` 字段说明: - `toUser` — 接收者 wxid(如 `wxid_xxxxxx`、`filehelper`)或群聊 ID - `content` — 消息内容 ### 查询发送状态 ```bash adb shell content query \ --uri content://com.hermes.wechat.xposed.provider/status ``` 返回 `pending` 或 `true`/`false`。 ### 查看模块日志 ```bash adb logcat -s HermesWX:D LSPosed-Bridge:D | grep HermesWX ``` 或查看 Vector/LSPosed 日志: ```bash adb shell su -c "cat /data/adb/lspd/log/verbose_*.log | grep HermesWX | tail -20" ``` ## 技术细节 ### 跨进程通信 模块代码运行在 **WeChat 主进程** 中(通过 LSPosed 注入),ContentProvider 运行在 **模块 APK 自身进程** 中。两者通过 Android 广播通信: ``` hermes / adb shell content → 模块 Provider 进程 → 发送广播 (com.hermes.wechat.SEND_MSG) ↓ WeChat 主进程(注入的模块) ↓ 广播接收器 → NetSceneSendMsg 内部 API ↓ 微信服务器 ``` ### Hook 点 | 目标类 | 方法 | 作用 | |--------|------|------| | `ExtContentProviderBase` | `h()` → return 1 | 绕过 appId + UID + 签名校验 | | `ExtContentProviderBase` | `b()` → return true | 绕过登录状态检查 | | `AESUtil` | `b(long)` → 返回原值 | 跳过加密,明文传递 wxid | | `AESUtil` | `a(String)` → 返回原值 | 跳过解密 | | `MsgInfo` (f9) | `c1(String)` | 监控消息内容变更,记录日志 | ### 内部发消息调用链 ``` u01.r1.a(String toUser) → Builder Builder.e(String content) → 设置文本内容 Builder.h(int type) → 设置联系人类型 (0=普通) Builder.a() → u01.m1 (Result) m1.a() → 提交网络请求(必须在主线程调用) ``` 类名 `u01.*` 随 WeChat 版本变化,需通过 smali 分析确认。 ## 故障排查 | 现象 | 可能原因 | 解决 | |------|---------|------| | `content insert` 无响应 | 广播未注册(WeChat 未启动或模块未启用) | 检查 logcat 中 `Send broadcast receiver registered` | | `Send result: false` | 内部 API 调用失败(类名不匹配或不在主线程) | 检查日志中的具体错误,确认 WeChat 版本 | | `m1.a() return type` 异常 | WeChat 版本升级后混淆类名变化 | 重新反编译 APK,更新 `CLS_SEND_MSG_FACTORY` 等常量 | | 模块未出现在 LSPosed Manager | APK 未正确安装或签名问题 | 重新安装模块 APK | ## 安全提示 - 本模块仅用于个人设备上的自动化测试和学习研究 - 微信账号存在被封风险,建议在测试用小号上操作