找到 9.9.21-38711 版本 wrapper.node 中签名函数的偏移值
C:\Users\admin\Documents\qqnt\9921\versions\9.9.21-38711\resources\app\wrapper.node
- 绕过 DLL 依赖问题
- wrapper.node 已经在内存中加载
- 所有依赖都已解决
正常启动 QQ 9.9.21 版本
确保程序正在运行
x64dbg → 文件 → 附加
在进程列表中找到:QQ.exe
双击进行附加
附加后,点击 "暂停" 按钮
或按 F12
按 Alt+M 打开内存映射
按 Ctrl+F 搜索:wrapper
找到 wrapper.node 那一行
记录基址,例如:7FFA3C6B0000
按 Ctrl+B 打开二进制搜索
选择搜索范围:所有模块
输入特征码:
55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC
点击 "查找"
找到匹配项后:
检查是否正确:
- 地址处应该有完整的函数代码
- 有函数序言(push rbp, push r15...)
- 函数体较大(不是几行就结束)
- 最后有 ret 指令
计算偏移值:
偏移 = 找到的地址 - wrapper.node 基址
示例:
找到地址:7FFA3C7496E0
模块基址:7FFA3C6B0000
偏移值 = 7FFA3C7496E0 - 7FFA3C6B0000 = A996E0
=== 9.9.21-38711 签名函数信息 ===
找到地址:______________
模块基址:______________
偏移值: 0x____________
特征码匹配:✅ / ❌
函数验证: ✅ / ❌
- 不需要运行 QQ
- 可以反编译查看代码逻辑
- 功能更强大
-
打开 IDA Pro (64-bit)
-
加载 wrapper.node
File → Open 选择 wrapper.node 选择 PE64 格式 等待分析完成 -
搜索特征码
Search → Sequence of bytes 输入:55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC 搜索 -
查看找到的地址
双击搜索结果 查看左侧的偏移值 -
验证函数
按 F5 反编译 查看是否符合签名函数特征
-
下载 Dependency Walker
http://www.dependencywalker.com/ -
打开 wrapper.node
-
查看导出函数
如果签名函数有导出名称 可以直接看到偏移值(RVA)
- 在 IDA Pro 中打开 9.9.12-25493 版本
- 生成 BinExport
- 打开 9.9.21-38711 版本
- 生成 BinExport
- 使用 BinDiff 对比
- 找到相似度最高的函数
已知 9.9.12 版本:
- 偏移:0xA996E0
- 特征码:55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC C8 03 00 00 48
在 9.9.21 中查找:
- 相同或相似的特征码
- 相同的函数大小
- 相似的代码结构
说明函数未改变
偏移值可能相同或相近
直接使用找到的偏移值
函数可能有小幅优化
需要验证函数逻辑
计算新的偏移值
函数可能被重构
尝试:
1. 缩短特征码重新搜索
2. 搜索关键字符串
3. 分析调用关系
4. 等待社区分享
找到后立即测试:
编辑 sign.cpp:
std::map<std::string, uint64_t> addrMap = {
// ... 其他版本 ...
{"9.9.21-38711", 0xXXXXXX}, // 填入找到的偏移值
};#if defined(_WIN_PLATFORM_)
std::string version = "9.9.21-38711";sign.json:
{
"ip": "0.0.0.0",
"port": 8080,
"version": "9.9.21-38711",
"offset": "0xXXXXXX"
}cmake --build --preset=msvc-release
start.bathttp://localhost:8080/ping
应该返回 {"code":0}
A: 可能原因:
- QQ 还未加载 wrapper.node
- 解决:等待 QQ 完全启动后再附加
- 模块名称不同
- 解决:在内存映射中搜索 "wrapper"
- 不同的 QQ 版本
- 解决:确认 QQ 版本是 9.9.21-38711
A: 尝试:
- 缩短特征码
只搜索:55 41 57 41 56 41 55 41 54 56 57 53 - 更改搜索范围
从 "当前模块" 改为 "所有模块" - 函数可能被优化
尝试搜索其他关键指令序列
A: 依次检查:
- 查看每个匹配项的上下文
- 选择最像函数开头的
- 检查函数大小(应该较大)
- 验证参数使用(5个参数)
=== 9.9.21-38711 偏移值查找记录 ===
查找时间:2025-10-15
QQ 版本:9.9.21-38711
文件路径:C:\Users\admin\Documents\qqnt\9921\versions\9.9.21-38711\resources\app\wrapper.node
方法:[ ] 附加进程 [ ] IDA Pro [ ] 其他
结果:
- 模块基址:__________________
- 找到地址:__________________
- 偏移值: 0x________________
- 特征码匹配:[ ] 完全匹配 [ ] 部分匹配 [ ] 未匹配
验证:
- [ ] 有函数序言
- [ ] 函数体完整
- [ ] 有 ret 结尾
- [ ] 编译测试通过
- [ ] 实际签名功能正常
备注:
_____________________________________
_____________________________________
-
保持耐心
- 逆向分析需要时间
- 多尝试几次
-
记录过程
- 记下每次尝试的结果
- 方便后续参考
-
对比参考
- 9.9.12 的特征码作为参考
- 相近版本的偏移值通常接近
-
社区互助
- 查看 GitHub Issues
- 分享你的发现
祝你成功喵~ 🐾