算法难度:⭐⭐⭐
爆破难度:⭐⭐
信息收集
运行情况:
查壳与脱壳:
无壳:
调试分析
IDA分析,老样子,找到按钮事件:
可以发现,这里调用了一个call,然后根据变量的值来显示不同的内容,这个值应该就是在这个call里设置的
进去看看:
首先判断文件大小需要是32字节,然后读取前10字节,从后往前排除存在的空格,然后跳转
接下来计算了一下Buffer的长度,对读取到的内容进行累加操作
累加完之后,乘一个数,然后转换成十六进制保存在字符串里
然后接下来读取后16字节,依然是从后往前找到非空格
这个keyfile是用空格来填充空位的
找到之后拿后10h字节的Buffer和刚刚生成的字符串进行对比,对比成功,返回4到res变量里,这个返回值就是验证成功的意思
注册机
注册码生成算法:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
int main()
{
char buffer1[0x10] = "123456789abcdef";
char buffer2[0x10] = " ";
int sum = 0;
for (int i = 0; i < strlen(buffer1); i++)
sum += (buffer1[i] + 0xf) ^ 0x20;
sum *= 0x7a69;
sprintf(buffer2, "%X", sum);
std::cout << buffer1 << " " << buffer2;
}
得到的字符串复制到十六进制编辑器里,最后不满32字节的部分用0x20填充
31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 00
32 39 42 30 41 32 42 20 20 20 20 20 20 20 20 20
效果: