算法难度:⭐⭐
爆破难度:⭐
信息收集
运行情况:
神奇的审美,用户名+序列号验证程序
查壳与脱壳:
无壳程序
查字符串:
有一些提示字符串,提示输入正确失败的,还有错误提示:Name需要是4-50个字符长
调试分析
本次的目标是分析出算法写注册机,所以就没有爆破环节了
从提示字符串Hello,Mr. Goodboy
入手开始分析,交叉引用找到校验函数:
先后获取了用户输入的Name和Serial,然后进入校验函数
算法分析
校验函数就是算法的所在
首先判断用户名长度是否合法,长度4–50内
接下来进行第一组计算,结果保存起来
然后进行第二组运算:圈出来的三行纯属干扰,无用
然后进行第三组运算:
然后再往下就是拼接字符串进行比对的环节了:
已经知道Serial是怎么算的了,接下来写注册机
注册机代码
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
int main()
{
char name[50] = { 0 };
char serial[50] = { 0 };
int nameLength = 0;
std::cin >> name;
nameLength = strlen(name);
if (nameLength < 4 || nameLength > 50) {
std::cout << "Name Length Invalid" << std::endl;
return 0;
}
// 第一轮计算
unsigned int res_1 = 0;
for (auto a = 0; name[a];a++) {
char tmp = name[a];
tmp -= 0x19;
res_1 -= tmp;
}
// 第二轮计算
unsigned int res_2 = res_1 * res_1 * res_1;
// 第三轮计算
unsigned int res_3 = 0x40e0f8 * 0x40e0f8 - 0x40e0f8;
sprintf(serial, "Bon-%lX-%lX-%lX", res_1,res_2,res_3);
std::cout << serial << std::endl;
return 0;
}
计算结果:
Name = 1234
Serial = Bon-FFFFFF9A-FFEFCEA8-41720F48
程序运行结果:
总结
非常简单的序列号校验算法分析,中间的干扰是无用计算,忽视即可