2013-01-06 3 views
2

얼마 전 C#에서 프로세스의 메모리를 읽고 특정 값 (예 : 정수 42의 모든 위치의 위치)을 찾는 메모리 스캐너를 만들었습니다. 그 이후로이 프로젝트를 다시 방문하여 64 비트 시스템에서 작동하도록 설계하려고합니다. 필자는 64 비트 프로세스에 최대 8TB의 가상 메모리 (32 비트 시스템의 겸손한 2 ~ 4GB에 비해)가 부여된다는 문제에 직면 해 있습니다. 필자의 코드에서 알맞은 시간 내에 0-8TB 범위의 모든 주소를 스캔하는 것은 불가능합니다.64 비트 스캔 메모리?

Process.MainModule.BaseAddress에서 스캔을 시작하려했지만 읽기를 중단해야하는 위치를 알지 못하고 중요한 값이 누락되었습니다. 프로세스를 실제로 사용하는 범위를 스캔 할 수 있도록 필드를 어떻게 제한합니까?

+4

프로세스의 메모리 맵을 얻어야합니다. "프로세스 메모리 맵"을 검색하면 시작할 수 있습니다. –

+0

프로세스 메모리 맵 및 유사한 용어를 검색했지만 페이징 및 가상 메모리 작동 방식에 대한 설명 만 찾을 수있었습니다. 유용한 정보 였지만 실제로 어떻게 생성을 달성하는지 또는 외부 프로세스의 메모리 맵을 보는 방법을 정확하게 지적하지는 못했습니다. 그러나 이로 인해 프로세스 가상 메모리를 탐색하는 다른 방법을 검토하게되었습니다. – user1881066

+0

'VirtualQueryEx'를 호출하는 주소 공간을 통한 스캐닝은 프로세스 메모리 맵을 생성하는 방법입니다. –

답변

2

VirtualQueryEx 라이브러리 메소드를 사용하여 어떤 섹션의 메모리 또는 가상 페이지가 사용되는지 알아 냈습니다. 이 함수를 사용하여 내 "메모리 맵"을 만들고 사용 된 페이지와 액세스 가능한 페이지를 식별했습니다. Pinvoke 여기에 이것을 수행하는 방법에 대한 좋은 예가 있습니다 : PInvoke Article

MEM_COMMIT 플래그가 지정된 가상 메모리 섹션을보고 사용 권한에 PAGE_GUARD가 포함되지 않았는지 확인하여 필요한 청크를 찾을 수있었습니다. 관련성이 높고 읽기 쉬운 메모리

+0

몇 가지 샘플 코드를 추가 한 다음 자신의 대답을 수락 할 수 있습니까? :) – Orwellophile

관련 문제