一个小萌新的crackme算法分析(keyfile保护)
Lixu
2020年2月9日 22:18:43
这个crack依然是来自看雪的,希望自己可以加油!!!
一:Peid查壳,很显然啥都没有。
二:进入OD后使用字符串查找功能查找所有文本参考字符串,找到了破解成功的提示,选中后回车进入。
三:找到成功提示 ,跟进去然后往上翻很快找到creatFile函数也就是查询keyfile文件的函数,你也可以刚开始就bp CreatFileA 也可以定位到这里。到了这里我们就可以进行分析。
第一步:判断有无keyfile文件:
第二步:判断内容是否是八个字节
第三步:读取文件内容,看内容是否为0,关闭文件。
第四步:进行算法变化,先将前四字节循环左移五位,然后前四字节加0xF,再将后四个字节循环右移0x7位,再将后四位整体减0x5,然后先将后四字节和0xC642D8BD进行比较,如果不相同就结束。相同的话再将前四字节和0x2E8E09FC进行比较,如果正确就出现成功的提示信息,不相同的话就提示结束。(这样的算法和验证方式是比较经典的,也不难)
第五步:成功演示:
第六步:算法:
算法如下,就是注意将大小端进行转逆,windows的存储方式和我们的书写方式不同:
计算结果是一串hex值,大家按照Ascii表找出来就行,也有函数可以用,我没找,大家可以将注册机完善一下。
#include "stdafx.h"
#include "string.h"
#include <stdlib.h>
void main()
{
unsigned long a = 0x2E8E09FC, b=0xC642D8BD;
unsigned long sn1,sn2;
char serial1[9],serial2[9];
a = a-0xF;
a = (a<<(32-5))|(a>>5);
b = b+0x5;
b = (b>>(32-7))|(b<<7);
sn1=(a<<0x18)|(a<<0x8&0xff0000)|(a>>0x8&0xff00)|(a>>0x18&0xff);
sn2=(b<<0x18)|(b<<0x8&0xff0000)|(b>>0x8&0xff00)|(b>>0x18&0xff);
ltoa(sn1,serial1,16);
ltoa(sn2,serial2,16);
printf("Serial:%s %s",serial1,serial2);
getchar();
}