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
'고흐의 연구실 > etc..' 카테고리의 다른 글
FTZ (0) | 2021.02.04 |
---|---|
가상머신에 윈도우10 무료로 설치하기(개발용) (1) | 2020.11.09 |
[회고] 스파르타 코딩클럽 파이썬 혼자놀기 패키지 완료! (0) | 2020.10.11 |
[Reversing] 리버싱 기초 어셈블리어 알아보기(계속 작성중) (0) | 2020.10.01 |
[Reversing] if문 리버싱 (0) | 2020.10.01 |