对于此文件夹中的CrackMe的分析,程序使用masm所写,无壳,使用f(用户名,注册码)=0的方式检验
因为其中主要用的的操作是加法和异或操作,故可以由用户名逆推注册码
注册算法如下:
第一步:程序对于输入的用户名进行检验,如果大于等于20位,不操作,小于20位,用0填充到20位
第二步:程序将注册码转换为十进制数temp,
第三步:这是一个执行16次的大循环,初始值temp为上一步的结果,对于每一次循环有用户名的四个字符参与操作(如用户名的为“goodjob”的话,则第一次参与的操作数就为0x646F6F67(doog),第二次参与的操作数为0x6A646F6F(jdoo))与temp进行加1后的结果进行异或操作后赋值给temp,一直执行16次,得到最后的temp。
第四步:temp加上0x9112478等于0时,则注册成功,不相等失败
逆向算法如下:
见下面代码*/
#include<stdio.h>
#include<string.h>
int main()
{
char name[128] = {0};
unsigned long temp = 0x9112478;
temp = 0 - temp;
printf("输入用户名:");
scanf("%s", name);
for(int i=15; i>=0; i--)
{
unsigned long a=0;
for(int j=3+i; j>=i; j--)
{
a = a << 8;
a += name[j];
}
temp = temp ^ a;
temp = temp - 1;
}
printf("注册码为:%lu", temp);
return 0;
}