ファイルハッシュの計算(SIPハッシュ)

解説


   CryptCATAdminCalcHashFromFileHandleを利用して実行ファイル取得する。


#include "atlstr.h"

//
//	ファイルハッシュ計算
//
//	Windows2000/XP以降有効のCryptCATAdminCalcHashFromFileHandleを利用
//	生成されるハッシュはSIPハッシュ(MD5ハッシュではない!)
//
bool	CalcFileSIPHash(LPCTSTR pszFileName,CAtlString& strHash)
{
	BOOL (CALLBACK* pfn_CryptCATAdminCalcHashFromFileHandle)(HANDLE hFile,DWORD* pcbHash,BYTE* pbHash,DWORD dwFlags);

	HMODULE		hDLL;
	BOOL		ret;
	BYTE		pbHash[40];
	DWORD		cbHash = sizeof(pbHash);
	HANDLE		hFile;
	DWORD		i;
	CAtlString	strBuff;

	strHash = _T("");
	if(pszFileName == NULL)
		return	false;

	////////////////////////////////////////////
	//	DLLからCryptCATAdminCalcHashFromFileHandleを取得
	//

	//DLLのロード
	hDLL = ::LoadLibrary(_T("wintrust.dll"));
	if(hDLL == NULL)
		return	false;

	//関数の取得
	(FARPROC&)pfn_CryptCATAdminCalcHashFromFileHandle = ::GetProcAddress(hDLL,"CryptCATAdminCalcHashFromFileHandle");
	if(pfn_CryptCATAdminCalcHashFromFileHandle == NULL)
	{
		::FreeLibrary(hDLL);

		//mscat32.dllに関数があることもある(Windows2000)
		//今後のOSでどうなるか不明なのでOSチェックはしていない(取得できれば成功)

		//DLLのロード
		hDLL = ::LoadLibrary(_T("mscat32.dll"));
		if(hDLL == NULL)
			return	false;

		//関数の取得
		(FARPROC&)pfn_CryptCATAdminCalcHashFromFileHandle = ::GetProcAddress(hDLL,"CryptCATAdminCalcHashFromFileHandle");
		if(pfn_CryptCATAdminCalcHashFromFileHandle == NULL)
		{
			::FreeLibrary(hDLL);
			return	false;
		}
	}


	////////////////////////////////////////////
	//	ハッシュ計算
	//

	ret = FALSE;

	//ファイルオープン
	hFile = ::CreateFile(pszFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if(hFile != INVALID_HANDLE_VALUE)
	{
		//ハッシュ計算
		ret = pfn_CryptCATAdminCalcHashFromFileHandle(hFile, &cbHash, pbHash,0);

		//ファイルの開放
		::CloseHandle(hFile);
	}

	//DLLの開放
	::FreeLibrary(hDLL);
	if(ret == FALSE)
		return	false;


	////////////////////////////////////////////
	//	文字列に変換(HEX2BIN)
	//

	//文字列に変換
	for(i = 0; i < cbHash; i++)
	{
		//非常に効率が悪い!!
		strBuff.Format("%02X",pbHash[i]);
		strHash += strBuff;
	}

	return	true;
}

カテゴリー「VC++ TIPS」 のエントリー