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 
#endif
3. 最后程序中的pBuffer中就是解密出来的数据


附件下载

http://download.csdn.net/detail/xiaocaiju/7417093

原文地址:https://www.cnblogs.com/wzzkaifa/p/6762487.html