ENGLISH page is here.
GET DinopSearchBar
サイト内検索:
HOME
VC++ TIPS
ダウンロード
DinopExifReader
DinopSearchBar
DinopSearchBar mini
DinopTabbingBar
for Firefox
大阪湾の生き物
甲子園浜の自然
甲子園浜の干潟
甲子園浜の水中
甲子園浜の野鳥
近畿の山々
植物図鑑
箕面マップ
水中機材
カメラ
ランキング
望遠鏡の世界
顕微鏡の世界
Googleのすべて
GoogleマップAPI
ニュース
読んだ本
日記
変な料理の作り方
遺伝子操作
論文紹介
デイトレード
自動売買でFX
ネットで小遣い稼ぎ
Solaris
電子工作
その他
問い合わせ
VC++用コード集
大阪湾の生き物
水中用機材
since:2000/11/15
dinopcom@gmail.com
www.dinop.comは
だいのっぷ・どっと・こむ
と読んでください。







« 拡張子から関連付けされている実行ファイル取得 | メイン | BIOS情報の取得 »

ファイルハッシュの計算(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;
}








Copyright (c) 1999-2007 issei. All rights reserved. (運営者情報