Crackme033 的逆向分析
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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。