Crackme032 的逆向分析
1. 程序观察
输入错误之后会出现弹窗
这个弹窗会出现两次,不知道是有什么毛病(后面会说出原因)。
2. 简单查壳
程序使用汇编语言编写的。
3. 程序分析
程序首先获取输入的 name 和 serial
然后调用函数处理用户名
在函数内部,首先会检查用户名是否为字母,如果不是字母就会报错,如果是小写字母就转化为大写字母(这里已经发现当初为什么会报两次错了,当用户名不是字母的时候弹一次窗,序列号错误的时候又弹一次。)
检查完毕之后,会调用地址 4013C2 处的函数,该函数会将 name[i] 依次相加
然后再将相加的结果和 0x5678 进行异或
用户名处理完毕之后,程序会调用函数处理 serial
最后,程序会比较处理过后的用户名和序列号,如果相等,就提示正确;不想等则错误。
4. 注册机
#include <stdio.h>
#include <string.h>
#include <Windows.h>
int Keygen()
{char szName[20] = {0};
char szSerial[20] = {0};
int NameLen = 0;
__int64 Result = 0;
printf("请输入用户名:");
scanf_s("%s", szName, 20);
NameLen = strlen(szName);
for (int i = 0x0; i < NameLen; i++)
{if (szName[i] < 0x41 || szName[i] > 0x5A)
{printf("错误!请输入大写字母。\n");
return 0;
}
Result += szName[i];
}
Result ^= (0x5678 ^ 0x1234);
sprintf(szSerial, "%I64d", Result);
printf("%s\n", szSerial);
return 0;
}
int main(int argc, char* argv[])
{Keygen();
return 0;
}
相关文件在我的 Github