README.md
Hermes WeChat SendMsg — LSPosed/Xposed Module
LSPosed 模块,目标 WeChat 8.0.72,用于绕过 ContentProvider 权限校验并暴露消息发送接口。
功能
- Auth Bypass — Hook
ExtContentProviderBase.h()和b(),使任意调用者通过权限校验 - AESUtil Bypass — 跳过联系人 ID 的加密/解密,直接使用明文 wxid
- 消息发送 — 外部应用通过 ContentProvider 写入发送请求,模块在 WeChat 主进程内通过广播接收并调用内部 NetSceneSendMsg API 发送
- 消息监控 — 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 本地编译
# 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 版)
- 确保 Magisk 已安装且 Zygisk 已启用(Magisk 设置 → Zygisk → 开)
- 下载 LSPosed Zygisk 版(或 Vector 2.0+)
- 在 Magisk 中安装 LSPosed 模块,重启手机
- 安装本模块 APK:
adb install app/build/outputs/apk/release/app-release.apk - 打开 LSPosed Manager → 模块 → 启用 HermesWeChatSendMsg
- 作用域中选择 微信(com.tencent.mm)
- 强行停止微信,重新打开
使用
模块安装并启用后,可通过 adb shell content 命令与模块交互。
发送文本消息
adb shell content insert \
--uri content://com.hermes.wechat.xposed.provider/send \
--bind toUser:s:filehelper \
--bind content:s:"你好,这是测试消息"
字段说明:
toUser— 接收者 wxid(如wxid_xxxxxx、filehelper)或群聊 IDcontent— 消息内容
查询发送状态
adb shell content query \
--uri content://com.hermes.wechat.xposed.provider/status
返回 pending 或 true/false。
查看模块日志
adb logcat -s HermesWX:D LSPosed-Bridge:D | grep HermesWX
或查看 Vector/LSPosed 日志:
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 |
安全提示
- 本模块仅用于个人设备上的自动化测试和学习研究
- 微信账号存在被封风险,建议在测试用小号上操作