首页
社区
课程
招聘
[原创]第一阶段第一题KeyGen核心代码
发表于: 2007-8-25 12:26 3992

[原创]第一阶段第一题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日开班!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 281
活跃值: (3435)
能力值: ( LV12,RANK:610 )
在线值:
发帖
回帖
粉丝
2
中间用了内联汇编,好像不合比赛规则,开始时没太注意,呜呜~~~
2007-8-25 12:30
0
游客
登录 | 注册 方可回帖
返回