2007/03/16 14:25

C++ 에서 메모리 읽어오기~ (Process Memory)

프로세스에서 메모리 읽어오는 방식 (C++)

1. 프로세스를 얻어오는 방법

우선.. 윈도우의 핸들러를 얻어온다. 그리고 나서 이 핸들러를 이용하여
해당 윈도우의 프로세스 Pid를 읽어오면 되겠습니다~
그 후에 해당 프로세스를 열어줍니다. 프로그래밍에서 Open ~ Close 는 항상 기본입니다.
그리고 읽어온 프로세스 아이디를 이용해여 메모리를 읽어오면 끝~ 간단하죠?
그럼 어떻게 하는지 알아보도록 하겠습니다.

2. 간략한 코딩

::GetWindowThreadProcessId(m_UpdateWnd, &dwProcessId);
  m_ProcessId = dwProcessId;

여기서 m_UpdateWnd 는 현재 윈도우 핸들러이고 , GetWindowThreadProcessId() 함수를 통해서 dwProcessId 에 프로세스 아이디를 넣어주고 리턴합니다.

위 방식 말고 FindWindow() 라는 함수로 간단하게 프로세스 아이디를 가져올수도
있습니다~

그럼 이제 해당 프로세스를 열어야 하겠죠?

hProcess=::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);

위 함수가 바로 프로세를 열어주는 함수입니다.  여기서 PROCESS_ALL_ACCESS 는
해당 프로세스의 접근 권한입니다. 상수로 정의되어 있습니다.

리턴값은 해당 프로세스의 핸들러를 리턴해 줍니다. 그럼 이 핸들러를 통해서 메모리를
읽을수 있는겁니다.

이제 메모리를 읽기만 하면 되겠죠?

::ReadProcessMemory(hProcess, (LPVOID)dwAddress1, &dwValue1, iReadByte , &dwBytes);

위 함수를 통해서 해당 번지에 메모리를 읽어옵니다. 프로세스 핸들러를 통해서 메모리
번지를 읽어옵니다.

hProcess : 프로세스 핸들러
dwAddress1 : 메모리 번지
dwValue1 : 읽어온 값
iReadByte : 읽어올 바이트 수
dwBytes : 실제 읽어온 바이트 수

dwValue1 에는 메모리에서 읽어온 값을 리턴하구요,  iReadByte
에서는 메모리에서 읽어올 바이트를 지정해줍니다. dwBytes에는 실제 메모리에서 읽어온
바이트를 리턴해줍니다.

3. 프로세스 Close

이제 모든 작업이 끝나면 닫아주면 되겠습니다.

::CloseHandle(hProcess);

그럼 여기서 응용하면 간단한 프로세스 메모리 에디터를 만들수가 있습니다.
만들어보세요~ (저는 안만들어 봤습니다만.. -ㅅ-;) ㅋㅋ

크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 0