본문 바로가기

My Study/etc

초기화되지 않은 메모리 초기화 값

아마 다들 리버싱을 하면서 또는 VS에서 디버깅을 해보면서 메모리 값을 많이 봐왔을 탠데.. 초기화되지 않은 메모리 값에는 이상한 값이 설정되어 있는 것을 볼 수 있을 것입니다. ( 디버그 모드로 컴파일 됬을 때 )
단순히 위와 같이 코드를 짜고 디버그모드로 a값을 확인해 보면 0xcccccccc이라는 값을 확인할 수 있을 것입니다.
그러면 저러한 초기화 값은 누가 정할까요? Visual Studio가 정해주겠지요.

Visual Studio가 정해주는 초기화 값이 정해진게 있습니다.
0xCC : 초기화 되지 않은 변수에 자동으로 할당해 주는 값
0xCD : malloc이나 new로 할당된 메모리, 힙이 되겠습니다.
0xDD : free나 delete로 해제된 메모리, 해제된 힙 영역인거 같네요.
0xFD : 할당된 메모리를 감싸는데 사용되는 값이라네요.
0xAB LocalAlloc() 에 의해 할당된 메모리
0xBAADF00D LocalAlloc() 의 첫번째 인자가 LMEM_FIXED옵션으로 설정되서 할당된 경우

 LMEM_FIXED 옵션Allocates fixed memory ( 고정된 메모리로 할당 )

이 정도가 될 수 있겠습니다. 자세한 내용은
여기를 들어가시면 알 수 있겠습니다.

몇개 직접 보여드리고 끝내겠습니다. 하지만 직접해보면서 위 설명과 실제 결과가 쫌 다른 것을 볼 수 있었습니다.
위 설명이 틀린건지 모르겠는데.. 아래 값들도 한번 봐주시길 바랍니다.

1. malloc 으로 메모리 할당


2. LocalAlloc으로 할당 ( 첫번째 매개변수 : LMEM_FIXED )


설명에는 malloc으로 할당하면 0xCD값이 설정이 된다고 했는데 실제 결과는 위와 같이 설정이 되어있었습니다.
그래서 두 함수 전부 내부에 어떠한 ntdll라이브러리 함수를 사용하는지 봐본 결과
RtlAllocateHeap 이라는 함수를 사용하고 있었습니다. 그래서 메모리 초기화 값이 같은거 같습니다.
너무 설명을 믿으려 하지말고 의심나는 부분은 직접 해보면서 보시는게 더욱 정확한 값이 될 것입니다.

여기서 설명하고 싶었던 내용은 VS에서는 초기화되지 않은 메모리가 있으면 특정 값으로 초기화를 해준다는 것과
메모리 위치와 할당 방식에 따라 초기화 값이 달라진다는 것을 말씀드리고 싶었습니다.

제가 실험한 환경은 Windows7 - VS2008에서 실험했습니다.


'My Study > etc' 카테고리의 다른 글

C0000374 예외코드  (2) 2010.05.01
눈에 보이는 만큼의 Heap 구조  (4) 2010.04.30
곰플레이어 신기한 기능  (0) 2010.04.18
한글 깨짐 현상  (0) 2010.04.17
CPU 사용량, Idle 프로세스  (0) 2010.04.14