selph
selph
发布于 2022-07-18 / 192 阅读
0
0

新160个CrackMe练习:009-Boonz-KeygenMe1

算法难度:⭐⭐

爆破难度:⭐

信息收集

运行情况:

神奇的审美,用户名+序列号验证程序

image.png

查壳与脱壳:

无壳程序

image.png

查字符串:

有一些提示字符串,提示输入正确失败的,还有错误提示:Name需要是4-50个字符长

image.png

调试分析

本次的目标是分析出算法写注册机,所以就没有爆破环节了

从提示字符串Hello,Mr. Goodboy入手开始分析,交叉引用找到校验函数:

先后获取了用户输入的Name和Serial,然后进入校验函数

image.png

算法分析

校验函数就是算法的所在

首先判断用户名长度是否合法,长度4–50内

image.png

接下来进行第一组计算,结果保存起来

image.png

然后进行第二组运算:圈出来的三行纯属干扰,无用

image.png

然后进行第三组运算:

image.png

然后再往下就是拼接字符串进行比对的环节了:

image.png

已经知道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

程序运行结果:

image.png

总结

非常简单的序列号校验算法分析,中间的干扰是无用计算,忽视即可


评论