PEB检测
第二字段BeingDebugged,记录调试信息,1代表被调试,0代表没有被调试
//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结构在TEB结构的0x30偏移的地方,也就是fs:[0x30]处可以取到PEB的基地址
bool CheckDebug() {
bool bDebugged = false;
__asm {
MOV EAX, DWORD PTR FS : [0x30]
MOV AL, BYTE PTR DS : [EAX + 2]
MOV bDebugged, AL
}
return bDebugged;
}
当进程被调试时,AL的值为1,这个值取自PEB的BeingDebugged成员
PEB:Process Envirorment Block Structure
进程环境信息块,这里包含了一些进程的信息
TEB:Thread Environment Block
指线程环境块,该结构体包含进程中运行线程的各种信息,进程中的每个线程都对应着一个TEB结构体
TEB
FS段寄存器
其实,FS段寄存器用来只是当前线程的TEB结构体。
IA-32系统中进程的虚拟内存大小为4GB,因而需要32位的指针才能访问整个内存空间,但是FS寄存器的大小只有16位,那么它如何表示进程内存空间的TEB结构体的地址呢?实际上,FS寄存器并非直接指向TEB结构体的地址,它持有SDT 的索引,而该索引持有实际TEB地址。
提示:
SDT位于内核区域,其地址存储在特殊的寄存器GDTR(Global Descriptior Table Register,全局描述符表寄存器)中。