1. 项目概述
Cruehead-CrackMe-3是"160个CrackMe"逆向挑战系列中的第三个练习程序。这个CrackMe属于典型的Win32平台逆向分析题目,主要考察逆向工程师对基础文件操作API和简单加密算法的分析能力。通过分析这个程序,我们可以学习到Windows平台下常见的反调试技巧和注册验证机制。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 逆向环境准备
2.1 工具选择
对于这类基础CrackMe,我推荐使用以下工具组合:
- OllyDbg 1.10:经典的动态调试器,适合分析Win32程序
- IDA Pro 7.0:静态反汇编分析
- PEiD:查壳工具(虽然这个CrackMe通常不带壳)
- API Monitor:监控程序调用的Windows API
2.2 初始分析
首先用PEiD检查程序是否加壳。Cruehead系列通常使用VC++编写且不加壳。运行程序会发现它要求输入Name和Serial,这是典型的序列号验证模式。
3. 关键API分析
3.1 CreateFileA函数追踪
通过API Monitor可以发现程序调用了CreateFileA函数,这是逆向分析的重要切入点。CreateFileA的函数原型如下:
c复制HANDLE CreateFileA(
LPCSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
在这个CrackMe中,程序可能使用CreateFileA来:
- 检查调试器存在(通过尝试打开特定设备)
- 读取或验证本地文件
- 实现自校验功能
3.2 字符串交叉引用
在IDA中查找字符串引用,可以找到与文件操作相关的线索。常见的可疑字符串包括:
- "\\.\PhysicalDrive0"
- "\\.\SICE" (SoftICE驱动)
- "\\.\NTICE" (WinDbg驱动)
4. 反调试技术分析
4.1 基于CreateFile的反调试
这个CrackMe使用了经典的CreateFile反调试技术。在00401050处可以看到以下关键代码:
asm复制push 0
push FILE_ATTRIBUTE_NORMAL
push OPEN_EXISTING
push 0
push FILE_SHARE_READ|FILE_SHARE_WRITE
push GENERIC_READ
push offset szDebuggerDevice ; "\\\\.\\Global\\ProcmonDebugLogger"
call ds:CreateFileA
cmp eax, INVALID_HANDLE_VALUE
jnz short DebuggerDetected
4.2 反反调试对策
要绕过这个检测,可以:
- 在CreateFileA调用前将eax设为INVALID_HANDLE_VALUE
- 修改跳转指令(jnz -> jz)
- 使用插件隐藏调试器
5. 序列号算法分析
5.1 用户名处理
程序首先获取用户名输入,然后进行以下处理:
- 计算字符串长度
- 将每个字符的ASCII值相加
- 与0x12345678进行异或运算
对应的汇编代码:
asm复制mov ecx, [ebp+UserNameLength]
xor eax, eax
xor edx, edx
UserNameLoop:
mov dl, [esi+eax]
add ebx, edx
inc eax
cmp eax, ecx
jl short UserNameLoop
xor ebx, 12345678h
5.2 序列号生成
处理后的值会经过以下变换生成最终序列号:
- 乘以0x87654321
- 取结果的十进制字符串形式
- 在前面加上"CW-"前缀
6. 破解方案实现
6.1 密钥生成器代码
基于上述分析,可以用Python编写注册机:
python复制def generate_serial(name):
sum_val = sum(ord(c) for c in name)
sum_val ^= 0x12345678
serial = sum_val * 0x87654321
return f"CW-{serial}"
name = input("Enter your name: ")
print("Your serial is:", generate_serial(name))
6.2 内存补丁方案
如果不想修改程序,可以在调试器中打补丁:
- 在00401120处修改跳转指令
- 或者直接修改内存中的比较结果
7. 经验总结
-
API断点技巧:在逆向Win32程序时,对CreateFileA、RegQueryValue等API下断点往往能快速定位关键代码
-
反调试识别:常见的反调试手段包括:
- 检查调试器端口
- 检测父进程
- 检查窗口类名
- 检查进程名
-
算法还原:对于简单的加密算法,可以通过:
- 跟踪数据流
- 记录运算过程
- 对比输入输出
-
调试技巧:
- 使用条件断点过滤无关调用
- 善用注释功能记录分析过程
- 创建内存快照对比数据变化
这个CrackMe虽然简单,但包含了Win32逆向的多个基础知识点。掌握这些技术后,可以应对更复杂的商业软件保护方案。
