프로그램에서 메모리가 할당되는 위치를 확인하는 가장 좋은 방법은 디버거를 사용하는 것입니다. 로드 된 모든 DLL과 실행 파일 자체에 대한 할당이 있으며 모두 가상 메모리 조각입니다. 또한 C/C++ 라이브러리 및 Windows API를 사용하면 응용 프로그램에 힙이 만들어져 최소한의 가상 메모리가 예약됩니다.
예를 들어 VirtualAlloc을 사용하여 비교적 작은 프로그램에서 가상 메모리를 대량 확보 할 수 있으며 VirtualAlloc이 실패하거나 나중에 새 DLL (등)을로드하려고 할 때 응용 프로그램이 실패하는 경우에만 찾을 수 있습니다. 로드 할 DLL과 위치를 항상 제어 할 수는 없습니다. 많은 A/V 및 기타 제품이 시작되는 동안 실행중인 모든 프로세스에 DLL을 주입합니다. 이런 일이 발생하면, 해당 DLL은 종종로드 주소에서 첫 번째 선택을합니다. 즉, 기본적으로 컴파일/링크 된 것입니다. 일반적인 32 비트 Windows 응용 프로그램의 사용 가능한 2GB 가상 주소 공간 중 DLL이 해당 주소 공간의 중간에 큰 소리로로드되면 획득 할 수있는 최대 할당/예약 크기는 1GB 미만입니다.
windbg를 사용하면 어떤 메모리 영역이 사용되는지, 예약되어 있는지 확인할 수 있습니다. lm 명령은 모든 DLL과 EXE 및 해당 범위의로드 주소를 표시합니다. ! vadump 명령은 프로세스와 페이지 보호에 사용되는 모든 가상 메모리를 보여줍니다. 페이지 보호는 거기에 무엇이 있는지에 대한 큰 힌트입니다. 예를 들어, 64 비트 calc.exe 프로세스의 다음 (부분)! 대충 률에서 첫 번째 영역은 단순히 액세스로부터 보호되는 가상 메모리의 범위입니다. (다른 것들 중에서도 이것은 주소 0에 메모리를 할당하지 못하게합니다.) MEM_COMMIT은 메모리가 RAM 또는 페이징 파일에 의해 백업됨을 의미합니다. PAGE_READWRITE는 힙 메모리이거나로드 된 모듈의 데이터 세그먼트 일 수 있습니다. PAGE_READEXECUTE는 일반적으로로드되어 lm이 생성 한 목록에 표시되는 코드입니다. MEM_RESERVE는
0:004> !vadump
BaseAddress: 0000000000000000
RegionSize: 0000000000010000
State: 00010000 MEM_FREE
Protect: 00000001 PAGE_NOACCESS
BaseAddress: 0000000000010000
RegionSize: 0000000000010000
State: 00001000 MEM_COMMIT
Protect: 00000004 PAGE_READWRITE
Type: 00040000 MEM_MAPPED
BaseAddress: 0000000000020000
RegionSize: 0000000000003000
State: 00001000 MEM_COMMIT
Protect: 00000002 PAGE_READONLY
Type: 00040000 MEM_MAPPED
내가 그 일을 설명 도움이되기를 바랍니다 ... 뭔가 메모리 영역을 예약에서 VirtualAlloc를 호출 한 의미하지만, 그것은 등 가상 메모리 관리자에 의해 매핑되지 않고있다. Windbg은 훌륭한 도구이며 메모리가 사용되는 위치를 찾는 데 도움이되는 많은 확장 기능을 제공합니다.
정말로 힙에 대해 신경 쓰면, 힙을보십시오.
Microsoft Security Essentials는 원본 질문에 링크 된 "프로파일 러"응용 프로그램에 Win32.Bisar! rts 트로이 목마가 포함되어 있다고 생각합니다. –