- 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]
'@안티치트' 카테고리의 다른 글
실제 프로그램에 적용해보기(메모리 읽고 쓰기) (0) | 2018.11.05 |
---|---|
프로세스 메모리 읽고 쓰기(ASLR) (0) | 2018.10.05 |
다른 프로세스의 메모리 읽기 (0) | 2018.10.05 |
START! (0) | 2018.10.05 |