验证过程:
1.计算注册码的格式:xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx以及字符集合法性,见如下letter数组
2.一些移位操作计算出一个20字节的HASH值
3.对输入的用户名,后面追加C盘逻辑卷的序列号以及一个字符串"Tencent",用变形的类SHA1算法计算一个HASH值
4.比较前后两个,相同则ok
能看到注册码的格式把注册码分为四部分,其中每一组8Byte计算出5个BYTE,对应于用户名的HASH值。
计算部分如下,用户名那部分的代码就不贴了,抠出来就是。
DWORD USER_HASH[5]; //这里记录的是用户名+VolumeSerialNumber+Tencent最终生成的hash
char letter[] = "ABCDEFGHJKMNPQRSTVWXYZ1234567890";
char reg_code[4][9] = {0};
void CalcReg()
{
bool succ = false;
BYTE* byte_USER_HASH = (BYTE*)USER_HASH;
for(int i=0; i<4; i++)
{
int pos = i*5;
succ = false;
for(int a0=0; a0<32 && !succ; a0++)
{
for(int a1=0; a1<32 && !succ; a1++)
{
if ((((a0<<3)|(a1>>2))&0xFF) != byte_USER_HASH[pos])
continue;
for(int a2=0; a2<32 && !succ; a2++)
{
for(int a3=0; a3<32 && !succ; a3++)
{
if ((((a1<<6)|(a2<<1)|(a3>>4))&0xFF) != byte_USER_HASH[pos+1])
continue;
for(int a4=0; a4<32 && !succ; a4++)
{
if ((((a3<<4)|(a4>>1))&0xFF)!= byte_USER_HASH[pos+2])
continue;
for(int a5=0; a5<32 && !succ; a5++)
{
for(int a6=0; a6<32 && !succ; a6++)
{
if ((((a4<<7)|(a5<<2)|(a6>>3))&0xFF) != byte_USER_HASH[pos+3])
continue;
for(int a7=0; a7<32; a7++)
{
if((((a6<<5)|a7)&0xFF) == byte_USER_HASH[pos+4])
{
reg_code[i][0] = letter[a0];
reg_code[i][1] = letter[a1];
reg_code[i][2] = letter[a2];
reg_code[i][3] = letter[a3];
reg_code[i][4] = letter[a4];
reg_code[i][5] = letter[a5];
reg_code[i][6] = letter[a6];
reg_code[i][7] = letter[a7];
succ = true;
break;
}
}
}
}
}
}
}
}
}
}
}
- 标 题:第三题,抛砖引玉
- 作 者:coding
- 时 间:2010-10-24 12:06:18
- 链 接:http://bbs.pediy.com/showthread.php?t=123370