Skip to content

Latest commit

 

History

History
351 lines (257 loc) · 6 KB

File metadata and controls

351 lines (257 loc) · 6 KB

查找 QQ 9.9.21-38711 偏移值指南

🎯 目标

找到 9.9.21-38711 版本 wrapper.node 中签名函数的偏移值

📂 文件位置

C:\Users\admin\Documents\qqnt\9921\versions\9.9.21-38711\resources\app\wrapper.node

方法一:附加到运行中的 QQ(推荐)⭐

为什么这样做?

  • 绕过 DLL 依赖问题
  • wrapper.node 已经在内存中加载
  • 所有依赖都已解决

操作步骤

1. 启动 QQ

正常启动 QQ 9.9.21 版本
确保程序正在运行

2. 用 x64dbg 附加

x64dbg → 文件 → 附加
在进程列表中找到:QQ.exe
双击进行附加

3. 暂停程序

附加后,点击 "暂停" 按钮
或按 F12

4. 查找 wrapper.node 模块

按 Alt+M 打开内存映射
按 Ctrl+F 搜索:wrapper
找到 wrapper.node 那一行
记录基址,例如:7FFA3C6B0000

5. 搜索特征码

按 Ctrl+B 打开二进制搜索
选择搜索范围:所有模块
输入特征码:
55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC

点击 "查找"

6. 验证和计算

找到匹配项后:

检查是否正确:

  • 地址处应该有完整的函数代码
  • 有函数序言(push rbp, push r15...)
  • 函数体较大(不是几行就结束)
  • 最后有 ret 指令

计算偏移值:

偏移 = 找到的地址 - wrapper.node 基址

示例:
找到地址:7FFA3C7496E0
模块基址:7FFA3C6B0000
偏移值 = 7FFA3C7496E0 - 7FFA3C6B0000 = A996E0

7. 记录结果

=== 9.9.21-38711 签名函数信息 ===

找到地址:______________
模块基址:______________
偏移值:  0x____________

特征码匹配:✅ / ❌
函数验证:  ✅ / ❌

方法二:使用 IDA Pro 静态分析

优点

  • 不需要运行 QQ
  • 可以反编译查看代码逻辑
  • 功能更强大

步骤

  1. 打开 IDA Pro (64-bit)

  2. 加载 wrapper.node

    File → Open
    选择 wrapper.node
    选择 PE64 格式
    等待分析完成
    
  3. 搜索特征码

    Search → Sequence of bytes
    输入:55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC
    搜索
    
  4. 查看找到的地址

    双击搜索结果
    查看左侧的偏移值
    
  5. 验证函数

    按 F5 反编译
    查看是否符合签名函数特征
    

方法三:使用 Dependency Walker

步骤

  1. 下载 Dependency Walker

    http://www.dependencywalker.com/
    
  2. 打开 wrapper.node

  3. 查看导出函数

    如果签名函数有导出名称
    可以直接看到偏移值(RVA)
    

方法四:对比两个版本(高级)

使用 BinDiff

  1. 在 IDA Pro 中打开 9.9.12-25493 版本
  2. 生成 BinExport
  3. 打开 9.9.21-38711 版本
  4. 生成 BinExport
  5. 使用 BinDiff 对比
  6. 找到相似度最高的函数

匹配特征

已知 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:未找到匹配 ❌

函数可能被重构
尝试:
1. 缩短特征码重新搜索
2. 搜索关键字符串
3. 分析调用关系
4. 等待社区分享

快速测试新偏移值

找到后立即测试:

1. 更新 addrMap

编辑 sign.cpp

std::map<std::string, uint64_t> addrMap = {
    // ... 其他版本 ...
    {"9.9.21-38711", 0xXXXXXX},  // 填入找到的偏移值
};

2. 更新 main.cpp

#if defined(_WIN_PLATFORM_)
    std::string version = "9.9.21-38711";

3. 创建配置文件

sign.json:

{
  "ip": "0.0.0.0",
  "port": 8080,
  "version": "9.9.21-38711",
  "offset": "0xXXXXXX"
}

4. 编译测试

cmake --build --preset=msvc-release
start.bat

5. 验证

http://localhost:8080/ping
应该返回 {"code":0}

常见问题

Q: 附加后找不到 wrapper.node?

A: 可能原因:

  1. QQ 还未加载 wrapper.node
    • 解决:等待 QQ 完全启动后再附加
  2. 模块名称不同
    • 解决:在内存映射中搜索 "wrapper"
  3. 不同的 QQ 版本
    • 解决:确认 QQ 版本是 9.9.21-38711

Q: 搜索特征码没有结果?

A: 尝试:

  1. 缩短特征码
    只搜索:55 41 57 41 56 41 55 41 54 56 57 53
    
  2. 更改搜索范围
    从 "当前模块" 改为 "所有模块"
    
  3. 函数可能被优化
    尝试搜索其他关键指令序列
    

Q: 找到多个匹配项怎么办?

A: 依次检查:

  1. 查看每个匹配项的上下文
  2. 选择最像函数开头的
  3. 检查函数大小(应该较大)
  4. 验证参数使用(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 结尾
- [ ] 编译测试通过
- [ ] 实际签名功能正常

备注:
_____________________________________
_____________________________________

小技巧 💡

  1. 保持耐心

    • 逆向分析需要时间
    • 多尝试几次
  2. 记录过程

    • 记下每次尝试的结果
    • 方便后续参考
  3. 对比参考

    • 9.9.12 的特征码作为参考
    • 相近版本的偏移值通常接近
  4. 社区互助

    • 查看 GitHub Issues
    • 分享你的发现

祝你成功喵~ 🐾