Skip to content

Latest commit

 

History

History
202 lines (151 loc) · 5.2 KB

File metadata and controls

202 lines (151 loc) · 5.2 KB

x64dbg 查找 wrapper.node 签名函数偏移值指南

准备工作

  1. 下载并安装 x64dbg:https://x64dbg.com/
  2. 找到 wrapper.node 文件位置:
    C:\Program Files\Tencent\QQ\resources\app.asar.unpacked\node_modules\wrapper.node
    

方法一:静态分析(推荐新手)

Step 1: 加载文件

  1. 打开 x64dbg (x64 版本)
  2. 点击 文件打开
  3. 浏览到 wrapper.node 文件并打开
  4. 等待加载完成

Step 2: 查看模块基址

加载完成后,有几种方式查看基址:

方式 A - 查看状态栏

  • 底部状态栏会显示:模块: wrapper.node, 基址: XXXXXXXX
  • 记录这个基址,例如:180000000

方式 B - 查看内存映射

  1. 点击顶部菜单:查看内存映射
  2. 在列表中找到 wrapper.node
  3. 查看 基址 列的值

Step 3: 计算目标地址

使用 Windows 计算器(程序员模式):

  1. Win 键,搜索 计算器
  2. 点击左上角菜单,选择 程序员
  3. 选择 HEX (十六进制)
  4. 输入基址,例如:180000000
  5. 点击 +
  6. 输入偏移值,例如:A9CE90
  7. 得到结果,例如:180A9CE90

Step 4: 跳转到目标地址

  1. 在 x64dbg 中按 Ctrl+G
  2. 输入计算后的完整地址(不带 0x):180A9CE90
  3. 按回车跳转

Step 5: 检查是否是正确的函数

到达地址后,查看汇编代码:

典型的函数开头应该像这样:

push    rbp                  ; 保存栈帧
mov     rbp, rsp            ; 设置新栈帧
sub     rsp, XXX            ; 分配栈空间
mov     [rbp+XX], rcx       ; 保存第1个参数
mov     [rbp+XX], rdx       ; 保存第2个参数
mov     [rbp+XX], r8        ; 保存第3个参数
mov     [rbp+XX], r9d       ; 保存第4个参数

不是函数的情况:

db XX                        ; 数据字节
00 00 00 00                 ; 空白区域
int3                        ; 断点指令

Step 6: 测试其他偏移值

如果当前地址看起来不对,尝试其他偏移值:

偏移值 来源版本 计算示例 (基址 180000000)
A9CE90 9.9.12-25765 180000000 + A9CE90 = 180A9CE90
A996E0 9.9.12-25493 180000000 + A996E0 = 180A996E0
A84980 9.9.12-25234 180000000 + A84980 = 180A84980
AB5510 9.9.11-24815 180000000 + AB5510 = 180AB5510
AA1A20 9.9.11-24568 180000000 + AA1A20 = 180AA1A20

方法二:动态调试(更准确)

Step 1: 启动 QQ 并附加调试器

  1. 正常启动 QQ(不要通过 start.bat)
  2. 打开 x64dbg (x64)
  3. 点击 文件附加
  4. 在进程列表中找到 QQ.exe
  5. 双击附加

Step 2: 查找 wrapper.node 模块

  1. 附加成功后,按 Alt+M 打开模块列表
  2. 在列表中找到 wrapper.node
  3. 记录其基址(例如:7FF8A0000000

Step 3: 设置断点

在命令框输入(位于底部):

bp wrapper+A9CE90

或者手动跳转并设置断点:

  1. Ctrl+G
  2. 输入完整地址(基址+偏移)
  3. F2 在当前行设置断点

Step 4: 继续运行并触发

  1. F9 继续运行程序
  2. 在 QQ 中执行需要签名的操作
  3. 如果断点被触发,说明找到了正确的函数
  4. 查看调用栈和参数

方法三:搜索特征码

查找函数序言

  1. 在 x64dbg 中按 Ctrl+B 打开二进制搜索
  2. 输入常见的函数序言字节码:
    48 89 5C 24 08 48 89 74 24 10 57 48 83 EC
    
  3. 点击搜索
  4. 查看找到的每个结果
  5. 判断是否为签名函数

搜索字符串引用

  1. 右键 → 搜索当前模块字符串引用
  2. 搜索可能的关键字:
    • "sign"
    • "token"
    • "encrypt"
  3. 双击感兴趣的字符串
  4. 查看引用该字符串的函数

常见问题

Q: "无效的表达式" 错误

原因: 地址格式不正确

解决方案:

  • ❌ 错误:wrapper.node+A9CE90
  • ❌ 错误:0x180A9CE90
  • ✅ 正确:180A9CE90(纯十六进制,无前缀)
  • ✅ 正确:wrapper+A9CE90(使用简短模块名)

Q: 如何确认找到了正确的函数?

检查清单:

  • 函数开头有标准的序言(push rbp, mov rbp, rsp, sub rsp)
  • 函数体较大(通常几百到几千字节)
  • 包含大量的计算和循环逻辑
  • 有 5 个参数的使用(rcx, rdx, r8, r9, 栈参数)
  • 函数结尾有返回指令(ret)

Q: 所有偏移值都不对怎么办?

可能的原因:

  1. QQ 版本太新,需要等待社区更新
  2. 偏移值发生了较大变化
  3. wrapper.node 结构改变

建议:

  • 查看项目 GitHub Issues
  • 在相关社区求助
  • 等待项目作者更新

快速验证脚本

找到可疑地址后,可以使用配置文件快速测试:

编辑 sign.json

{
  "ip": "0.0.0.0",
  "port": 8080,
  "version": "9.9.20-37051",
  "offset": "0xA9CE90"
}

然后:

  1. 编译 SignerServer.dll
  2. 运行 start.bat
  3. 访问 http://localhost:8080/ping
  4. 如果返回 {"code":0} 说明服务正常启动
  5. 测试签名功能验证偏移值是否正确

提示

  • 保持耐心,逆向分析需要时间
  • 多尝试几个偏移值
  • 如果不确定,可以先用试错法
  • 备份原始文件以防出错