2015-01-17 1 views
1

저는 여기에 새로운 사람입니다. exe에 대한 md5가 예상 다이제스트를 제공하지 않습니다.

나는 http://msdn.microsoft.com/en-us/library/windows/desktop/aa382380%28v=vs.85%29.aspx 경우는 MD5 다이제스트 계산 어떤 준비 도구와 비교하면 다이제스트는 모든 유형의 파일에 대한 올바른 MD5 해시입니다 링크에서 C++ MD5 해시는 다음과 같은 파일 다이제스트 계산 응용 프로그램 마이크로 소프트 구현했다 . 손에있는 파일이 cmd.exe와 같은 실행 파일 인 경우는 예외입니다. 해시 다이제스트는 다르며 exe의 위치에 따라 다릅니다. cmd.exe를 다른 위치로 이동하면 다이제스트가 다시 달라집니다. 그래서 같은 문제에 직면하기 위해 openssl 라이브러리를 사용하여 동일한 기능을 구현했습니다. 나는 마이크로 소프트 구현과 openssl에서 해시 다이제스트가 동일하다는 것을 알아 차렸다. 그래서 나는 다이제스트를 계산하기 위해 파일을 읽기 전에 파일을 읽지 못했다고 생각합니다. 그러나 나는 아무것도 찾지 못했다. 나는 승리 API에서 "createfile"을 사용하여 파일을 읽고 "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; 
} 

이 코드는 반면 "디지털 화산 해시 도구"와 "MD5 및 SHA 체크섬 유틸리티 2.1은"해시를 계산 "에 해시"59a1d4facd7b333f76c4142cd42d3aba " 을 계산이다 fc0b4a626881d7c5980d757214db2d25 "

+3

누락 된 부분을 알 수 없으므로 보유하고있는 정보를 모릅니다. – Mat

+1

md5 코드에 문제가없는 경우 파일의 md5 해시가 경로와 독립적이어야합니다. – drescherjm

+0

나는 – user4464366

답변

3

코드가 정확합니다! Windows의 특이성을 경험했습니다.

읽고있는 파일은 C:\Windows\System32 디렉토리 안에 있습니다.

32 비트 응용 프로그램이 해당 디렉토리 it gets redirected에서 C:\Windows\SysWow64에 액세스하려고 시도하는 경우 64 비트 Windows에서. 이 C:\Windows\System32C:\Windows\SysWow64 모두 cmd.exe 파일이 있습니다,하지만 그들은 C:\Windows\System32\cmd.exe의 해시를 확인하는 프로그램들이 32 비트 또는 64 비트있어 여부에 따라 다른 결과를 줄 것이다, 빌드 등 다른 해시 다르다으로

.

32 비트 및 64 비트 모두 예제 프로그램을 작성하고 각기 다른 대답을 제공한다는 사실을 관찰하여 직접 확인할 수 있습니다.

+1

대단히 감사합니다. – user4464366