Skip to content

Latest commit

 

History

History
293 lines (220 loc) · 5.61 KB

File metadata and controls

293 lines (220 loc) · 5.61 KB

特征码提取实战指南

🎯 目标

从 9.9.12-25493 提取特征码,在 9.9.21-38711 中查找签名函数


步骤 1: 从 9.9.12 提取特征码

方法 A: 使用 x64dbg(推荐)

  1. 打开 wrapper.node

    文件 → 打开
    选择: C:\Users\admin\Documents\qqnt\9912\resources\app\versions\9.9.12-25493\wrapper.node
    
  2. 跳转到签名函数

    按 Ctrl+G
    输入: wrapper+A996E0
    按回车
    
  3. 查看汇编代码

    应该看到:
    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
    
  4. 提取字节码

    手动方式: 看第二列,记录字节码:

    55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC C8 03 00 00
    

    复制方式:

    • 选中前 10 行(用鼠标或 Shift+方向键)
    • 右键 → 二进制 → 复制
    • 粘贴到记事本
  5. 记录特征码

    完整特征码 (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
    

方法 B: 使用 Python 脚本

cd "C:\Users\admin\Downloads\SignerServer-main"
python extract_signature.py

会自动提取并显示特征码。


步骤 2: 在 9.9.21 中搜索特征码

方法 A: 附加到 QQ 进程(推荐)

  1. 启动 QQ 9.9.21

    正常启动 QQ
    等待完全加载
    
  2. 用 x64dbg 附加

    x64dbg → 文件 → 附加
    找到: QQ.exe
    双击附加
    
  3. 查找 wrapper.node 模块

    按 Alt+M 打开内存映射
    按 Ctrl+F 搜索: wrapper
    记录基址,例如: 7FFA3C6B0000
    
  4. 搜索特征码

    按 Ctrl+B 打开二进制搜索
    选择: 所有模块(或当前模块)
    输入特征码: 55 41 57 41 56 41 55 41 54 56 57 53 48 81 EC
    点击 "查找"
    
  5. 计算偏移值

    假设找到地址: 7FFA3C7496E0
    wrapper.node 基址: 7FFA3C6B0000
    
    偏移值 = 7FFA3C7496E0 - 7FFA3C6B0000
           = A996E0
    

方法 B: 如果附加失败,缩短特征码

如果搜索不到结果:

  1. 尝试更短的特征码

    第一次: 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
    
  2. 只搜索函数序言

    55 41 57 41 56 41 55
    (push rbp, push r15, push r14, push r13)
    
  3. 检查每个匹配项

    • 可能有多个结果
    • 逐个验证是否是完整函数

步骤 3: 验证找到的函数

检查清单:

地址处有完整函数

- 有函数序言(push 指令)
- 有栈分配(sub rsp, XXX)
- 函数体较大(> 100 字节)
- 有函数结尾(ret)

参数使用正确

应该看到:
- mov XXX, rcx  (第1个参数)
- mov XXX, rdx  (第2个参数)
- mov XXX, r8   (第3个参数)
- mov XXX, r9   (第4个参数)

函数特征符合

- 大量位运算
- 循环结构
- 复杂的逻辑

步骤 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

步骤 5: 更新代码

更新 sign.cpp

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.bat

常见问题

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

A: 依次尝试:

  1. 缩短特征码(从 15 字节减到 12 字节)
  2. 只搜索函数序言部分
  3. 检查搜索范围是否包含 wrapper.node
  4. 尝试在 IDA Pro 中搜索

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

A: 验证每个结果:

  1. 查看上下文是否像函数开头
  2. 检查函数大小
  3. 验证参数使用
  4. 选择最符合特征的

Q: 特征码完全不匹配?

A: 可能原因:

  1. 函数被重构或优化
  2. 编译器版本不同
  3. 代码逻辑改变

解决方案:

  • 使用试错法测试已知偏移值
  • 等待社区分享
  • 深入分析新版本

小技巧 💡

1. 保存特征码库

为每个版本建立特征码记录:

版本列表:
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: [待查找]

2. 使用版本对比

如果有多个版本:

  • 对比特征码的差异
  • 找出共同的部分
  • 使用最稳定的部分搜索

3. 记录搜索历史

尝试 1: 55 41 57 ... (15 字节) - 未找到
尝试 2: 55 41 57 ... (12 字节) - 找到 3 个结果
尝试 3: 验证第 2 个结果 - 正确!

祝你成功喵~ 🐾