-
-
[原创]第一阶段第二题
-
发表于:
2008-10-7 08:52
2955
-
逆出来的检查序列号的函数
void fun(DWORD Sn[]/*35h*/, BYTE OutPut[], DWORD arg[])
{
DWORD i = 0, j = 0, iOutPut = 0, l = 0, m = 0, k = 0, qwer, asdf, tyu, hjk, temp;
int local72 = 0, local73 = 0;
DWORD buff[0x30], arr[4][4];
for (i = 0; i < 0x0C; i++)
buff[i] = 0x1E;
if (Sn[0] > 0)
l = 0x0C / Sn[0];
while (m < 2)
{
if (k > 0)
buff[arg[k-1]] = 0x1E;
k = 0;
while (k < 0x0C)
{
if (k > 0)
buff[arg[k-1]] = 0x1E;
if (m == 0)
{
buff[arg[k]] = 0x28;
k++;
}
if (m == 1)
{
buff[arg[k]] = 0x14;
k++;
}
for (i = 0; i < Sn[0]; i++)
{
temp = 0;
for (j = 0; j < l; j++)
{
arr[i][j] = buff[temp];
temp++;
}
}
qwer = 0; asdf = 0;
for (i = 0; i < l; i++)
{
qwer += arr[Sn[1]][i];
asdf += arr[Sn[2]][i];
}
if (qwer == asdf)
{
if (arr[Sn[3]][Sn[4]] == arr[Sn[5]][Sn[6]])
{
if (arr[Sn[7]][Sn[8]] == arr[Sn[9]][Sn[10]])
OutPut[iOutPut++] = 0x6C;
else
OutPut[iOutPut++] = 0x6B;
}
else
{
if (arr[Sn[7]][Sn[8]] == arr[Sn[9]][Sn[10]])
OutPut[iOutPut++] = 0x6A;
else
OutPut[iOutPut++] = 0x69;
}
}
if (qwer > asdf)
{
i = 0;tyu = 0;hjk = 0;
arr[Sn[1]][Sn[11]] = arr[Sn[12]][Sn[13]];
arr[Sn[1]][Sn[14]] = arr[Sn[15]][Sn[16]];
arr[Sn[1]][Sn[17]] = arr[Sn[18]][Sn[19]];
arr[Sn[2]][Sn[20]] = arr[Sn[21]][Sn[22]];
arr[Sn[2]][Sn[23]] = arr[Sn[24]][Sn[25]];
arr[Sn[2]][Sn[26]] = arr[Sn[27]][Sn[28]];
while (i < l)
{
tyu += arr[Sn[1]][i];
hjk += arr[Sn[2]][i];
i++;
}
//内层检查
if (tyu > hjk)
{
if (arr[Sn[29]][Sn[30]] == arr[Sn[31]][Sn[32]])
OutPut[iOutPut++] = 0x65;
else
OutPut[iOutPut++] = 0x61;
}
if (tyu < hjk)
{
if (arr[Sn[33]][Sn[34]] > arr[Sn[35]][Sn[36]])
OutPut[iOutPut++] = 0x67;
else if (arr[Sn[33]][Sn[34]] < arr[Sn[35]][Sn[36]])
OutPut[iOutPut++] = 0x66;
else if (arr[Sn[33]][Sn[34]] = arr[Sn[35]][Sn[36]])
OutPut[iOutPut++] = 0x68;
}
if (tyu == hjk)
{
temp = 0;
for (i = 0; i < Sn[0]; i++)
{
for (j = 0; j < l; i++)
{
arr[i][j] = buff[temp];
temp++;
}
if (arr[Sn[37]][Sn[38]] > arr[Sn[39]][Sn[40]])
OutPut[iOutPut++] = 0x62;
else if (arr[Sn[37]][Sn[38]] < arr[Sn[39]][Sn[40]])
OutPut[iOutPut++] = 0x63;
else if (arr[Sn[37]][Sn[38]] == arr[Sn[39]][Sn[40]])
OutPut[iOutPut++] = 0x64;
}
}
if (qwer < asdf)
{
i = 0;
arr[Sn[1]][Sn[11]] = arr[Sn[12]][Sn[13]];
arr[Sn[1]][Sn[14]] = arr[Sn[15]][Sn[16]];
arr[Sn[1]][Sn[17]] = arr[Sn[18]][Sn[19]];
arr[Sn[2]][Sn[20]] = arr[Sn[21]][Sn[22]];
arr[Sn[2]][Sn[23]] = arr[Sn[24]][Sn[25]];
arr[Sn[2]][Sn[26]] = arr[Sn[27]][Sn[28]];
while (i < l)
{
local72 += arr[Sn[1]][i];
local73 += arr[Sn[2]][i];
i++;
}
//内层检查
if (local72 > local73)
{
if (arr[Sn[41]][Sn[42]] > arr[Sn[43]][Sn[44]])
OutPut[iOutPut++] = 66;
if (arr[Sn[41]][Sn[42]] < arr[Sn[43]][Sn[44]])
OutPut[iOutPut++] = 67;
if (arr[Sn[41]][Sn[42]] < arr[Sn[43]][Sn[44]])
OutPut[iOutPut++] = 68;
else if (local72 < local73)
{
if (arr[Sn[45]][Sn[46]] == arr[Sn[47]][Sn[48]])
OutPut[iOutPut++] = 0x65;
else
OutPut[iOutPut++] = 0x61;
}
}
else if (local72 == local73)
{
temp = 0;
for (i = 0; i < Sn[0]; i++)
{
for (j = 0; i <l; j++)
{
arr[i][j] = buff[temp];
temp++;
}
}
if (arr[Sn[49]][Sn[50]] > arr[Sn[51]][Sn[52]])
OutPut[iOutPut++] = 0x63;
else if (arr[Sn[49]][Sn[50]] < arr[Sn[51]][Sn[52]])
OutPut[iOutPut++] = 0x62;
else if (arr[Sn[49]][Sn[50]] == arr[Sn[51]][Sn[52]])
OutPut[iOutPut++] = 0x64;
}
}
m++;
}
}
如果经过序列号检查后生成的标志序列与用户名生成的标志序列一致,则通过检查
标志序列是一个描述原字符串中元素的大小关系的序列:key[i] = n (第i个元素在字符串中是第n大字母)
序列号是个由35h个0~3的数字组成的数字序列,第一个数字决定检查序列号时的arr数组是个几维的数组(必须为3),第二、三两位决定了需要计算和的是arr中的哪两行(二者不可以相等,只可以在0、1之间选择),3~10位决定了第一层检查的结果为等于时用生成哪些标志,11~28位决定了在内层检查时用哪些位覆盖哪些位,29~40位决定了第一层检查的结果为大于时用生成哪些标志,41~52位决定了第一层检查的结果为大于时用生成哪些标志
两组用户名/序列号
nukoabcdefgh
30120212022111212313121221321000101020102010201000102
abcedhijklmu
30120212022111212313121220321000101020102010201000102
====================
早上准备过来交key的时候才看到netwind的给shoooo的回复,没想到“符合规则的用户名”是这个意思,但是规则中的“在注册机中任意输入用户名”又让我吃不准,所以还是只交key了
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)