算法难度:⭐⭐
爆破难度:⭐
信息收集
运行情况:
没有任何label,就2个框框输入和check
查壳与脱壳:
UPX壳,ESP定律即可
调试分析
是个手写窗口过程的程序,从头到尾跟进,这里就是调用自写函数
跟进以后,很明显的看到了窗口过程函数:
直接跟进到窗口过程里:发现,验证弹窗的过程正好就写在这里:
刚开始是先获取用户输入:
获取完成输入之后,对用户名进行一个处理,然后对序列号进行一个处理,就进行对比,如果相同,则跳转
用户名处理过程:
- 取一个字节
- 求平方,结果加到esi
- 右移这个字节1位,结果加到esi
- esi减去这个字节
- 然后循环处理每一个字节,最终结果在esi
对于序列号的处理,这个call实际上就是_atoi
函数(已经不止一次逆这个函数了…)
直接就是反着操作一波,就可以还原序列号了
注册机
注册码生成算法:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
int main()
{
char name[100] = { 0 };
char serial[100] = { 0 };
int len = 0;
int check = 0;
std::cin >> name;
len = strlen(name);
for (int i = 0; name[i]; i++)
{
char tmp = name[i];
check += tmp * tmp;
check += tmp >> 1;
check -= tmp;
}
_itoa(check, serial, 10);
std::cout << serial << std::endl;
return 0;
}
结果: