Cruehead‘s CrackMe v1.0
转眼之间,国庆7天长假就结束了,我也全宅在了父母那里。没有网络,我就开始翻硬盘,发现了以前从看雪上下载的一些CrackMe,很久没碰这些东西了,我也只能找个简单的玩玩了。
输入的字符串存储在全局变量中,调用了两个子函数,比较它们的返回值。
根据name算出一个值。
根据Key算出一个值。
验证步骤如下:
1. 输入name和key
2. check_name(name) == check_key(key)则成功
上面两个函数逆出的代码如下:
int check_name(const char* name) { int sum = 0; while(char c = *name++) { if (c < 0x41) { std::cout<<"Invalid char in name."<<std::endl; break; } if (c >= 0x5A) { c -= 0x20; } sum += c; } return sum ^ 0x5678; } int check_key(const char* key) { int x = 0; while (char c = *key++) { x *= 0x0A; x += (c - 0x30); } return x ^ 0x1234; }
根据上述算法写出的注册机如下:
int generate_key(const char* name, char *key) { char *str = key; int sum = check_name(name) ^ 0x1234; while (sum > 0) { *str++ = 0x30 + sum % 10; sum /= 10; } int len = strlen(key); for (int i = 0; i < len / 2; ++i) { char c = key[i]; key[i] = key[len - 1 - i]; key[len - 1 - i] = c; } return 0; } int main(int argc, char **argv) { char key[512] = { 0 }, name[32] = { 0 }; std::cout<<"Input reg name:"; std::cin>>name; generate_key(name, key); std::cout<<key<<std::endl; return 0; }
附件下载:CrackMe