首页
社区
课程
招聘
[结束][第一阶段◇第二题]看雪论坛.腾讯公司2008软件安全技术竞赛
发表于: 2008-10-5 11:54 20843

[结束][第一阶段◇第二题]看雪论坛.腾讯公司2008软件安全技术竞赛

2008-10-5 11:54
20843
收藏
免费 0
支持
分享
最新回复 (223)
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
176
5555只有一对注册码,不知道会不会给个1半的1半分
2008-10-7 11:43
0
雪    币: 111
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
177
呵呵,感谢netwind老大,正如老大所说,耐心很重要噢,哈,也要静心噢
今早睡不着,静静的,没想着那题了(已经放弃N次了),可心却又想到那去了啊(不甘心啊),想想昨晚怎么弄不出来,嘿,灵光一闪,把思维逆了下,呵呵,变得跃跃欲试了,于是又拿起了笔竿子,笔画起来了,这次心还真静,感觉越做越顺,又苦战了三个来小时 ,呵呵,一不小心就出了结果
2008-10-7 11:44
0
雪    币: 136
活跃值: (40)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
178
一直被套在里面了。思路没打开
可以算出前帮段,可以后半段key怎么也对不上。
放弃了。哎
期待大牛的方法。
2008-10-7 11:56
0
雪    币: 136
活跃值: (40)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
179
时间过了,大牛发个思路出来吧。参考一下
2008-10-7 12:01
0
雪    币: 221
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
180
呵呵,GAME OVER 了,把源码放出来吧,让大家欣赏一下
2008-10-7 12:03
0
雪    币: 136
活跃值: (40)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
181
源码和逆向出来的代码差别应该不太大。
主要是希望作者讲讲设计思路和破解思路。
2008-10-7 12:05
0
雪    币: 8209
活跃值: (4600)
能力值: ( LV15,RANK:2504 )
在线值:
发帖
回帖
粉丝
182
似乎所有的名字都可以用同一个key
keygen不需要算法,输出固定的字符串就行了
2008-10-7 12:06
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
183
膜                拜
2008-10-7 12:10
0
雪    币: 993
活跃值: (442)
能力值: ( LV12,RANK:403 )
在线值:
发帖
回帖
粉丝
184
我自己的感觉是只要注册名中的各个字符按从小到大排序的名次顺序一致,它们的注册码就可以完全一样,比如abcdefghijkl和mnopqrstuvwx完全可以套用同一个注册码。
2008-10-7 12:10
0
雪    币: 5851
活跃值: (4812)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
185
注册码可以有多个,用户名可以有多个
任意一个注册码可以对应任意一个注册名

谢谢ccfer参与,膜拜!
2008-10-7 12:12
0
雪    币: 8209
活跃值: (4600)
能力值: ( LV15,RANK:2504 )
在线值:
发帖
回帖
粉丝
186
744K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0x3$3x3r3c8G2j5#2)9J5k6h3y4G2L8g2)9J5c8Y4y4Z5L8%4N6i4k6h3u0Q4x3V1j5H3i4K6u0r3x3q4)9J5c8U0t1#2x3o6p5@1x3#2)9J5k6h3q4K6M7s2R3`.
2008-10-7 12:13
0
雪    币: 186
活跃值: (15)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
187
30121202220111212313121222323000101020102010201000102
2008-10-7 12:16
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
188
15eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8G2M7r3W2U0i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8Y4c8Q4x3V1j5J5x3o6l9K6x3o6j5I4y4#2)9J5c8U0l9&6i4K6u0r3x3e0V1J5x3K6M7I4z5g2)9J5k6h3S2@1L8h3H3`.

就是这个12球的问题,哈哈,欢迎Netwind给大家讲解下
2008-10-7 12:16
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
189
啊,我以为是只有abcdefghijkl这几个字母
2008-10-7 12:17
0
雪    币: 5851
活跃值: (4812)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
190
ccfer把算法模型推出来了?  再次膜拜!
2008-10-7 12:17
0
雪    币: 993
活跃值: (442)
能力值: ( LV12,RANK:403 )
在线值:
发帖
回帖
粉丝
191
不知道逆的对不对,刚才看了netwind贴出的说明才明白大致的模型原理,一直没想明白注册机该从何下手。
if (strlen(g_szRegName) != 0xC) return 1;
for(i=0; i<strlen(g_szRegName); i++)
{
	if (g_szRegName[i] < 0x61) return 1;
	if (g_szRegName[i] >= 0x7A) return 1;
}
//dwSortIndex数组存放注册名中各字母按从小到大排序的名次
for(j=0; j<0xC; j++)
{
	n = g_szRegName[0];
	l = 0;
	for(i = 1; i < strlen(g_szRegName); i++)
	{
		if ((n == g_szRegName[i]) && (n != 0x7A)) return 1;
		if (n > g_szRegName[i])
		{
			n = g_szRegName[i];
			l = i;
		}
	}
	dwSortIndex[l] = j;
	g_szRegName[l] = 0x7A;
}
if (strlen(g_szRegCode) < 0x35) return 1;
for(i=0; i<strlen(g_szRegCode); i++)
{
	if (var_2B0[i] = g_szRegCode[i]-0x30) > 3) return 1;
}
chOutBuf[24] = 0;
fn(&var_2B0, &chOutBuf, &dwSortIndex);
pchOutBuf = &chOutBuf;
for(k=0; k<2; k++,pchOutBuf += 0xC)
{
	for(j=0; j<0xC; j++)
	{
		n = pchOutBuf[0];
		l = 0;
		for(i=1; i<strlen(pchOutBuf)&&(i<0xC); var4++)
		{
			if (n == pchOutBuf[i]) && (n != 0x7A) return 1;
			if (n > pchOutBuf[i])
			{
				n = pchOutBuf[i];
				l = i;
			}
		}
		if (k == 0)
			dwOutSortIndex1[l] = j;
		else
			dwOutSortIndex2[l] = j;
		pchOutBuf[l] = 0x7A;
	}
}
//只要出来的两组数据按字母从小到大排序后和注册名的一致就算成功
for(i=0; i<0xC; i++)
{
	if (dwSortIndex[i] != dwOutSortIndex1[i])||(dwSortIndex[i] != dwOutSortIndex2[i])||(dwOutSortIndex1[i] != dwOutSortIndex2[i]) return 1;
}
return 0;

void fn(int dwRegCode[53], char chOutBuf[24], int dwSortIndex[12])
{
	int i, j, k, l, m, n, p, q, r, s, t, x, y;
	int dwTemps[12];
	int dwTempd[48];

	l = 0;
	for(i=0; i<0xC; i++) dwTemps[i] = 0x1E;
	m = 0;
	if (dwRegCode[0] > 0) m = 0xC/dwRegCode[0];
	n = 0;
	for(r=0; r<2; r++)
	{
		if (n > 0) dwTemps[dwSortIndex[n-1]] = 0x1E;
		for(n=0; n<0xC;)
		{
			if (n > 0) dwTemps[dwSortIndex[n-1]] = 0x28;
			if (r == 0) dwTemps[dwSortIndex[n]] = 0x28;
			if (r == 1) dwTemps[dwSortIndex[n]] = 0x14;
			n++;
			for(k=0,i=0; i<dwRegCode[0]; i++)
			{
				for(j=0; j<m; j++)
				{
					dwTempd[i*4+j] = dwTemps[k];
					k++;
				}
			}
			p = 0;
			q = 0;
			for(i=0; i<m; i++)
			{
				p += dwTempd[dwRegCode[1]*4+i];
				q += dwTempd[dwRegCode[2]*4+i];
			}
			if (p == q)
			{
				if (dwTempd[dwRegCode[3]*4+dwRegCode[4]] == dwTempd[dwRegCode[5]*4+dwRegCode[6]])
				{
					if (dwTempd[dwRegCode[7]*4+dwRegCode[8]] == dwTempd[dwRegCode[9]*4+dwRegCode[10]])
					{
						chOutBuf[l] = 0x6C;
						l++;
					}
					else
					{
						chOutBuf[l] = 0x6B;
						l++;
					}
				}
				else
				{
					if (dwTempd[dwRegCode[7]*4+dwRegCode[8]] == dwTempd[dwRegCode[9]*4+dwRegCode[10]])
					{
						chOutBuf[l] = 0x6A;
						l++;
					}
					else
					{
						chOutBuf[l] = 0x69;
						l++;
					}
				}
			}
			if (p > q)
			{
				dwTempd[dwRegCode[1]*4+dwRegCode[11]] = dwTempd[dwRegCode[12]*4+dwRegCode[13]];
				dwTempd[dwRegCode[1]*4+dwRegCode[14]] = dwTempd[dwRegCode[15]*4+dwRegCode[16]];
				dwTempd[dwRegCode[1]*4+dwRegCode[17]] = dwTempd[dwRegCode[18]*4+dwRegCode[19]];
				dwTempd[dwRegCode[2]*4+dwRegCode[20]] = dwTempd[dwRegCode[21]*4+dwRegCode[22]];
				dwTempd[dwRegCode[2]*4+dwRegCode[23]] = dwTempd[dwRegCode[24]*4+dwRegCode[25]];
				dwTempd[dwRegCode[2]*4+dwRegCode[26]] = dwTempd[dwRegCode[27]*4+dwRegCode[28]];
				s = 0;
				t = 0;
				for(i=0; i<m; i++)
				{
					s += dwTempd[dwRegCode[1]*4+i];
					t += dwTempd[dwRegCode[2]*4+i];		
				}
				if (s > t)
				{
					if (dwTempd[dwRegCode[29]*4+dwRegCode[30]] == dwTempd[dwRegCode[31]*4+dwRegCode[32]])
					{
						chOutBuf[l] = 0x65;
						l++;
					}
					else
					{
						chOutBuf[l] = 0x61;
						l++;
					}
				}
				if (s < t)
				{
					if (dwTempd[dwRegCode[33]*4+dwRegCode[34]] > dwTempd[dwRegCode[35]*4+dwRegCode[36]])
					{
						chOutBuf[l] = 0x67;
						l++;
					}
					if (dwTempd[dwRegCode[33]*4+dwRegCode[34]] < dwTempd[dwRegCode[35]*4+dwRegCode[36]])
					{
						chOutBuf[l] = 0x66;
						l++;
					}
					if (dwTempd[dwRegCode[33]*4+dwRegCode[34]] == dwTempd[dwRegCode[35]*4+dwRegCode[36]])
					{
						chOutBuf[l] = 0x68;
						l++;
					}
				}
				if (s == t)
				{
					k = 0;
					for(i=0; i<dwRegCode[0]; i++)
					{
						for(j=0; j<m; j++)
						{
							dwTempd[i*4+j] = dwTemps[k];
							k++;
						}
					}
					if (dwTempd[dwRegCode[37]*4+dwRegCode[38]] > dwTempd[dwRegCode[39]*4+dwRegCode[40]])
					{
						chOutBuf[l] = 0x62;
						l++;
					}
					if (dwTempd[dwRegCode[37]*4+dwRegCode[38]] < dwTempd[dwRegCode[39]*4+dwRegCode[40]])
					{
						chOutBuf[l] = 0x63;
						l++;
					}
					if (dwTempd[dwRegCode[37]*4+dwRegCode[38]] == dwTempd[dwRegCode[39]*4+dwRegCode[40]])
					{
						chOutBuf[l] = 0x64;
						l++;
					}
				}
			}
			if (p < q)
			{
				dwTempd[dwRegCode[1]*4+dwRegCode[11]] = dwTempd[dwRegCode[12]*4+dwRegCode[13]];
				dwTempd[dwRegCode[1]*4+dwRegCode[14]] = dwTempd[dwRegCode[15]*4+dwRegCode[16]];
				dwTempd[dwRegCode[1]*4+dwRegCode[17]] = dwTempd[dwRegCode[18]*4+dwRegCode[19]];
				dwTempd[dwRegCode[2]*4+dwRegCode[20]] = dwTempd[dwRegCode[21]*4+dwRegCode[22]];
				dwTempd[dwRegCode[2]*4+dwRegCode[23]] = dwTempd[dwRegCode[24]*4+dwRegCode[25]];
				dwTempd[dwRegCode[2]*4+dwRegCode[26]] = dwTempd[dwRegCode[27]*4+dwRegCode[28]];
				x = 0;
				y = 0;
				for(i=0; i<m; i++)
				{
					x += dwTempd[dwRegCode[1]*4+i];
					y += dwTempd[dwRegCode[2]*4+i];
				}
				if (x > y)
				{
					if (dwTempd[dwRegCode[41]*4+dwRegCode[42]] > dwTempd[dwRegCode[43]*4+dwRegCode[44]])
					{
						chOutBuf[l] = 0x66;
						l++;
					}
					if (dwTempd[dwRegCode[41]*4+dwRegCode[42]] < dwTempd[dwRegCode[43]*4+dwRegCode[44]])
					{
						chOutBuf[l] = 0x67;
						l++;
					}
					if (dwTempd[dwRegCode[41]*4+dwRegCode[42]] < dwTempd[dwRegCode[43]*4+dwRegCode[44]])
					{
						chOutBuf[l] = 0x68;
						l++;
					}
				}
				if (x < y)
				{
					if (dwTempd[dwRegCode[45]*4+dwRegCode[46]] == dwTempd[dwRegCode[47]*4+dwRegCode[48]])
					{
						chOutBuf[l] = 0x65;
						l++;
					}
					else
					{
						chOutBuf[l] = 0x61;
						l++;
					}
				}
				if (x == y)
				{
					k = 0;
					for(i=0; i<dwRegCode[0]; i++)
					{
						for(j=0; j<m; j++)
						{
							dwTempd[i*4+j] = dwTemps[k];
							k++;
						}
					}
					if (dwTempd[dwRegCode[49]*4+dwRegCode[50]] > dwTempd[dwRegCode[51]*4+dwRegCode[52]])
					{
						chOutBuf[l] = 0x63;
						l++;
					}
					if (dwTempd[dwRegCode[49]*4+dwRegCode[50]] < dwTempd[dwRegCode[51]*4+dwRegCode[52]])
					{
						chOutBuf[l] = 0x62;
						l++;
					}
					if (dwTempd[dwRegCode[49]*4+dwRegCode[50]] == dwTempd[dwRegCode[51]*4+dwRegCode[52]])
					{
						chOutBuf[l] = 0x64;
						l++;
					}
				}
		  }              
		}
	}
}
2008-10-7 12:19
0
雪    币: 7498
活跃值: (4229)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
192
楼上的int dwTempd[16]
应该改成 int dwTempd[6][4]
2008-10-7 12:22
0
雪    币: 993
活跃值: (442)
能力值: ( LV12,RANK:403 )
在线值:
发帖
回帖
粉丝
193
[QUOTE=海风月影;517983]楼上的int dwTempd[16]
应该改成 int dwTempd[6][4][/QUOTE]
在源代码中没看到它对应的空间大小,从实现上看应该是个2维数组,而且第二维应该是4,
因为程序中用到shl 4,不知6从何得出?
2008-10-7 12:27
0
雪    币: 221
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
194
好像是12×4的数组
2008-10-7 12:29
0
雪    币: 7498
活跃值: (4229)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
195
是12*4的数组,最多能用到6*4的空间
2008-10-7 12:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
196
ccfer你多大?
为何如此强大...
2008-10-7 12:35
0
雪    币: 107
活跃值: (444)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
197
yd啊!!!!!!!!!!!!!!!!!!!!
2008-10-7 12:39
0
雪    币: 221
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
198
人家是GIRL,真能轻易告知,
2008-10-7 13:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
199
有这么强大的G?
不可能~~~
2008-10-7 13:34
0
雪    币: 239
活跃值: (11)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
200
很强,很强...
2008-10-7 14:45
0
游客
登录 | 注册 方可回帖
返回