从 9.9.12-25493 提取特征码,在 9.9.21-38711 中查找签名函数
-
打开 wrapper.node
文件 → 打开 选择: C:\Users\admin\Documents\qqnt\9912\resources\app\versions\9.9.12-25493\wrapper.node -
跳转到签名函数
按 Ctrl+G 输入: wrapper+A996E0 按回车 -
查看汇编代码
应该看到: 00007FFA3C7496E0 | 55 | push rbp 00007FFA3C7496E1 | 41:57 | push r15 00007FFA3C7496E3 | 41:56 | push r14 00007FFA3C7496E5 | 41:55 | push r13 00007FFA3C7496E7 | 41:54 | push r12 00007FFA3C7496E9 | 56 | push rsi 00007FFA3C7496EA | 57 | push rdi 00007FFA3C7496EB | 53 | push rbx 00007FFA3C7496EC | 48:81EC C8030000 | sub rsp,3C8 -
提取字节码
手动方式: 看第二列,记录字节码:
55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC C8 03 00 00复制方式:
- 选中前 10 行(用鼠标或 Shift+方向键)
- 右键 → 二进制 → 复制
- 粘贴到记事本
-
记录特征码
完整特征码 (20 字节): 55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC C8 03 00 00 48 推荐搜索 (15 字节): 55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC 宽松搜索 (12 字节): 55 41 57 41 56 41 55 41 54 56 57 53
cd "C:\Users\admin\Downloads\SignerServer-main"
python extract_signature.py会自动提取并显示特征码。
-
启动 QQ 9.9.21
正常启动 QQ 等待完全加载 -
用 x64dbg 附加
x64dbg → 文件 → 附加 找到: QQ.exe 双击附加 -
查找 wrapper.node 模块
按 Alt+M 打开内存映射 按 Ctrl+F 搜索: wrapper 记录基址,例如: 7FFA3C6B0000 -
搜索特征码
按 Ctrl+B 打开二进制搜索 选择: 所有模块(或当前模块) 输入特征码: 55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC 点击 "查找" -
计算偏移值
假设找到地址: 7FFA3C7496E0 wrapper.node 基址: 7FFA3C6B0000 偏移值 = 7FFA3C7496E0 - 7FFA3C6B0000 = A996E0
如果搜索不到结果:
-
尝试更短的特征码
第一次: 55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC 第二次: 55 41 57 41 56 41 55 41 54 56 57 53 第三次: 55 41 57 41 56 41 55 41 54 -
只搜索函数序言
55 41 57 41 56 41 55 (push rbp, push r15, push r14, push r13) -
检查每个匹配项
- 可能有多个结果
- 逐个验证是否是完整函数
✅ 地址处有完整函数
- 有函数序言(push 指令)
- 有栈分配(sub rsp, XXX)
- 函数体较大(> 100 字节)
- 有函数结尾(ret)
✅ 参数使用正确
应该看到:
- mov XXX, rcx (第1个参数)
- mov XXX, rdx (第2个参数)
- mov XXX, r8 (第3个参数)
- mov XXX, r9 (第4个参数)
✅ 函数特征符合
- 大量位运算
- 循环结构
- 复杂的逻辑
=== 9.9.21-38711 特征码搜索结果 ===
搜索时间: 2025-10-15
原始版本: 9.9.12-25493
目标版本: 9.9.21-38711
使用的特征码:
55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC
搜索结果:
- 找到地址: 7FFA3C7496E0
- 模块基址: 7FFA3C6B0000
- 计算偏移: 0xA996E0
验证结果:
[✅] 函数序言正确
[✅] 有 5 个参数
[✅] 函数体完整
[✅] 结尾有 ret
结论:
9.9.21-38711 的偏移值为: 0xA996E0
std::map<std::string, uint64_t> addrMap = {
// ... 其他版本 ...
{"9.9.12-25493", 0xA996E0},
{"9.9.21-38711", 0xA996E0}, // 新增
};{
"ip": "0.0.0.0",
"port": 8080,
"version": "9.9.21-38711",
"offset": "0xA996E0"
}cmake --build --preset=msvc-release
start.batA: 依次尝试:
- 缩短特征码(从 15 字节减到 12 字节)
- 只搜索函数序言部分
- 检查搜索范围是否包含 wrapper.node
- 尝试在 IDA Pro 中搜索
A: 验证每个结果:
- 查看上下文是否像函数开头
- 检查函数大小
- 验证参数使用
- 选择最符合特征的
A: 可能原因:
- 函数被重构或优化
- 编译器版本不同
- 代码逻辑改变
解决方案:
- 使用试错法测试已知偏移值
- 等待社区分享
- 深入分析新版本
为每个版本建立特征码记录:
版本列表:
9.9.12-25493: 55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC C8 03 00 00
9.9.21-38711: [待查找]
9.9.20-37051: [待查找]
如果有多个版本:
- 对比特征码的差异
- 找出共同的部分
- 使用最稳定的部分搜索
尝试 1: 55 41 57 ... (15 字节) - 未找到
尝试 2: 55 41 57 ... (12 字节) - 找到 3 个结果
尝试 3: 验证第 2 个结果 - 正确!
祝你成功喵~ 🐾