Name Last Update
..
.gradle Loading commit data...
app Loading commit data...
gradle/wrapper Loading commit data...
README.md Loading commit data...
build.gradle Loading commit data...
gradlew Loading commit data...
hermes-debug.keystore Loading commit data...
settings.gradle Loading commit data...

README.md

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 本地编译

# 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 版(或 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 命令与模块交互。

发送文本消息

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 — 消息内容

查询发送状态

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

安全提示

  • 本模块仅用于个人设备上的自动化测试和学习研究
  • 微信账号存在被封风险,建议在测试用小号上操作