1. 逆向工程
这个版本连一个注册界面也没有
 
 进去一看, 他打开了一个CRACKME32.KEY, 估计里面就是放key的, 于是我随便写了一些数字进去
 
 从CRACKME32.KEY中读取18个字节, 然后确认读取是否成功, 可见密码是18字节, 回去把密码长度改成18在重新调试
 
 接着把key值输入CalcHash函数内计算一个FinalHash值, 在将其与0x12345678进行异或
 
 其中hash计算的算法也非常简单, 从’A’开始与key进行异或加密操作, 每次key往前挪动1位, 'A’也自增1,每一位都累加到FinalHash中, 进行14次操作, 保留剩下4位, 最终获取结果后返回与x012345678进行异或
 
 把生成的FinalHash值作为参数传入
 
 获取字符串的最后4位
 
 把字符串最后4位和FinalHash进行对比, 如果一样, 那就代表成功否则失败。
 
2. 注册机编写
编写思路是首先随机生成14位字符串, 然后将其用crackme的hash算法进行计算后生成FinalHash, 将这生成的FinalHash拼接在最后即可
 核心代码:
VOID GenRandom(LPSTR* ppRandomStr, DWORD dwRandomStrLen)
{
	CHAR szHashTbl[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	srand((UINT)time(NULL));
	LPSTR pRandomStr = nullptr;
	pRandomStr = (LPSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwRandomStrLen + 1);
	if (!pRandomStr)
	{
		AfxMessageBox("Failed to gen key!");
		return;
	}
	for (size_t nIdx = 0; nIdx < dwRandomStrLen; ++nIdx)
	{
		pRandomStr[nIdx] = szHashTbl[rand() % (sizeof(szHashTbl) - 1)];
	}
	*ppRandomStr = pRandomStr;
}
void CKeyGenDlg::OnBnClickedBtnGen()
{
	// TODO: 在此添加控件通知处理程序代码
	DWORD dwFinalHash = 0;
	CHAR ch = 'A';
	CHAR szCrypto = 0;
	LPSTR pszKey = nullptr;
	HANDLE hFile = INVALID_HANDLE_VALUE;
	DWORD dwWritten = 0;
	BOOL fOk = FALSE;
	__try
	{
		GenRandom(&pszKey, 0x12);
		
		for (size_t nIdx = 0; nIdx < 0xE; ++nIdx)
		{
			szCrypto = pszKey[nIdx] ^ ch;
			++ch;
			dwFinalHash += szCrypto;
		}
		dwFinalHash ^= 0x12345678;
		RtlCopyMemory((pszKey + 0xE), &dwFinalHash, 4);
		hFile = CreateFile("CRACKME3.KEY",
			GENERIC_READ | GENERIC_WRITE,
			FILE_SHARE_READ | FILE_SHARE_WRITE,
			NULL,
			CREATE_ALWAYS,
			FILE_ATTRIBUTE_NORMAL,
			NULL);
		if (INVALID_HANDLE_VALUE == hFile)
		{
			__leave;
		}
		SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
		fOk = WriteFile(hFile, pszKey, 0x13, &dwWritten, NULL);
		if (fOk && dwWritten == 0x13)
		{
			SetDlgItemText(IDC_STATIC_STATUS, "Status:Success");
		}
		else
		{
			SetDlgItemText(IDC_STATIC_STATUS, "Status:Failed");
		}
	}
	__finally
	{
		if (pszKey)
		{
			HeapFree(GetProcessHeap(), 0, pszKey);
			pszKey = nullptr;
		}
		if (hFile != INVALID_HANDLE_VALUE)
		{
			CloseHandle(hFile);
			hFile = INVALID_HANDLE_VALUE;
		}
	}
}
 
结果如下:
 
 (完)



















