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;
}
}
}
结果如下:
(完)