고흐의 연구실/etc..

byte 단위로 MD5 해시값 계산하기(C언어)

전고흐 2020. 11. 7. 01:50
728x90

 

코드섹션의 메모리 값을 긁어와서(HEX) 해시를 이용하여 무결성 검사를 하려했음.

그렇지만 코드섹션의 크기는 너무 커서 분할해서 MD5로 해시하기로함.

(MD5선정 이유 : 공간+시간면에서 다른 해시함수보다 지금 프로젝트에 알맞다고 판단)

 

MD5는 대부분 char* 형을 In하여 계산하는 경우가 많았음.

깃에서 BYTE를 In 하여 계산하는 코드를 발견했습니다!!!

github.com/bridgeythegeek/mbrmd5

 

이 코드는 메모리 첫 440바이트를 MD5 계산하여 덤프까지 뜨는 기능을 가지고 있음

 

일단 난 MD5 계산하는 부분만 발췌,

여기서 data는 In, md5는 Out

 

코드섹션을 512바이트로 반복문을 돌려 넣어주어 MD5계산을 했습니당

 

//BYTE buff[512];
BOOL calcMD5(byte* data, LPSTR md5)
{
	HCRYPTPROV hProv = 0;
	HCRYPTHASH hHash = 0;
	BYTE rgbHash[16];
	DWORD cbHash = 0;
	CHAR rgbDigits[] = "0123456789abcdef";

	// Get handle to the crypto provider
	if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
	{
		printf("ERROR: Couldn't acquire crypto context!\n");
		return FALSE;
	}

	if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
	{
		CryptReleaseContext(hProv, 0);
		printf("ERROR: Couldn't create crypto stream!\n");
		return FALSE;
	}

	if (!CryptHashData(hHash, data, BYTES_TO_HASH, 0))
	{
		CryptReleaseContext(hProv, 0);
		CryptDestroyHash(hHash);
		printf("ERROR: CryptHashData failed!\n");
		return FALSE;
	}

	cbHash = 16;
	if (CryptGetHashParam(hHash, HP_HASHVAL, rgbHash, &cbHash, 0))
	{
		for (DWORD i = 0; i < cbHash; i++)
		{
			sprintf(md5 + (i * 2), "%c%c", rgbDigits[rgbHash[i] >> 4], rgbDigits[rgbHash[i] & 0xf]);
		}

		CryptDestroyHash(hHash);
		CryptReleaseContext(hProv, 0);
		return TRUE;
	}
	else
	{
		printf("ERROR: CryptHashData failed!\n");
		CryptDestroyHash(hHash);
		CryptReleaseContext(hProv, 0);
		return FALSE;
	}
}

 

visual studio 빌드 오류가 뜬다면, #define _CRT_SECURE_NO_WARNINGS를 넣어줍시당(sprintf)

 

 

짝짝짝

 

감사합니다.

728x90