一个现代化的微信PC版Hook工具,采用C++17开发,通过DLL注入方式实现对微信消息的实时捕获和控制。
- 🎯 双Hook模式 - 支持硬件断点和软件断点两种Hook方式
- 📡 实时消息捕获 - 自动拦截并转发所有微信消息到Webhook
- 🌐 完整HTTP API - 提供RESTful API控制微信发送消息
- 📤 多种消息类型 - 支持文本、图片、文件、XML、表情、富文本、拍一拍
- 👥 联系人管理 - 获取微信联系人列表和详细信息
- 🔄 异步架构 - 基于asio的异步消息处理,不阻塞微信主线程
- 🗑️ 智能去重 - 自动去重机制,避免重复消息
- 📝 高性能日志 - 基于spdlog的结构化日志系统
- 🌐 浏览器控制 - 主动打开微信内置浏览器并加载指定URL
- ⚙️ 灵活配置 - JSON配置文件,支持运行时配置
所有收到的微信消息会自动实时推送到配置的Webhook地址,包括:
| 消息类型 | Type值 | 说明 |
|---|---|---|
| 文本消息 | 1 | 普通文字消息 |
| 图片消息 | 3 | 图片文件 |
| 语音消息 | 34 | 语音文件 |
| 视频消息 | 43 | 视频文件 |
| 动画表情 | 47 | GIF/表情 |
| 链接/文件/小程序 | 49 | 包含XML数据 |
| 系统消息 | 10000 | 系统通知 |
推送格式:
{
"is_self": false,
"is_group": true,
"type": 1,
"ts": 1234567890,
"id": 123456789012345,
"sender": "wxid_xxx",
"roomid": "xxx@chatroom",
"content": "消息内容",
"xml": "<xml>...</xml>",
"moreInfo": "扩展信息"
}通过HTTP API主动发送各种类型的消息。
- 获取当前登录用户信息(微信ID、昵称、手机号等)
- 检查登录状态
- 获取完整联系人列表
- 包含微信ID、昵称、备注、微信号、性别、地区等信息
- 主动在微信中打开内置浏览器
- 支持HTTP/HTTPS网页、公众号文章、微信内部页面
| 接口 | 方法 | 说明 |
|---|---|---|
/health |
GET | 健康检查 |
/shutdown |
GET | 关闭服务(需要令牌) |
| 接口 | 方法 | 说明 |
|---|---|---|
/userinfo |
GET | 获取个人信息 |
/login_status |
GET | 检查登录状态 |
响应示例:
{
"code": 200,
"msg": "success",
"data": {
"wxid": "wxid_xxxxx",
"name": "昵称",
"mobile": "13800138000",
"home": "C:\\Users\\xxx\\Documents\\WeChat Files\\wxid_xxx",
"alias": "微信号"
}
}| 接口 | 方法 | 说明 |
|---|---|---|
/contacts |
GET | 获取联系人列表 |
响应示例:
{
"code": 200,
"msg": "success",
"data": {
"count": 100,
"contacts": [
{
"wxid": "wxid_xxx",
"code": "微信号",
"remark": "备注",
"name": "昵称",
"country": "中国",
"province": "广东",
"city": "深圳",
"gender": 1,
"avatar": "头像URL",
"cover": "背景图URL",
"extra": ["其他信息"]
}
]
}
}POST /send_message
Content-Type: application/json
{
"wxid": "接收者微信ID或群ID",
"msg": "消息内容"
}POST /send/image
Content-Type: application/json
{
"wxid": "接收者微信ID",
"path": "C:\\path\\to\\image.jpg"
}POST /send/file
Content-Type: application/json
{
"wxid": "接收者微信ID",
"path": "C:\\path\\to\\file.pdf"
}POST /send/xml
Content-Type: application/json
{
"receiver": "接收者微信ID",
"xml": "<msg>XML内容</msg>",
"path": "缩略图路径(可选)",
"type": 33
}type说明:
33(0x21) - 链接消息8192(0x2000) - 小程序消息
POST /send/emotion
Content-Type: application/json
{
"wxid": "接收者微信ID",
"path": "C:\\path\\to\\emotion.gif"
}POST /send/richtext
Content-Type: application/json
{
"receiver": "接收者微信ID",
"title": "标题",
"url": "https://example.com",
"thumburl": "缩略图URL(可选)",
"digest": "摘要(可选)",
"account": "公众号账号(可选)",
"name": "公众号名称(可选)"
}POST /send/pat
Content-Type: application/json
{
"roomid": "群聊ID",
"wxid": "被拍用户的微信ID"
}POST /open_browser
Content-Type: application/json
{
"url": "https://www.example.com"
}POST /api/browser/open
Content-Type: application/json
{
"url": "https://www.example.com",
"show": true
}POST /api/browser/check支持的URL类型:
- HTTP/HTTPS网页
- 公众号文章:
https://mp.weixin.qq.com/s/xxx - 微信内部页面:
weixin://resourceid/xxx
- Windows 10/11 (x64)
- Visual Studio 2019+ 或 CLion
- vcpkg 包管理器
- 微信PC版 3.9.12.51
使用vcpkg安装所有依赖:
vcpkg install nlohmann-json:x64-windows-static
vcpkg install cpr:x64-windows-static
vcpkg install crow:x64-windows-static
vcpkg install asio:x64-windows-static
vcpkg install spdlog:x64-windows-static# 配置CMake
cmake -DCMAKE_TOOLCHAIN_FILE="<VCPKG_ROOT>/scripts/buildsystems/vcpkg.cmake" ^
-DVCPKG_TARGET_TRIPLET=x64-windows-static ^
-B build
# 编译
cmake --build build --config Release在DLL同目录创建 wechat_hook_config.json:
{
"web": {
"bind": "127.0.0.1",
"port": 8080,
"shutdown_token": "your_secret_token"
},
"sender": {
"webhook_url": "http://localhost:3000/webhook",
"http_timeout_ms": 5000
},
"hook": {
"use_software_breakpoint": false,
"dedup_window_sec": 2,
"show_console": false,
"auto_hide_console": false,
"enable_wechat_log_hook": false,
"wechat_log_to_console": false,
"wechat_log_prefix": "[WeChat]",
"enable_browser_hook": false,
"browser_block_ads": false
}
}使用提供的注入工具将 WeChatHook.dll 注入到微信进程:
# 使用ModernInjector(推荐)
inject\ModernInjector.exe
# 或使用RemoteDll64
inject\RemoteDll64.exe注入成功后,HTTP服务会自动启动:
# 健康检查
curl http://localhost:8080/health
# 获取个人信息
curl http://localhost:8080/userinfo
# 发送消息
curl -X POST http://localhost:8080/send_message \
-H "Content-Type: application/json" \
-d "{\"wxid\":\"filehelper\",\"msg\":\"Hello World\"}"| 配置项 | 说明 | 默认值 |
|---|---|---|
web.bind |
HTTP服务器绑定地址 | 127.0.0.1 |
web.port |
HTTP服务器端口 | 8080 |
web.shutdown_token |
关闭服务的令牌 | "" (空=不鉴权) |
| 配置项 | 说明 | 默认值 |
|---|---|---|
sender.webhook_url |
消息转发目标URL | http://localhost:3000/webhook |
sender.http_timeout_ms |
HTTP请求超时时间(毫秒) | 5000 |
| 配置项 | 说明 | 默认值 | 推荐值 |
|---|---|---|---|
hook.use_software_breakpoint |
是否使用软件断点 | true | false |
hook.dedup_window_sec |
消息去重时间窗口(秒) | 2 | 1-5 |
hook.show_console |
是否显示控制台 | false | false |
hook.auto_hide_console |
是否自动隐藏控制台 | false | false |
| 配置项 | 说明 | 默认值 |
|---|---|---|
hook.enable_wechat_log_hook |
启用微信日志Hook | false |
hook.wechat_log_to_console |
微信日志输出到控制台 | false |
hook.wechat_log_prefix |
微信日志前缀 | [WeChat] |
hook.enable_browser_hook |
启用浏览器Hook | false |
hook.browser_block_ads |
自动拦截广告链接 | false |
WeChatHook/
├── include/ # 头文件
│ ├── config/ # 配置管理
│ ├── contact/ # 联系人管理
│ ├── hook/ # Hook实现
│ ├── message/ # 消息发送
│ ├── transport/ # 传输层
│ ├── util/ # 工具类
│ │ ├── WeChatHelper.h # 微信辅助工具
│ │ ├── WebHelper.h # Web辅助工具
│ │ ├── Encoding.h # 字符编码转换
│ │ ├── Logger.h # 日志系统
│ │ └── Offsets.h # 内存偏移量
│ └── web/ # Web服务
├── src/ # 源文件
│ ├── config/
│ ├── contact/
│ ├── hook/
│ ├── message/
│ ├── transport/
│ ├── util/
│ ├── web/
│ ├── dllmain.cpp # DLL入口
│ └── receive.cpp # 消息接收处理
├── inject/ # DLL注入工具
├── config/ # 配置文件示例
└── CMakeLists.txt # CMake构建脚本
- Hook技术: 硬件断点(调试寄存器)和软件断点(INT3)
- 异步I/O: 基于asio的异步消息处理
- HTTP服务: Crow框架提供RESTful API
- 日志系统: spdlog高性能日志
- JSON处理: nlohmann/json
- HTTP客户端: cpr (libcurl封装)
微信消息函数
↓ (Hook拦截)
消息解析 (UTF-16 → UTF-8)
↓
消息去重 (时间窗口)
↓
JSON格式化
↓
异步发送 (asio线程池)
↓
Webhook服务器
import requests
BASE_URL = "http://localhost:8080"
# 1. 获取个人信息
response = requests.get(f"{BASE_URL}/userinfo")
print(response.json())
# 2. 获取联系人列表
response = requests.get(f"{BASE_URL}/contacts")
contacts = response.json()
print(f"联系人数量: {contacts['data']['count']}")
# 3. 发送文本消息
response = requests.post(f"{BASE_URL}/send_message", json={
"wxid": "filehelper",
"msg": "Hello from Python!"
})
print(response.json())
# 4. 发送图片
response = requests.post(f"{BASE_URL}/send/image", json={
"wxid": "filehelper",
"path": "C:\\path\\to\\image.jpg"
})
print(response.json())
# 5. 打开浏览器
response = requests.post(f"{BASE_URL}/api/browser/open", json={
"url": "https://www.baidu.com"
})
print(response.json())const axios = require('axios');
const BASE_URL = 'http://localhost:8080';
// 发送消息
async function sendMessage(wxid, msg) {
try {
const response = await axios.post(`${BASE_URL}/send_message`, {
wxid: wxid,
msg: msg
});
console.log(response.data);
} catch (error) {
console.error('发送失败:', error.message);
}
}
// 获取联系人
async function getContacts() {
try {
const response = await axios.get(`${BASE_URL}/contacts`);
console.log(`联系人数量: ${response.data.data.count}`);
return response.data.data.contacts;
} catch (error) {
console.error('获取失败:', error.message);
}
}
// 使用示例
sendMessage('filehelper', 'Hello from Node.js!');
getContacts();from flask import Flask, request
import json
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
"""接收微信消息的Webhook"""
msg = request.json
print(f"收到消息:")
print(f" 类型: {msg['type']}")
print(f" 发送者: {msg['sender']}")
print(f" 内容: {msg['content']}")
print(f" 是否群消息: {msg['is_group']}")
# 自动回复示例
if not msg['is_self'] and msg['type'] == 1: # 文本消息
if '你好' in msg['content']:
# 调用API发送回复
import requests
requests.post('http://localhost:8080/send_message', json={
'wxid': msg['sender'],
'msg': '你好!我是自动回复机器人'
})
return 'ok'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=3000)- 微信版本: 本项目仅支持微信版本 3.9.12.51,其他版本可能无法正常工作
- 路径格式: 发送图片、文件时必须使用绝对路径
- 编码格式: 所有接口使用 UTF-8 编码
- 安全令牌: 生产环境请设置
shutdown_token保护关闭接口 - Hook方式: 推荐使用硬件断点(
use_software_breakpoint: false)
Q: 注入后没有反应?
A: 检查微信版本是否为3.9.12.51,查看日志文件 logs/wechathook.log
Q: 消息发送失败? A:
- 确认微信已登录
- 检查目标wxid是否正确
- 文件路径必须是绝对路径且文件存在
Q: 无法接收消息? A:
- 检查
webhook_url配置是否正确 - 确认Webhook服务器正常运行
- 查看日志文件排查问题
Q: DLL注入失败? A:
- 使用管理员权限运行注入器
- 确保微信版本为3.9.12.51
- 关闭杀毒软件重试
日志文件位置:logs/ 目录
| 日志文件 | 内容 |
|---|---|
wechathook.log |
所有级别的日志(trace/debug/info/warn/error) |
wechathook_error.log |
仅错误和严重错误(error/critical) |
日志级别:
trace- 详细跟踪信息debug- 调试信息info- 一般信息warn- 警告信息error- 错误信息critical- 严重错误
本项目仅供学习和研究使用,请遵守以下规定:
- ✅ 个人学习C++、逆向工程、Windows编程
- ✅ 研究微信PC版的内部机制
- ✅ 测试Hook技术和DLL注入
- ❌ 禁止用于商业用途
- ❌ 禁止用于非法用途
- ❌ 禁止用于骚扰他人
- ❌ 禁止用于批量营销
- 使用本工具产生的一切后果由使用者自行承担
- 请遵守相关法律法规和微信用户协议
- 本项目不对使用本工具造成的任何损失负责
- 使用前请备份重要数据
| 库 | 版本 | 用途 |
|---|---|---|
| nlohmann/json | latest | JSON处理 |
| cpr | latest | HTTP客户端 |
| crow | latest | HTTP服务器 |
| asio | latest | 异步I/O |
| spdlog | latest | 日志系统 |
- C++标准: C++17
- 运行库: 静态链接 (
/MT) - 字符集: Unicode
- 平台: x64
欢迎提交Issue和Pull Request,但请注意:
- 保持代码风格一致
- 添加必要的注释和文档
- 测试功能正常后再提交
- 遵守项目的使用声明
重构优化:
- ✅ 创建
WeChatHelper工具类,消除25处重复代码 - ✅ 创建
WebHelper工具类,消除30+处重复代码 - ✅ 删除未使用的文件和代码,减少318行代码
- ✅ 统一字符串转换逻辑
- ✅ 重写项目文档
Bug修复:
- 🐛 修复内存泄漏问题
- 🐛 优化异常处理机制
功能变更:
- ❌ 移除数据库相关接口(偏移失效)
- ❌ 移除群聊管理接口(偏移失效)
- ❌ 移除消息转发接口(偏移失效)
- ❌ 移除二维码Hook功能(偏移失效)
- ✅ 保留核心消息发送和接收功能
- ✅ 保留联系人管理功能
- ✅ 保留账号信息查询功能
新增功能:
- ✨ 添加结构化日志系统 (spdlog)
- ✨ 添加浏览器控制功能
- 🔧 改进异常处理机制
- ⚡ 性能优化
初始版本:
- 🎉 支持硬件/软件断点Hook
- 🌐 HTTP API服务器
- 📡 异步消息转发
- 📤 多种消息类型发送
- Issues: GitHub Issues
- Discussions: GitHub Discussions
本项目仅供学习交流使用,请勿用于商业用途。
⭐ 如果这个项目对你有帮助,请给个Star!
🔔 关注项目获取最新更新
💡 有问题请提Issue,欢迎贡献代码