算法难度:⭐⭐
爆破难度:⭐
信息收集
运行情况:
查壳与脱壳:
无壳
查字符串:
有很多看不懂的提示语,还有个文件名
调试分析
抄起IDA直接干,用户函数就3个,这么简洁这应该是纯汇编写的程序吧(猜的),从start开始分析
首先打开一个文件,读取其中的内容,该内容应该长度是12字节:
然后就像下面这样,对12个字节的每个字节进行一个运算,逐一校验结果
然后接下来就是,如果验证全部通过,就弹窗提示ok,否则就直接启动窗口
暴力破解
把所有判断跳转都nop掉即可
算法分析
序列号运算的核心是异或,异或是可逆的,所以可以反着把序列号生成出来:
#include <iostream>
int main()
{
int arr[12] = { 0x168,0x160,0x170,0xec,0x13c,0x1cc,0x1f8,0xec,0x164,0x1f8,0x1a0,0x1bc };
int serial[12] = { 0 };
for (int i = 0; i < 12; i++)
{
serial[i] ^= arr[i];
serial[i] >>= 2;
serial[i] = serial[i]&0x000000FF ^ 0x1b;
}
for(char var : serial)
{
printf("%c",var);
}
}
计算结果是:ACG The Best
执行结果:
总结
很简单无脑的一次算法分析