360破解大赛crackme分析--之3DES解密附加数据
具体的分析这里有。本人仅仅是对这里面有趣的算法进行了一些学习
这次是逆向的使用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"; //创建/获取一个password容器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 #endif3. 最后程序中的pBuffer中就是解密出来的数据