2015-01-17 6 views
1

Я новичок здесь, я надеюсь, что я делаю это правильно.md5 для exe не дает ожидаемого дайджест

Я сделал C++ приложение, которое вычисляет MD5 хэш-дайджест для файлов следующих майкрософт реализации в этой связи http://msdn.microsoft.com/en-us/library/windows/desktop/aa382380%28v=vs.85%29.aspx случай является md5 хэш-дайджеста является правильным для любого файла типа при сравнении его с любым готовым инструментом, который вычисляет MD5 , кроме случаев, когда файл в руках является исполняемым, например cmd.exe. хеш-дайджест отличается и зависит от местоположения exe. если вы переместите cmd.exe в другое место, тогда дайджест станет другим. поэтому я продолжал реализовывать ту же функциональность, используя библиотеку openssl, чтобы справиться с той же проблемой. Я заметил, что хеш-дайджест из реализации microsoft и openssl тот же. поэтому я думаю, что есть что-то не хватает в чтении файла, прежде чем передавать его, чтобы вычислить дайджест. но я искал много, чтобы ничего не найти. Я пробовал читать файл, используя «createfile» из win API и «fopen», чтобы дать тот же результат ... так что, пожалуйста, помогите мне в этом, что мне не хватает?

здесь исходный код

#include "stdafx.h" 
#include <stdio.h> 
#include <windows.h> 
#include <Wincrypt.h> 

#define BUFSIZE 1024 
#define MD5LEN 16 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    DWORD dwStatus = 0; 
    BOOL bResult = FALSE; 
    HCRYPTPROV hProv = 0; 
    HCRYPTHASH hHash = 0; 
    HANDLE hFile = NULL; 
    BYTE rgbFile[BUFSIZE]; 
    DWORD cbRead = 0; 
    BYTE rgbHash[MD5LEN]; 
    DWORD cbHash = 0; 
    CHAR rgbDigits[] = "abcdef"; 
    LPCWSTR filename=L"C:\\Windows\\System32\\cmd.exe"; 
    // Logic to check usage goes here. 

    hFile = CreateFile(filename, 
     GENERIC_READ, 
     FILE_SHARE_READ, 
     NULL, 
     OPEN_EXISTING, 
     FILE_FLAG_SEQUENTIAL_SCAN, 
     NULL); 

    if (INVALID_HANDLE_VALUE == hFile) 
    { 
     dwStatus = GetLastError(); 
     printf("Error opening file %s\nError: %d\n", filename, 
      dwStatus); 
     return dwStatus; 
    } 

    // Get handle to the crypto provider 
    if (!CryptAcquireContext(&hProv, 
     NULL, 
     NULL, 
     PROV_RSA_FULL, 
     CRYPT_VERIFYCONTEXT)) 
    { 
     dwStatus = GetLastError(); 
     printf("CryptAcquireContext failed: %d\n", dwStatus); 
     CloseHandle(hFile); 
     return dwStatus; 
    } 

    if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) 
    { 
     dwStatus = GetLastError(); 
     printf("CryptAcquireContext failed: %d\n", dwStatus); 
     CloseHandle(hFile); 
     CryptReleaseContext(hProv, 0); 
     return dwStatus; 
    } 

    while (bResult = ReadFile(hFile, rgbFile, BUFSIZE, 
     &cbRead, NULL)) 
    { 
     if (0 == cbRead) 
     { 
      break; 
     } 

     if (!CryptHashData(hHash, rgbFile, cbRead, 0)) 
     { 
      dwStatus = GetLastError(); 
      printf("CryptHashData failed: %d\n", dwStatus); 
      CryptReleaseContext(hProv, 0); 
      CryptDestroyHash(hHash); 
      CloseHandle(hFile); 
      return dwStatus; 
     } 
    } 

    if (!bResult) 
    { 
     dwStatus = GetLastError(); 
     printf("ReadFile failed: %d\n", dwStatus); 
     CryptReleaseContext(hProv, 0); 
     CryptDestroyHash(hHash); 
     CloseHandle(hFile); 
     return dwStatus; 
    } 

    cbHash = MD5LEN; 
    if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0)) 
    { 
     printf("MD5 hash of file %s is: ", filename); 
     for (DWORD i = 0; i < cbHash; i++) 
     { 
      printf("%c%c", rgbDigits[rgbHash[i] >> 4], 
       rgbDigits[rgbHash[i] & 0xf]); 
     } 
     printf("\n"); 
    } 
    else 
    { 
     dwStatus = GetLastError(); 
     printf("CryptGetHashParam failed: %d\n", dwStatus); 
    } 

    CryptDestroyHash(hHash); 
    CryptReleaseContext(hProv, 0); 
    CloseHandle(hFile); 

    return dwStatus; 


    return 0; 
} 

этот код вычисляет хэш «59a1d4facd7b333f76c4142cd42d3aba» с другой стороны «цифровой вулкан Хэш инструмент» и «md5 и ша контрольная утилита v2.1» вычисляет хэш " fc0b4a626881d7c5980d757214db2d25 "

+3

Мы не можем знать, чего вам не хватает - мы не знаем, что у вас есть. Пожалуйста, прочитайте http://stackoverflow.com/help/mcve – Mat

+1

Хэш-файл md5 файла должен быть независимым от пути, если он не является проблемой с кодом md5. – drescherjm

+0

Я добавил исходный код – user4464366

ответ

3

Ваш код верный! Вы столкнулись с идиосинкразией Windows.

Файл, который вы читаете, находится в каталоге C:\Windows\System32.

В 64-разрядной Windows, если 32-разрядное приложение пытается получить доступ к этому каталогу it gets redirected до C:\Windows\SysWow64.

Как есть cmd.exe файлы в обоих C:\Windows\System32 и C:\Windows\SysWow64, но они разные сборки и поэтому различные хэши, программы проверки хэш C:\Windows\System32\cmd.exe будет давать разные результаты в зависимости от того, являются ли они 32-битные или 64-бит.

Вы можете увидеть это сами, создав свою примерную программу как 32-разрядной, так и 64-битной и наблюдая, что они дают разные ответы.

+1

спасибо, очень дорогой. – user4464366