저는 잠시 동안 Windows XP Pro에서 64 비트 C 및 C++ 프로젝트 용 Visual Studio 2005를 사용하고 있습니다. 디버거에서 수시로 사용해온 인기있는 트릭 중 하나는 프로그램의 이전 디버깅 실행 (숫자 0x00000000FFAB8938
)에서 수치 포인터 값을 기억하고 적절한 유형 변환 (예 : ((MyObject *) 0x00000000FFAB8938)->data_field
)으로 윈도우를 추가하는 것이 었습니다. 다음 디버깅 실행 중에 객체가 차지하는 메모리를 관찰하십시오. 많은 경우 코드가 변경되지 않는 한 할당 된 메모리 레이아웃이 변경되지 않을 것으로 예상하는 것이 합리적이므로이 작업은 상당히 편리하고 유용한 작업입니다. 즉, 작동합니다.Windows Vista에서의 포인터 안정성
그러나 비교적 최근에 저는 Windows Vista (Home Premium) 64 비트가 탑재 된 랩톱에서 동일한 버전의 Visual Studio를 사용하기 시작했습니다. 이상하게도이 설정에서이 트릭을 사용하는 것이 훨씬 더 어렵습니다. 실제 메모리 주소는 아무런 이유없이 실행될 때마다, 즉 프로그램의 코드가 전혀 변경되지 않은 경우에도 자주 변경되는 것처럼 보입니다. 실제 주소는 완전히 무작위로 변하지 않는 것으로 보입니다. 고정 된 값의 고정 된 값 세트에서 하나의 값을 선택하지만,이 경우에는이 유형의 메모리를 보는 것이 훨씬 어렵습니다.
누구든지 Windows Vista에서이 동작이 발생하는 이유를 알고 있습니까? 무엇이 메모리 레이아웃의 변화를 일으키는가? 다른 [시스템] 프로세스의 프로세스 주소 공간에 외부 침입이 있습니까? 또는 Vista에서 Heap API 구현의 몇 가지 특징/기능입니까? 어떤 일이 일어나지 않도록 방지 할 방법이 있습니까?
Linux에서는 버퍼 오버 플로우 공격을 피하는 데 더 긴 시간이 소요됩니다. 어쩌면 그것은 MS에 의해서 마침내 구현 되었습니까? – jdehaan
글쎄, 나는 이것에 대해서 알고 있지만 AFAIK는 컴퓨터를 재부팅 할 때만 작동한다. 좀 더 정확히 말하자면 MS는 각 부팅시에 무작위 화하기 위해 버전을 구현했다고 들었습니다 (Linux에서 어떻게 작동하는지 모릅니다). 따라서 Vista에서 관찰 한 동작은 관련성이없는 것처럼 보입니다. – AnT
이것은 뭔가 일지 모르지만. 64 비트 응용 프로그램을 디버깅 할 수있는 32 비트 응용 프로그램 인 VS 2005를 실행하고 있습니다. AFAIK, MS의 원격 디버깅 메커니즘을 통해 작동합니다. VS 2005에서 64 비트 응용 프로그램을 시작할 때마다 Vista가 본질적으로 새로운 64 비트 환경을 "부팅"할 수 있습니까 (따라서 무작위 화가 일어날 수 있습니다)? – AnT