PEB란?
프로세스의 정보를 담고 있는 구조체
방대한 크기
문서화 된 내용
PEB 접근 방법
앞에 TEB설명가지고 생각해보면
FS:[30] = TEB.ProcessEnvironmentBlock = address of PEB
이런 공식을 구할 수 있다.
이 공식을 어셈블리 코드로 만들어보면
방법1. 바로 PEB 주소 구하는 방법
MOV EAX, DWORD PTR FS:[30] ; FS[30] = address of PEB |
방법2. TEB 주소 구하고 ProcessEnvironmentBlock멤버를 이용하는 방법
MOV EAX, DWORD PTR FS:[18] ; FS[18] = address of TEB MOV EAX, DWORD PTR DS:[EAX+30] ; DS[EAX+30] = address of PEB |
올리디버거로 PEB 구조체를 확인하기 위해 아무 프로그램이나 올려보고 명령어를 입력해보자
MOV EAX, DWORD PTR FS:[30]이거 입력하면 됨
그럼 새로 입력한 명령어를 실행 시키고 나면 EAX 레지스터에 PEB 주소가 입력된다.
PEB 구조체 정의
typedef struct _PEB {
BYTE Reserved1[2];
BYTE BeingDebugged;
BYTE Reserved2[1];
PVOID Reserved3[2];
PPEB_LDR_DATA Ldr;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
BYTE Reserved4[104];
PVOID Reserved5[52];
PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
BYTE Reserved6[128];
PVOID Reserved7[1];
ULONG SessionId;
} PEB, *PPEB;
운영체제 별로 PEB 구조체 내용은 다른데 Windows 7의 PEB 구조체가 Windows XP SP3보다 크다..
PEB 중요 멤버 설명
+002 BeingDebugged : UChar
+008 ImageBaseAddress : Ptr32 Void
+00c Ldr : Ptr32 _PEB_LDR_DATA
+018 ProcessHeap : Ptr32 Void
+068 NtGlobalFlag : Uint4B
PEB.BeingDebugged
Kernel32!IsDebuggerPResent()라는 API는 일반 응용 프로그램 개발에는 잘 사용 안함.
BOOL WINAPI IsDebuggerPresent(void); |
얘는 현재 프로세스가 디버깅 당하고 있는지 판단해서 결과 리턴하는 API
이 API가 참조하는 정보가 PEB.BeingDebugged 멤버
디버깅 중이면 1 아니면 0리턴한다.
PEB.ImageBaseAdress
이거는 프로세스의 ImageBase를 표시
HetModuleHandle() API는 ImageBase 얻는 API
PEB.Ldr
_PEB_LDR_DATA 구조체의 포인터
프로세스에 로딩된 모듈의 로딩 베이스 주소를 직접 구할 수 있는 방법을 제공함
_LIST_ENTRY는 양방향 연결 리스트 매커니즘을 제공 -> 프로세스에 로딩된 DLL 모듈마다 _LDR_DATA_TABLE_ENTRY 구조체가 하나씩 생성되고 이 구조체가 _LIST_ENTRY 양방향 연결 리스트로 연결됨
PEB.ProcessHeap & PEBNtBlobalFlag
안티 디버깅 기법에 사용
프로세스가 디버깅 중이라면 두 멤버는 특정 값을 가지는데 이걸로 안티디버깅한다.
'공부해요 > 리버싱_핵심원리' 카테고리의 다른 글
49. IA-32 Instruction (0) | 2025.01.12 |
---|---|
48. SEH (0) | 2025.01.08 |
46. TEB (1) | 2025.01.02 |
45. TLS 콜백 함수 (0) | 2025.01.02 |
44. InjDll.exe-DLL 인젝션 전용 도구 (0) | 2024.12.26 |