详细的分析这里有,本人只是对这里面有趣的算法进行了一些学习
这次是逆向的使用3DES解密的过程中的内容:
使用微软的crypt库 使用3DES解密程序中的附加数据
代码:
VOID encryptData()
{
TCHAR szModuleFile[MAX_PATH] = "C:\\Users\\Administrator\\Desktop\\破解技术考题 360\\破解考题.over";
HANDLE hFile = ::CreateFile(szModuleFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
if (!hFile)
{
AfxMessageBox("createfile error");
return;
}
DWORD dwFileSize = 0;
dwFileSize = ::GetFileSize(hFile, NULL);
DWORD dwError = ::GetLastError();
TCHAR *pBuffer = new TCHAR[dwFileSize*2];
memset(pBuffer, 0, sizeof(pBuffer));
DWORD dwReaded = 0;
::ReadFile(hFile, pBuffer, dwFileSize, &dwReaded, NULL);
TCHAR pText[] = "dfe963a6";
//创建/获取一个密码容器CSP
HCRYPTPROV hProv;
TCHAR pszContentName[] = "Microsoft Enhanced RSA and AES Cryptographic Provider";
if (!::CryptAcquireContext(&hProv, NULL, pszContentName, 0x18, 0))
{
DWORD dwError = ::GetLastError();
AfxMessageBox("cryptAcquireContext error");
return ;
}
//创建/获取/导入一个密钥
HCRYPTHASH hHash;
if (!CryptCreateHash(hProv, 0x8003, 0, 0, &hHash))
{
AfxMessageBox("cryptcreateHash error");
return ;
}
//使用密钥进行加密/解密
::CryptHashData(hHash, (BYTE*)pText, strlen(pText), NULL);
HCRYPTKEY hKey;
::CryptDeriveKey(hProv, 0x660E, hHash, 0x800000, &hKey); //CALG_AES_128 0x660E 0x800000
::CryptDecrypt(hKey, 0, TRUE, 0, (BYTE*)pBuffer, &dwFileSize); //0
::CryptDestroyKey(hKey);
::CryptDestroyHash(hHash);
::free(pBuffer);
::CloseHandle(hFile);
}
测试环境:
1. 使用ffi将crackme中的附加数据导出来,当做这个程序的输入数据使用
2.使用微软的加密库时的设置
在stdafx.h中加入这么几行代码:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
3. 最后程序中的pBuffer中就是解密出来的数据