算法难度:⭐⭐
爆破难度:⭐
信息收集
运行情况:
看标语,这是个来自看雪论坛的CM
查壳与脱壳:
C++的GUI程序,无壳
调试分析
程序一进去就是WinMain,这里的这个参数是窗口过程,从这里找内容:
窗口过程函数里,往下面拉一点就能看到获取控件内容的API,分别获取Name和Serial,然后调用了函数sub_401340,这应该就是校验函数了
校验函数分析:这里有一个硬编码的字节数组,从索引0开始,每轮循环+1,遍历用户名的索引从3开始,每轮循环+1
每次索引到一个用户名中的值和一个硬编码字节数组的值,然后相乘,
把每轮的结果加起来,转换成字符串与输入的序列号进行对比,相同则表示校验成功
注册码生成算法:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
int main()
{
char name[10] = "selph";
char arr[8] = { 0xC, 0xA, 0x13, 0x9, 0xC, 0xB, 0xA, 0x8 };
char serial[20] = { 0 };
int sum = 0;
for (int i = 3,j=0; name[i]; i++,j++)
{
if (j > 7)j = 0;
sum += name[i] * arr[j];
}
sprintf(serial, "%ld", sum);
std::cout << serial;
}
结果: