首页
社区
课程
招聘
[原创]莫拉克-crakme的注册机
2009-9-26 21:58 11804

[原创]莫拉克-crakme的注册机

2009-9-26 21:58
11804
莫拉克crackme的注册机

又到中秋。岁岁年年人不同。。。。。。
好像没见人写过这个的注册机,似乎这个crackme现在也没人玩了,炒个冷饭。高手都懒的写文章,
抛个砖,等大家的指点。
1、crackme算法分析
虽有海风和spark的源码,不过算法还是没看懂。只是简单拆分和猜测一下。
1.1 name经过变换得到4个DWORD.   name=>hash[1..4]。
1.2 keystr(共48个字符)经过字符转hex, keystr=>ddd[0..5];
1.3
     如果
   1)Crc32((BYTE*)(&ddd[0]),24)=0x0;//事实上,可以设定为任何值,均有解。但为0的话,最简单。
   则在同时满足以下几个条件后(用类c代码表示),可以注册成功
   1)f0(*(float*)&ddd[0])==*(float *)(&hash[1]);
   2)f1(*(float*)&ddd[1])==*(float *)(&hash[2]);
   3)f2(*(float*)&ddd[2])==*(float *)(&hash[3]);
   4)f3((WORD*)&ddd[4],4)==*(float *)(&hash[4]);
   f0,f1,f2,f3分别为4个函数。crc32为crc32校验算法。
大致拆分出来的几个算法近似如下(未验证)
float f0(float x1)
{
		y1 = 0.0;
		x0 = 1.0;
		x4 = x1;
		for(i = 1; i <100000; i++)
		{
			sign = (x4 < 0);
			x4 = fabs(x4);
			n = (int) ((x4 * INVSPI) + 0.5);
			xn = (float) n;
			sign ^= n % 2;

			f = (x4 - xn * C1) - xn * C2;
			g = f * f;
			rg = (((R4 * g + R3) * g + R2) * g + R1) * g;

			result = f + f * rg;
			result = sign ? -result : result;
			y1 += result / i;
			x4 += x1;
		}
		return y1;
}

float f1(float x2)
{
		x0 = 1.0;
		y2 = x0;
		for(i = 1; i <100000; i++)
		{
			x0 =x0* x2;
			y2 = y2+x0;
		}	
		return y2;
}

float f2(float x3)
{
		x0 = 1.0;
		y3 = 0.0;
		x4 = x1;
		for(i = 1; i < 8000; i++)
		{
			x4 = (x4 > 0)?(x4):(-x4);
			n = (int) (((x4 + HALFPI) * INVSPI) + 0.5);
			xn = (float)n - 0.5;
			sign = n % 2;
			f = (x4 - xn * C1) - xn * C2;
			g = f * f;
			rg = (((R4 * g + R3) * g + R2) * g + R1) * g;
			result = f + f * rg;
			result =  sign ? -result : result;
			y3 += x0 * result / (i * i);
			x0 = -x0;
			x4 += x1;
		}
		y3 = y3 * 4 + PI * PI / 3 * 2;
		return y3;
}

DWORD f3((WORD *)d,int len)
{
	k = 0;
	lpData = (BYTE*)&k;
	d = (WORD*)&ddd[4];
	for(i = 0; i < len; i++)
	{
		B = (int)d[i];
		if(B >= MCU_CODE)
		{
			B = (B * 2) & 0xFFFF;
			C = B + 1;
		}
		else
			C = B + 2;
		rem = 0;
		root = 0;
		divisor = 0;
		a = C * C - B * B;
		for(j = 0; j < 16; j++)
		{
			root <<= 1;
			rem = ((rem << 2) + (a >> 30));
			a <<= 2;
			divisor = (root << 1) + 1;
			if(divisor <= rem)
			{
				rem -= divisor;
				root ++;
			}
		}
		lpData[i] = (unsigned char)(root - 3);
	}
	return k;
}

DWORD Crc32(BYTE *lpData,int len)
{
	for( i = 0; i < 256; i ++ )
	{
		crc32 = i;
		for( j = 0; j < 8; j ++ )
		{
			if(crc32 & 1) 
				crc32 = (crc32 >> 1) ^ 0xEDB88320UL;
			else 
				crc32 >>= 1;
		}
		crcTable[i] = crc32;
	}
	crc32 = ~hash4;
	for(i = 0; i < len; i ++)
	{
		crc32 = (crc32 >> 8) ^ crcTable[ (crc32 ^ lpData[i]) & 0xFF ];
	}
}
	crc32 = ~crc32;
	return crc32;
}


2.获得注册码
这要先膜拜一下老婆,如果不是她指点我逼近法和crc可逆破解,我还在穷举的苦海里挣扎。
2.1 获得ddd[0]
使用2分法逼近
	float x1_0=-4.72;
	float x1_1=-1.57;
	x1=x1_0;
	do
	{
		y1 = 0.0;
		x0 = 1.0;
		x1=(x1_0+x1_1)/2;
		x4 = x1;
		for(i = 1; i <100000; i++)
		{
			sign = (x4 < 0);
			x4 = fabs(x4);
			n = (int) ((x4 * INVSPI) + 0.5);
			//xn = (double) n;
			xn = (float) n;
			sign ^= n % 2;

			f = (x4 - xn * C1) - xn * C2;
			g = f * f;
			rg = (((R4 * g + R3) * g + R2) * g + R1) * g;

			result = f + f * rg;
			result = sign ? -result : result;
			y1 += result / i;
			x4 += x1;
		}
		if(y1>*(float*)&hash1)
			x1_0=x1;
		else
			x1_1=x1;
	}while(fabs(y1-*(float*)&hash1)>EPLISON);

2.2获得ddd[1]
	//ddd[1]
	float x2_0=-1.0;
	float x2_1=1.0;
	do
	{
		x0 = 1.0;
		y2 = x0;
		x2= (x2_0+x2_1)/2;
		for(i = 1; i <100000; i++)
		{
			x0 =x0* x2;
			y2 = y2+x0;
		}	
		if(y2>*(float*)&hash2)
			x2_1=x2;
		else
			x2_0=x2;
	}	while(fabs(y2-*(float*)&hash2)>EPLISON);

2.3获得ddd[2]
使用2分法逼近
	x1_0=0.0;
	x1_1=3.1415926;
	x1=x1_0;
	do
	{
		x0 = 1.0;
		y3 = 0.0;
		x1 =(x1_0+x1_1)/2;//
		if(x1>x1_1)
			break;
		x4 = x1;
		for(i = 1; i < 8000; i++)
		{
			x4 = (x4 > 0)?(x4):(-x4);
			n = (int) (((x4 + HALFPI) * INVSPI) + 0.5);
			//xn = (double)n - 0.5;
			xn = (float)n - 0.5;
			sign = n % 2;
			f = (x4 - xn * C1) - xn * C2;
			g = f * f;
			rg = (((R4 * g + R3) * g + R2) * g + R1) * g;
			result = f + f * rg;
			result =  sign ? -result : result;
			y3 += x0 * result / (i * i);
			x0 = -x0;
			x4 += x1;
		}
		y3 = y3 * 4 + PI * PI / 3 * 2;
		if(y3>*(float*)&hash3)
			x1_0=x1;
		else
			x1_1=x1;
	}	while(fabs(y3-*x)>EPLISON);

2.4 求ddd[4]和ddd[5]
穷举,好在工作量不大,4个WORD,分别穷举。
	lpData = (BYTE*)&k;
	d = (WORD*)&ddd[4];
	printf("ddd[4]:\t");
	for(i = 0; i < 4; i++)
	{
		B=0x0000;
		do
		{
			if(B >= MCU_CODE)
			{
				B = (B * 2) & 0xFFFF;
				C = B + 1;
			}
			else
				C = B + 2;
			rem = 0;
			root = 0;
			divisor = 0;
			a = C * C - B * B;
			for(j = 0; j < 16; j++)
			{
				root <<= 1;
				rem = ((rem << 2) + (a >> 30));
				a <<= 2;
				divisor = (root << 1) + 1;
				if(divisor <= rem)
				{
					rem -= divisor;
					root ++;
				}
			}
			lpData[i] = (unsigned char)(root - 3);
			B++;
		}while(lpData[i]!=*((unsigned char *)&hash4+i));
		B=B-1;
		printf("%04x",B);
		*((WORD*)&ddd[4]+i)=B;
	}
	printf("\n");

5.求ddd[3]
这个,我觉得是最难的,搞了2个晚上,硬着头皮把一篇crc破解的英文文章看完,才搞定。
	//...get crcBefore
	crc32 = ~hash4;
	lpData =(BYTE *) &ddd[0];
	for(tmpi = 0; tmpi < 12; tmpi ++)
	{
		crc32 = (crc32 >> 8) ^ crcTable[ (crc32 ^ lpData[tmpi]) & 0xFF ];
	}
	DWORD crcBefore=crc32;
	//...get crcEnd
	DWORD crcEnd;
	int index=0;
	*(DWORD *)(&Crc32_1[0])=0xFFFFFFFF;
	for(tmpj=23;tmpj>=16;tmpj--)
	{
		//step1 find ct
		for(tmpi=0;tmpi<256;tmpi++)
		{
			if(BYTE(crcTable[tmpi],3)==Crc32_1[3])
			{
				index=tmpi;
				break;
			}
		}
		if(index==256)
		{
			printf("Error!");
			break;
		}
		//step2 cal crc32
		Crc32_1[3]=Crc32_1[2]^BYTE(crcTable[index],2);
		Crc32_1[2]=Crc32_1[1]^BYTE(crcTable[index],1);
		Crc32_1[1]=Crc32_1[0]^BYTE(crcTable[index],0);
		Crc32_1[0]=lpData[tmpj]^index;
   	}
	crcEnd=*(DWORD *)(&Crc32_1[0]);
	//...get ddd[3]
	BYTE buffer[8];
	*(DWORD *)(&buffer[0])=crcBefore;
	*(DWORD *)(&buffer[4])=crcEnd;
	for(tmpj=4;tmpj>0;tmpj--)
	{
		for(tmpi=0;tmpi<256;tmpi++)
		{
			if(BYTE(crcTable[tmpi],3)==buffer[tmpj+3])
			{
				index=tmpi;
				break;
			}
		}
		*(DWORD *)(&buffer[tmpj])^=crcTable[index];
		*(DWORD *)(&buffer[tmpj-1])^=index;
	}
	ddd[3]=*(DWORD *)(&buffer[0]);


3.其它
f0,f1,f2,f3我没看懂是什么函数
不过,用它们的数据生成了几个图形,供参考。

总结:
1、学会了2分逼近法,真是爽,跳几次就能定位数据。
2、原来crc32是可逆的。

膜拜一下ccfer,fengyue,spark和老婆。顺祝大家中秋快乐。怎么fg好像失踪了?

参考CRC破解的文章:http://www.woodmann.com/fravia/crctut1.htm

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (29)
雪    币: 452
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
CuteSnail 2 2009-9-26 22:15
2
0
膜拜楼主,和同样厉害的老婆!
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小の白 2009-9-26 22:19
3
0
膜拜下 众牛。

国庆快乐 中秋快乐。
雪    币: 7300
活跃值: (3758)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 22 2009-9-26 22:20
4
0
CRC32也能穷举,速度很快

wangdell的老婆和你的老婆都是数学强人啊

为什么我老婆就不是呢。。
雪    币: 429
活跃值: (1875)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
riusksk 41 2009-9-26 22:27
5
0
楼主的老婆比楼主牛啊!鉴定完毕
雪    币: 440
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
hflywolf 1 2009-9-26 22:56
6
0
进来膜拜一下shellwolf和你老婆,都是强人!

也顺祝国庆快乐,中秋快乐!
雪    币: 32408
活跃值: (18750)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2009-9-26 23:10
7
0
这么厉害,每个男人背后有一个女人支持,一点不假。

估计在享受生活
雪    币: 418
活跃值: (63)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
zenghw 6 2009-9-26 23:27
8
0
学会了2分逼近法,真是爽,跳几次就能定位数据。

2分法在单调函数中超好用。。.   再次膜拜ccfer等~~
shellwolf兄的老婆是哪个??
膜拜啊!!
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2009-9-26 23:49
9
0
本人失踪,有事烧钱
雪    币: 8188
活跃值: (4243)
能力值: ( LV15,RANK:2459 )
在线值:
发帖
回帖
粉丝
ccfer 16 2009-9-26 23:52
10
0
发哥在百忙的享受中还不forgot来收钱
雪    币: 107
活跃值: (311)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Fido 2009-9-26 23:53
11
0
烧点儿给楼上的楼上吧....................
雪    币: 598
活跃值: (282)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
Fpc 4 2009-9-27 08:46
12
0
结论: 能不能在crackme大赛取得好成绩关键在于有没有好LP
雪    币: 1487
活跃值: (955)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
仙果 19 2009-9-27 08:55
13
0
超强悍。。。。
雪    币: 769
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pcintel 2009-9-27 09:17
14
0

  有个好老婆 貌似就成功了一半喔
雪    币: 257
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lykonglong 2009-9-27 09:37
15
0
如果有几个好老婆不知多么幸福!
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
hawking 12 2009-9-27 09:54
16
0
占位学习
雪    币: 388
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Cyane 1 2009-9-27 11:07
17
0
占位慢慢学习
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yingyue 2009-9-27 11:26
18
0
楼主&老婆 皆油菜  佩服
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
moonife 8 2009-9-27 11:39
19
0
看来得好好攻下高数了
收藏学习 谢谢了
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
zhuwg 11 2009-9-27 12:33
20
0
跟着学习学习
雪    币: 557
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
蚊香 3 2009-9-30 15:40
21
0
膜拜众大侠的LP
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Yslm 2009-10-1 07:06
22
0
膜拜所有人的老婆
雪    币: 224
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
山做黄金 2009-10-1 23:09
23
0
赶紧乘10.1找老婆!
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
天成 2009-10-2 10:35
24
0
楼主很厉害啊
雪    币: 401
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cyc703 2009-10-14 16:14
25
0
老婆是关键11111111
都是牛人
游客
登录 | 注册 方可回帖
返回