- 2018-03-10 ~ (P1) - 프로세스 자신의 메모리 읽기

1. 프로세스 자기 자신의 핸들 얻기

1-1 GetCurrentProcess()로 핸들 얻기

1-2  1) GetCurrentProcessId()로 pId 얻기

         2) OpenProcess()로 핸들 얻기


2. ReadProcessMemory()로 base address(0x00400000)부터 10바이트만큼 읽어서 버퍼에 저장

3. 버퍼 출력

※ x86 빌드, ASLR off



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
int main() {
    HANDLE handle1,openPro;
    int processId, buf[20= { 0 };
    int errCode;
    SIZE_T readSize;
    DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(),
        &handle1, 0, TRUE, DUPLICATE_SAME_ACCESS);
    //DuplicateHandle : 현재 프로세스의 진짜 핸들을 얻는 함수 . handel1에 핸들이 들어가게 됨
    processId = GetCurrentProcessId(); //GetCurrentProcessId : 리턴 값은 호출 프로세스의 프로세스 ID
    openPro = OpenProcess(PROCESS_ALL_ACCESS,FALSE, processId); 
//OpenProcess : 프로세스 핸들 얻어오는 함수
    ReadProcessMemory(handle1,(LPCVOID)0x400000,buf,10,&readSize);
    //ReadProcessMemory()로 base address(0x00400000)부터 10바이트만큼 읽어서 버퍼에 저장
    errCode = GetLastError();
    printf("%d\n", errCode);
    printf("Handle(GetCurrentProcess): %d\n", handle1);
    printf("Handle(OpenProcess): %d\n", openPro);
    printf("ProcessId(GetCurrentProcessId): %d\n", processId);
    printf("ReadProcessMemory read size : %d \n", readSize);
    printf("읽은 10바이트: ");
    for (int i = 0; i < 10; i++) {
        printf("%#02x ", buf);
    }
    return 0;
}
cs


GetCurrentProcess()

HANDLE WINAPI GetCurrentProcess(void);

현재 실행되고 있는 프로세스(위의 함수를 호출한 프로세스)의 핸들을 반환값을 통해 얻을수있다.

GetCurrentProcess() 함수로 구하는 핸들은 가짜(Pseudo) 핸들이다.

핸들 테이블에 등록되지 않은 핸들이다. 이 함수에서 반환되는 핸들은 현재 실행중인 프로세스를 참조하기 위한 용도로

정의해 놓은 상수가 반환된다. 



DuplicateHandle()

현재 프로세스의 진짜 핸들을 얻고 싶다면 이 함수를 사용하면 된다.

1
2
3
4
5
6
7
8
9
10
11
BOOL WINAPI DuplicateHandle
( _In_   HANDLE hSourceProcessHandle, //복제할 핸들을 소유하는 프로세스
  _In_   HANDLE hSourceHandle, //복제할 핸들 _In_   
  HANDLE hTargetProcessHandle, //복제된 핸들을 소유할 프로세스
  _Out_  LPHANDLE lpTargetHandle, //복제된 핸들값을 저장한 변수의 주소 
  _In_   DWORD dwDesiredAccess, //복제할 핸들의 접근권한 
  _In_   BOOL bInheritHandle, //복제할 핸들의 상속여부 
  _In_   DWORD dwOptions //옵션 );
 
 
 
cs


사용법


1
2
3
4
5
HANDLE hProcess;
 
DuplicateHandle(GetCurrentProcess(),GetCurrentProcess(),GetCurrentProcess(),
 
&hProcess,0,TRUE,DUPLICATE_SAME_ACCESS);
cs


출처: http://hypen1117.tistory.com/entry/DuplicateHandle-현재-프로세스의-진짜-핸들을-얻는-함수 [For the]








+ Recent posts