2017-02-08 9 views
0

NtQueryInformationProcess을 사용하면 PROCESS_BASIC_INFORMATION 유형의 반환 된 구조체에서 PebBaseAddress 필드를 읽으면 현재 프로세스 기본 주소를 얻을 수 있습니다.왜 현재 프로세스의 핸들과 함께 ReadProcessMemory()를 사용합니까?

처음 몇 바이트가 자세한 프로세스 정보를 나타내는 포인터를 포함하므로 ReadProcessMemory()을 사용하여 현재 프로세스의 기본 주소와 관련하여 메모리를 읽는 코드를 보았습니다. 나는 또한이 정보의 일부를 얻을 필요가 있었다. 그리고 research는 나에게 그 방법을 가르쳤다.

그러나 현재 프로세스에서 메모리를 읽을 때 ReadProcessMemory()이 필요한 이유는 아직도 혼란 스럽습니다. 프로세스 기반과 관련된 포인터가 역 참조 될 수 없거나 세그멘테이션 오류가 발생할 수 있습니까? 포인터는 프로세스 기반과 관련하여 유지됩니까?

+1

필요하지 않습니다. 시험해보기 만하면 쉽게 확인할 수 있습니다. –

+0

ReadProcessMemory는 다른 프로세스의 메모리를 읽는 데 널리 사용됩니다. 귀하의 경우에는 포인터를 사용할 수 있습니다. – Asesh

+0

@HansPassant 단순히 시도해도 가능한 모든 인스턴스에서 성공할 것이라고 보장 할 수는 없습니다. –

답변

2

ReadProcessMemory은 자신의 프로세스에있는 주소 범위가 유효한지 확인하고 충돌이 아닌 문제의 경우 오류 (ERROR_PARTIAL_COPY)를 반환합니다.

그 외의 이유는 없습니다. 포인터가 정확하다고 확신한다면 memcpy을 사용하면됩니다.