Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2012, 14:23   #1
sasha465
Пользователь
 
Регистрация: 09.10.2008
Сообщений: 10
По умолчанию Периодическая проверка хэша файла

Здравствуйте! Стоит у меня такая задача: обнаружить наличие каких-либо изменений в файле, просто обнаружить факт его изменения. Я решил периодически проверять хэш файла, т.е. сохранять каждый раз предыдущее значение и потом сверять с новым только что полученным хэшем. Проблема в том, что если в текстовом файле изменить только один символ(например добавить символ в конец текста), то в хэше этого изменения не отобразится, причем это правило не обязательно повторяется, иногда бывает так, что все таки хэш отличается и тогда выводится сообщение об этом. Вот функция, которая вызывается через каждые 5 секунд для проверки хэша файла:
PHP код:
void Test_Hash(HWND hwnd){
            
DWORD dwHashLen;
            
DWORD dwCount;
            
BYTEpbHash NULL;
            
DWORD wasRead=0;
            
DWORD dwFileSize=0;
            
LPCTSTR dataToSignFile=TEXT("C:\\text.txt");
            
char txt2[512];
            
BYTEszBuf2;
            
HCRYPTPROV hProv=0;
            
HCRYPTHASH hHash=0;
            
CryptAcquireContext(&hProvNULLNULLPROV_RSA_FULLCRYPT_VERIFYCONTEXT);
            
CryptCreateHash(hProv,CALG_MD5,0,0,&hHash);
            
dwFileSize=0;
                
hFile1 CreateFile(dataToSignFileGENERIC_READ0NULLOPEN_EXISTING0NULL);
                
dwFileSize GetFileSize (hFile1NULL); // размер файла, который будем хэшировать
                
szBuf2 = (BYTE*)(malloc(dwFileSize 1)); // выделяем место для содержимого файла
                
ZeroMemory(szBuf2dwFileSize 1);
                
wasRead=0;
                
ReadFile(hFile1szBuf2dwFileSize, &wasReadNULL);
                
CloseHandle(hFile1);
                
CryptHashData(hHash2, (BYTE*)szBuf2dwFileSize0);  // вычисляем хэш
                
dwCount sizeof(DWORD);
                
dwHashLen=0;
                
// получаем длину хэша
                
CryptGetHashParam(hHash2HP_HASHSIZE, (BYTE *)&dwHashLen,&dwCount0);
                 
// зная длину хэша выделяем под него буфер
                
pbHash =(BYTE*) malloc(dwHashLen);
                
// записываем хэш файла в pbHash
                
CryptGetHashParam(hHash2HP_HASHVALpbHash, &dwHashLen0);
                
//txt2[0]=0;
                // пробовал сравнивать хэши, переведя их в строки
                //sprintf(txt2,"%x",pbHash);
                //MessageBox(hwnd,txt2,_T("Сообщение"), MB_OK|MB_ICONERROR);
               // if(txt[0]!=0){
                // cpbHash - сюда записываем копию полученного хэша, чтобы потом с ней сравнивать
                
if(cpbHash!=NULL){
                    .
// сравнение областей памяти, в которые записаны хэши
                    
if( memcmp(pbHash,cpbHash,dwHashLen)!=0){
                   
// if( strcmp(txt,txt2)!=0 ){
                        
MessageBox(hwnd,_T("файл был изменен"),_T("Сообщение"), MB_OK|MB_ICONERROR);
                        }
                }
                
//txt[0]=0;
                
free(cpbHash);
                
// сохраняем в cpbHash полученный хэш
                
cpbHash=pbHash;
                
//sprintf(txt,"%x",pbHash);
                
free(szBuf2);
                
free(pbHash);
                
//strcpy(txt2,"");
                
CryptDestroyHash(hHash2);
                
CryptDestroyHash(hProv2);

sasha465 вне форума Ответить с цитированием
Старый 15.02.2012, 22:02   #2
men232
Пользователь
 
Регистрация: 11.05.2011
Сообщений: 59
По умолчанию

Попробуй MD5 хешь.

Код:
 String^ GetMD5HashFromFile(String^ fileName)
 {      
	 FileStream file(fileName, FileMode::Open);
	 MD5CryptoServiceProvider md5;
	 array<unsigned char>^ retVal = md5.ComputeHash(%file);

	 StringBuilder^ sBuilder = gcnew StringBuilder();
	 for (int i = 0; i < retVal->Length; i++)	{
		 sBuilder->Append(retVal[i].ToString("x2"));
	 }

	 return sBuilder->ToString()->ToUpper();
 }
men232 вне форума Ответить с цитированием
Старый 16.02.2012, 11:36   #3
sasha465
Пользователь
 
Регистрация: 09.10.2008
Сообщений: 10
По умолчанию

Цитата:
Сообщение от men232 Посмотреть сообщение
Попробуй MD5 хешь.

Код:
 String^ GetMD5HashFromFile(String^ fileName)
 {      
	 FileStream file(fileName, FileMode::Open);
	 MD5CryptoServiceProvider md5;
	 array<unsigned char>^ retVal = md5.ComputeHash(%file);

	 StringBuilder^ sBuilder = gcnew StringBuilder();
	 for (int i = 0; i < retVal->Length; i++)	{
		 sBuilder->Append(retVal[i].ToString("x2"));
	 }

	 return sBuilder->ToString()->ToUpper();
 }
А так я уже делал, получалось) Задача стоит на натив Си это же реализовать в WinAPI.
sasha465 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка архивов rar, zip, arj, 7z на наличие файла используя cmd-файла cerberochek Win Api 5 05.10.2011 19:26
расшифровка хэша Arinka Безопасность, Шифрование 8 02.03.2011 08:44
Копирование хэша из исходного кода eFail Работа с сетью в Delphi 3 19.08.2010 16:45
с++,периодическая функция Krezol Помощь студентам 4 24.02.2010 23:18
Проверка на наличие файла Vladya Общие вопросы Delphi 7 10.10.2009 01:26