1. 逆向分析过程
作者弄了很多个对话框来迷惑破解者, 然后真正有用的对话框只有这个
 
 这个窗口过程函数处理的是父窗口
 
 其他的不关心, 只关心WM_COMMAND消息
 
 里面有3个分支, 其中最重要的是按下register按钮的那个
 
 整个逻辑非常清晰, 其算法是把name的每个字符转成大写字母进行相加然后与0x5678进行异或算出hash
 
 这里通过对每个字减去0x20来达到大小写转换的目的, 然后相加
 
 最终的hash值和0x5678进行异或操作
 
 这里是计算serial key的算法就是把字符串数字转换成真实的数字, 然后与0x1234异或
 
 完成后两个hash值进行对比, 如果一样就是成功
2. 编写注册机
void CKeyGenDlg::OnBnClickedBtnGen()
{
	// TODO: 在此添加控件通知处理程序代码
	char szBuf[20] = {0};
	int iLen = 0;
	CString strName;
	DWORD dwSerialKey = 0;
	// 获取输入的name值
	GetDlgItemText(IDC_EDIT_NAME, strName);
	
	if (strName.IsEmpty())
	{
		MessageBox("Name can't be empty!");
		return;
	}
	iLen = strName.GetLength();
	if (iLen > 10)
	{
		MessageBox("Name length maximum: 10!");
		return;
	}
	strcpy_s(szBuf, sizeof(szBuf), strName.GetBuffer());
	char* pszName = szBuf;
	RtlZeroMemory(szBuf + iLen, sizeof(szBuf) - iLen);
	// 计算名字的hash值
	DWORD dwNameHash = 0;
	for (size_t nIdx = 0; nIdx < iLen; ++nIdx)
	{
		if (pszName[nIdx] < 'A')
		{
			return;
		}
		if (pszName[nIdx] >= 'Z')
		{
			pszName[nIdx] -= 0x20;
		}
		dwNameHash += pszName[nIdx];
	}
	dwNameHash ^= 0x5678;
	// 计算密码的hash值
	dwSerialKey = dwNameHash ^ 0x1234;
	SetDlgItemInt(IDC_EDIT_SERIAL, dwSerialKey);
}
(完)



















