미친해커

[C] Rlibloaderapi.h - GetRemotePeb 본문

C/Remote libloaderapi.h

[C] Rlibloaderapi.h - GetRemotePeb

미친해커 2022. 2. 17. 13:33
반응형

RtlGetCurrentPeb

RtlGetCurrentPeb 함수는 ntdll.dll의 함수이다. 해당 함수는 현재 프로세스의 PEB 구조체의 주소를 반환해준다. 해당 함수 또한 현재 프로세스의 PEB 주소만 구할 수 있고 다른 프로세스의 PEB 구조체의 주소를 구하기 위해서는 NtQueryInformationProcess 라고 하는 커널 함수를 사용해야한다. (물론 해당 커널 함수를 사용해 PEB 구조체의 주소를 구해주는 다른 WINAPI도 존재한다. 하지만 내부적으로는 대부분 해당 커널 함수를 사용한다.)

 

물론 여기까지 윈도우 시스템에 대해서 공부한 사람이랑 그냥 커널 함수를 쓰고 말겠지만 해당 커널 함수를 사용하면 다른 정보도 같이 구해지기 때문에 불필요한 공간을 사용하게 된다. 그렇기에 해당 함수를 사용하여 정확하게 PEB 구조체의 주소만 구해주는 함수를 제작하였다.

GetRemotePeb

PVOID GetRemotePeb(HANDLE ProcessHandle)
{
    PROCESS_BASIC_INFORMATION pbi = { 0, };
    NtQueryInformationProcess(ProcessHandle, ProcessBasicInformation, &pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL);
#ifdef _WIN64
    BOOL bWow64Process;
    IsWow64Process(ProcessHandle, &bWow64Process);
    return bWow64Process ? (ULONG_PTR)pbi.PebBaseAddress + 0x1000 : pbi.PebBaseAddress;
    // WOW64로 돌아가는 32bit 프로세스의 PEB 구조체의 주소는 0x1000을 더해줘야 한다. 원인은 모르겠다.
#else
    return pbi.PebBaseAddress;
#endif
}

사용예시

#include <stdio.h>
#include "Rlibloaderapi.h"

int main()
{
    DWORD PID;
    printf("PID : ");
    scanf("%d", &PID);
    
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
    
    if (hProcess == NULL)
    {
    	printf("OpenProcess Failed\n");
        printf("GetLastError : %d\n", GetLastError());
        return -1;
    }
    
    printf("PEB : 0x%p", GetRemotePeb(hProcess));
    
    return 0;
}

 

반응형
Comments