-
-
[原创]第一阶段第一题KeyGen核心代码
-
发表于:
2007-8-25 12:26
3992
-
这个CrackMe对每一个用户名都有多种解。
这个KeyGen只能给出其中一种解。
欢迎探讨!
void CKeyGenDlg::OnGenerate()
{
char szName[16] = {0};
char szSerial[4096] = {0};
char szBuf[10] = {0};
int i;
int len=0;
unsigned long sum=0;
len = GetDlgItemText(IDC_NAME, szName, 16);
if(len < 1) return;
__asm
{
xor eax, eax
xor edx, edx
mov ecx, len
mov ebx, 13572468h
l1:
movsx eax, szName[edx]
add eax, ebx
imul eax, 3721273h
add eax, 24681357h
mov esi, eax
shl esi, 19h
sar eax, 7
or esi, eax
inc edx
cmp edx, ecx
mov ebx, esi
jl short l1
mov sum, esi
}
for(i=1; i<9; i++)
szBuf[i] = (char)((sum >> i) & 0x00000001);
szBuf[9] = 1;
kc = 0;
memset(kres, 0, 4096);
memcpy(karr, szBuf, 10);
ks0(9);
for(i=0; i<kc; i++)
{
char c;
unsigned int d;
d = sum>>(i%31);
d = d%10;
if(kres[i] < d)
d = kres[i] + 10 - d;
else
d = kres[i] - d;
d = d%10;
c = d + '0';
szSerial[i] = c;
}
SetDlgItemText(IDC_SERIAL, szSerial);
}
void CKeyGenDlg::ks0(int n)
{
if(n == 1)
{
if(karr[n] != 0)
{
karr[n] = 0;
kres[kc++] = n;
}
}
else
{
ks1(n-1);
if(karr[n] != 0)
{
karr[n] = 0;
kres[kc++] = n;
}
ks0(n-1);
}
}
void CKeyGenDlg::ks1(int n)
{
if(n == 1)
{
if(karr[n] != 1)
{
karr[n] = 1;
kres[kc++] = n;
}
}
else
{
ks1(n-1);
if(karr[n] != 1)
{
karr[n] = 1;
kres[kc++] = n;
}
ks0(n-1);
}
}
[培训]科锐逆向工程师培训第53期2025年7月8日开班!