티스토리 뷰
http://paladin.tistory.com/100
1. 프로세스 ID로 핸들을 얻는다.
HANDLE OpenProcess(PROCESS_ALL_ACCESS, FALSE, 프로세스ID)
2. 얻어온 핸들로 메모리 읽고/쓰기
BOOL ReadProcessMemory(핸들, (LPVOID)메모리주소, &저장할변수, 읽어올크기, NULL)
BOOL WriteProcessMemory(핸들, (LPVOID)주소, (LPCVOID)&변수, 저장할데이터크기, NULL)
크기를 데이터(주조체)형으로 지정하면 데이터형 만큼 읽고/쓴다.
3. 읽고/쓰기하고 닫기
BOOL ClosrHandle(핸들)
참고> 64비트 프로세스에서 32비트 프로세스의 메모리를 읽을때는 대체로 문제없으나
64비트 프로세스에서 32비트 프로세스의 메모리에서 읽어온 구조체 안에 포인터 변수가 있는 경우 64비트주소에서 상위 32비트가 0xFDFDFD(상황에 따라 채워지는 값이 다름)로 채워지는 문제가 있어 이를 제거해야 했다.
((UINT64)RpData.lpData & 0xFFFFFFFF)
*******************
다른 프로세스의 메모리 접근을 위한 PROCESS_VM_READ/PROCESS_VM_WRITE, PROCESS_VM_OPERATION 접근 권한이 있어야 하며 권한 지정은 OpenProcess() 호출할때 첫번째 인수로 지정한다.
ReadProcessMemory/WriteProcessMemory API는 대상 핸들을 지정해서 호출하면 그 메모리 공간의 지정 범위와 이쪽 프로세스 버퍼와의 사이에서 서로 복사한다. 단, 메모리 접근이 금지된 영역을 읽고/쓰려면 에러가 난다.