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);
}
(完)