PEB - рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЪрд░рдг рдореЗрдВ рдмреВрдЯрд▓реЛрдбрд░ рджреНрд╡рд╛рд░рд╛ рднрд░реА рдЧрдИ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрд░рдЪрдирд╛, рдЬрд┐рд╕рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг, рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ (LDR_DATA) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА, рд╡рд░реНрддрдорд╛рди рдореЙрдбреНрдпреВрд▓ рдкрд░ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдХрдИ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдВрдбреЛ рдПрдкрд┐ рдЬреЛ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ (рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреАрдИрдмреА рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП ReadProcessMemory рдХрд╣рддреЗ рд╣реИрдВред
TEB - рдПрдХ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХрд╛ рдЕрдкрдирд╛ TEB рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рдВрдбреЛрдЬ рдкрд░ W6464 рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рдмреНрд▓реЙрдХ рдФрд░ рджреЛ рдереНрд░реЗрдб рдкрд░реНрдпрд╛рд╡рд░рдг рдмреНрд▓реЙрдХ рд╣реИрдВред TEB MmCreateTeb рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, PEB MmCreatePeb рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдпрджрд┐ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдЖрдк ReactOS рд╕реНрд░реЛрддреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ WinDBG рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рд▓рдХреНрд╖реНрдп рдПрдХ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреАрдИрдмреА рдХреЛ рдмрджрд▓рдирд╛ рдерд╛ред
TEB рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд╣реИрдВ:
typedef struct _CLIENT_ID { DWORD UniqueProcess; DWORD UniqueThread; } CLIENT_ID, *PCLIENT_ID; typedef struct _THREAD_BASIC_INFORMATION { typedef PVOID KPRIORITY; NTSTATUS ExitStatus; PVOID TebBaseAddress; CLIENT_ID ClientId; KAFFINITY AffinityMask; KPRIORITY Priority; KPRIORITY BasePriority; } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
[TEB+0] SEH . [TEB+4] , . [TEB+8] , . [TEB+18] TEB. [TEB+30] PEB.
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзрд╛рдЧреЗ рдХреА TEB рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк NtQueryInformationThread рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
#include <Windows.h> #include <stdio.h> #pragma comment(lib,"ntdll.lib") typedef struct _CLIENT_ID { DWORD UniqueProcess; DWORD UniqueThread; } CLIENT_ID, *PCLIENT_ID; typedef struct _THREAD_BASIC_INFORMATION { typedef PVOID KPRIORITY; NTSTATUS ExitStatus; PVOID TebBaseAddress; CLIENT_ID ClientId; KAFFINITY AffinityMask; KPRIORITY Priority; KPRIORITY BasePriority; } THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION; typedef enum _THREADINFOCLASS { ThreadBasicInformation, ThreadTimes, ThreadPriority, ThreadBasePriority, ThreadAffinityMask, ThreadImpersonationToken, ThreadDescriptorTableEntry, ThreadEnableAlignmentFaultFixup, ThreadEventPair_Reusable, ThreadQuerySetWin32StartAddress, ThreadZeroTlsCell, ThreadPerformanceCount, ThreadAmILastThread, ThreadIdealProcessor, ThreadPriorityBoost, ThreadSetTlsArrayAddress, ThreadIsIoPending, ThreadHideFromDebugger, ThreadBreakOnTermination, MaxThreadInfoClass } THREADINFOCLASS; THREADINFOCLASS ThreadInformationClass; extern "C" { NTSTATUS WINAPI NtQueryInformationThread( _In_ HANDLE ThreadHandle, _In_ THREADINFOCLASS ThreadInformationClass, _Inout_ PVOID ThreadInformation, _In_ ULONG ThreadInformationLength, _Out_opt_ PULONG ReturnLength ); } THREAD_BASIC_INFORMATION ThreadInfo; DWORD ntstatus = NtQueryInformationThread( GetCurrentThread(), // ThreadBasicInformation, &ThreadInfo, //ThreadInfo.TebBaseAddress . sizeof(THREAD_BASIC_INFORMATION), 0 ); // teb , __readfsdword(0x18) 32 __readgsqword(0x30) 64.
MSDN рдкрд░, PEB рдХреЛ 32 рдмрд┐рдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
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;
рдФрд░ 64 рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП:
typedef struct _PEB { BYTE Reserved1[2]; BYTE BeingDebugged; BYTE Reserved2[21]; PPEB_LDR_DATA LoaderData; PRTL_USER_PROCESS_PARAMETERS ProcessParameters; BYTE Reserved3[520]; PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine; BYTE Reserved4[136]; ULONG SessionId; } PEB;
рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ 32 рдФрд░ 64 рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ рдкреАрдИрдмреА рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдХрд░реНрдиреЗрд▓ 32 рдмреЗрд╕ рдФрд░ GetProcAddress рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рдкреАрдИрдмреА рдкрддрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
typedef enum _PROCESSINFOCLASS { ProcessBasicInformation = 0 } PROCESSINFOCLASS; status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(PROCESS_BASIC_INFORMATION), &dwLength); if(status != 0x0) { printf("NtQueryInformationProcess Error 0x%x\n", status); exit(EXIT_FAILURE); } printf("PEB address : 0x%x\n", pbi.PebBaseAddress);
рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╡рд▓реЛрдХрди рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк LDR_DATA рдХреЛ рдЦрд░рд╛рдм рдХрд░рддреЗ рд╣реИрдВ, рддреЛ Api рдлрд╝рдВрдХреНрд╢рди рдЬреИрд╕реЗ GetModuleHandleEx рдФрд░ EnumProcessModules, QueryFullProcessImageName рдЗрдЪреНрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ PEB рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП ReadProcessMemory рдХрд╣рддреЗ рд╣реИрдВред рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкреАрдИрдмреА рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЛрдбрд╝ (рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкрдврд╝рдирд╛, рдмрджрд▓рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛) рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред