在c ++中获取dll文件的md5哈希码

时间:2014-10-10 19:28:39

标签: c++ hash

大家好我想尝试dll md5 hash但是它一直都返回相同的值,我做错了什么? 当我试图getHash时,这个dll已经加载了 我正在使用getHash()方法获取哈希并使用CalcHash计算它

先进的。

#define BUFSIZE 1024
#define MD5LEN  16
int CalcHash(HANDLE hFile, char *md5sum)
{
    BOOL bResult = FALSE;
    HCRYPTPROV hProv = 0;
    HCRYPTHASH hHash = 0;
    BYTE rgbFile[BUFSIZE];
    DWORD cbRead = 0;
    BYTE rgbHash[MD5LEN];
    DWORD cbHash = 0;
    CHAR rgbDigits[] = "0123456789abcdef";

    char byt[3];
    int rc, err;

    rc = CryptAcquireContext(&hProv, NULL, MS_STRONG_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);

    if(!rc)
    {
        err = GetLastError();
        if(err==0x80090016)
        {
            //first time using crypto API, need to create a new keyset
            rc=CryptAcquireContext(&hProv, NULL, MS_STRONG_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET);
            if(!rc)
            {
                err=GetLastError();
                return 0;
            }
        }
    }

    CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);

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

        CryptHashData(hHash, rgbFile, cbRead, 0);
    }

    cbHash = MD5LEN;
    CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0);
    md5sum[0] = 0;

    for (DWORD i = 0; i < cbHash; i++)
    {
        sprintf(byt, "%c%c", rgbDigits[rgbHash[i] >> 4], rgbDigits[rgbHash[i] & 0xf]);
        strcat(md5sum, byt);
    }

    CryptDestroyHash(hHash);
    CryptReleaseContext(hProv, 0);
    return 1;
}

char *getHash()
{
    CalcHash(L"dsetup.dll", md5sum);
    Logger(md5sum);
    return md5sum;
} 

0 个答案:

没有答案