yonkies_keygenme_3 writeup 及代码复用(编译/链接进代码)的技巧
字数 2095 2025-09-01 11:26:17

XTEA变型算法逆向分析与Keygen实现

1. 题目概述

这是一个基于XTEA变型算法的keygenme逆向分析题目,主要特点包括:

  • 使用变型的XTEA加密算法
  • 注册文件为44字节(11个DWORD)
  • 包含CRC32校验
  • 特殊的密钥与密文关系trick

2. 验证逻辑分析

2.1 文件结构

注册文件必须是44个字节,由11个DWORD类型数据组成,结构如下:

偏移 内容
0-3 XTEA key[1]
4-7 XTEA key[2]
8-11 XTEA key[3]
12-15 XTEA key[0] (同时也是"sign"的密文)
16-19 Serial Number密文
20-23 Features密文
24-27 用户名CRC32校验值的密文
28-31 用户名密文part1
32-35 用户名密文part2
36-39 用户名密文part3
40-43 用户名密文part4

2.2 验证流程

  1. 读取11个DWORD数据到内存
  2. 重排XTEA算法的KEY顺序
  3. 第一轮XTEA解密:
    • 解密dword_418240[3]和dword_418240[4]
    • 检查dword_418240[3]的明文必须为"sign"(0x7369676E)
    • dword_418240[4]解密结果为Serial Number
  4. 第二轮XTEA解密:
    • 解密dword_418240[5]和dword_418240[6]
    • dword_418240[5]解密后对应Feature
    • dword_418240[6]解密后是用户名的CRC32校验值
  5. 第三轮XTEA解密:
    • 解密dword_418240[7]到dword_418240[10]得到用户名
    • 用户名必须用空格补足16字节
  6. 计算用户名的CRC32值并与解密得到的校验值比对

2.3 关键trick

dword_418240[3]既是XTEA算法的key[0],又是"sign"字符串的密文。这意味着:

  • "sign"加密后的结果必须等于key[0]
  • 这是一个自引用关系,增加了keygen实现的难度

3. XTEA算法分析

3.1 标准XTEA算法

标准XTEA加密过程:

  1. 初始化:
    • 64位明文分为两个32位字V0和V1
    • 128位密钥分为四个32位子密钥K[0]-K[3]
  2. 64轮加密:
    • 每轮对V0和V1进行变换
    • 使用delta常数0x9E3779B9
  3. 输出:
    • V0和V1连接形成64位密文

3.2 题目中的变型

  • 使用不同的常数:0x25E1B381和0xBADF00D
  • 循环次数为0x45次
  • 密钥选择方式不同
  • 密文和明文的DWORD顺序可能与标准相反

4. Keygen实现步骤

4.1 实现XTEA加解密函数

根据IDA伪代码实现变型的XTEA加解密函数,注意:

  • 加解密是逆过程
  • 注意DWORD顺序
  • 使用题目中的常数和循环次数

4.2 解决关键trick

暴力查找满足条件的KEY组合:

  1. 随机选择KEY[1]、KEY[2]、KEY[3]
  2. 暴力枚举KEY[0]的可能值
  3. 检查"sign"加密结果是否等于KEY[0]
  4. 如果无解,重新随机KEY[1]-KEY[3]再次尝试

优化技巧:

  • 多线程并行暴力(如根据线程号设置KEY[0]的高位)
  • 避免KEY或明文中出现大量0x00字节
  • 一轮暴力时间约6-7分钟(16线程)

4.3 CRC32实现

复用目标程序的CRC32代码:

  1. 从目标程序中提取CRC32计算代码
  2. 封装成函数,添加参数和返回值处理
  3. 编译为.o文件并链接到keygen中

4.4 完整keygen流程

  1. 用户输入:
    • Serial Number
    • Features
    • 用户名(自动补空格至16字节)
  2. 计算用户名的CRC32值
  3. 暴力查找满足条件的XTEA密钥:
    • "sign"加密结果等于KEY[0]
  4. 加密Serial Number、Features和CRC32值
  5. 加密用户名(分4部分)
  6. 输出11个DWORD的注册文件

5. 代码复用技巧

5.1 直接编译链接

  • 将复用代码编译为.o文件
  • 直接链接到keygen程序中
  • 适用于C/C++实现的keygen

5.2 动态链接库

  • 将复用代码编译为.so/.dll
  • 适用于Python等脚本语言实现的keygen
  • 需要中间层进行转换

5.3 内存中复用

  • 使用angr等工具加载目标程序
  • 直接在内存中调用目标函数
  • 可实现跨平台复用

6. 总结

本题的关键点:

  1. 识别XTEA变型算法及其参数
  2. 分析注册文件结构和验证流程
  3. 解决密钥自引用的trick
  4. 实现高效的暴力破解策略
  5. 复用目标程序的算法实现

通过这个案例,我们学习了:

  • 复杂加密算法的逆向分析方法
  • 特殊限制条件下的keygen实现技巧
  • 不同场景下的代码复用策略
  • 暴力破解的优化思路
XTEA变型算法逆向分析与Keygen实现 1. 题目概述 这是一个基于XTEA变型算法的keygenme逆向分析题目,主要特点包括: 使用变型的XTEA加密算法 注册文件为44字节(11个DWORD) 包含CRC32校验 特殊的密钥与密文关系trick 2. 验证逻辑分析 2.1 文件结构 注册文件必须是44个字节,由11个DWORD类型数据组成,结构如下: | 偏移 | 内容 | |------|------| | 0-3 | XTEA key[ 1 ] | | 4-7 | XTEA key[ 2 ] | | 8-11 | XTEA key[ 3 ] | | 12-15| XTEA key[ 0 ] (同时也是"sign"的密文) | | 16-19| Serial Number密文 | | 20-23| Features密文 | | 24-27| 用户名CRC32校验值的密文 | | 28-31| 用户名密文part1 | | 32-35| 用户名密文part2 | | 36-39| 用户名密文part3 | | 40-43| 用户名密文part4 | 2.2 验证流程 读取11个DWORD数据到内存 重排XTEA算法的KEY顺序 第一轮XTEA解密: 解密dword_ 418240[ 3]和dword_ 418240[ 4 ] 检查dword_ 418240[ 3 ]的明文必须为"sign"(0x7369676E) dword_ 418240[ 4 ]解密结果为Serial Number 第二轮XTEA解密: 解密dword_ 418240[ 5]和dword_ 418240[ 6 ] dword_ 418240[ 5 ]解密后对应Feature dword_ 418240[ 6 ]解密后是用户名的CRC32校验值 第三轮XTEA解密: 解密dword_ 418240[ 7]到dword_ 418240[ 10 ]得到用户名 用户名必须用空格补足16字节 计算用户名的CRC32值并与解密得到的校验值比对 2.3 关键trick dword_ 418240[ 3]既是XTEA算法的key[ 0 ],又是"sign"字符串的密文。这意味着: "sign"加密后的结果必须等于key[ 0 ] 这是一个自引用关系,增加了keygen实现的难度 3. XTEA算法分析 3.1 标准XTEA算法 标准XTEA加密过程: 初始化: 64位明文分为两个32位字V0和V1 128位密钥分为四个32位子密钥K[ 0]-K[ 3 ] 64轮加密: 每轮对V0和V1进行变换 使用delta常数0x9E3779B9 输出: V0和V1连接形成64位密文 3.2 题目中的变型 使用不同的常数:0x25E1B381和0xBADF00D 循环次数为0x45次 密钥选择方式不同 密文和明文的DWORD顺序可能与标准相反 4. Keygen实现步骤 4.1 实现XTEA加解密函数 根据IDA伪代码实现变型的XTEA加解密函数,注意: 加解密是逆过程 注意DWORD顺序 使用题目中的常数和循环次数 4.2 解决关键trick 暴力查找满足条件的KEY组合: 随机选择KEY[ 1]、KEY[ 2]、KEY[ 3 ] 暴力枚举KEY[ 0 ]的可能值 检查"sign"加密结果是否等于KEY[ 0 ] 如果无解,重新随机KEY[ 1]-KEY[ 3 ]再次尝试 优化技巧: 多线程并行暴力(如根据线程号设置KEY[ 0 ]的高位) 避免KEY或明文中出现大量0x00字节 一轮暴力时间约6-7分钟(16线程) 4.3 CRC32实现 复用目标程序的CRC32代码: 从目标程序中提取CRC32计算代码 封装成函数,添加参数和返回值处理 编译为.o文件并链接到keygen中 4.4 完整keygen流程 用户输入: Serial Number Features 用户名(自动补空格至16字节) 计算用户名的CRC32值 暴力查找满足条件的XTEA密钥: "sign"加密结果等于KEY[ 0 ] 加密Serial Number、Features和CRC32值 加密用户名(分4部分) 输出11个DWORD的注册文件 5. 代码复用技巧 5.1 直接编译链接 将复用代码编译为.o文件 直接链接到keygen程序中 适用于C/C++实现的keygen 5.2 动态链接库 将复用代码编译为.so/.dll 适用于Python等脚本语言实现的keygen 需要中间层进行转换 5.3 内存中复用 使用angr等工具加载目标程序 直接在内存中调用目标函数 可实现跨平台复用 6. 总结 本题的关键点: 识别XTEA变型算法及其参数 分析注册文件结构和验证流程 解决密钥自引用的trick 实现高效的暴力破解策略 复用目标程序的算法实现 通过这个案例,我们学习了: 复杂加密算法的逆向分析方法 特殊限制条件下的keygen实现技巧 不同场景下的代码复用策略 暴力破解的优化思路