TEB、PEB
TEB指线程环境块,该结构体包含进程中运行线程的各种信息,进程中每个线程都对应一个TEB结构体。不同OS中的TEB结构体形态略微不同。、
重要成员:
TEB结构体成员多而复杂,在用户模式调试中起着重要作用的成员有2个.。
ProcessEnvironmentBlock成员:
Offset30处的ProcessenvironmentBlock成员指向PEB结构体的指针。
NtTib成员:
TEB结构体的第一个成员为_NT_TIB结构体。
TEB访问方法:
借助WinDbg内核调试器可以很容易地访问TEB结构体。
在用户模式下可以OS提供的API访问。
Ntdll.NtCurrentTeb():
Ntdll.NtCurrentTeb()返回当前线程的TEB结构体地址.
函数内部代码非常简单,之返回FS:[18]地址值。
(IA-32中虚拟内存为4GB,需32位指针才能访问整个虚拟内存。但FS只有16位,实际上,FS持有SDT索引,该索引持有TEB地址。(SDT位于内核内存区域,地址存储在GDTR寄存器中)
PEB:
PEB是存放进程信息的结构体。
PEB访问方法:
1、直接获取PEB地址
MOV EAX,DWORD PTR FS:[30] ;
2、先获取TEB地址,在通过ProcessEnvironmentBlock成员(+30偏移)获取PEB地址
MOV EAX,DWORD PTR FS:[18]
MOV EAX,DWORD PTR DS:[EAX+30]
PEB的重要成员:
PEB.BeingDebugged:
Keenel32.dll 中有一个名为kernel32!IsDebuggerPercent()的API
PEB.ImageBaseAddress
PEB.ImageBaseAddress 表示进程的ImageBase.
GetModuleHandle() API 用来获取ImageBase
当参数为NULL,调用GetModuleHandle()函数将返回进程被加载的的ImageBase.
返回值放到EAX.
PEB.Ldr
PEB.Ldr指向_PEB_LDR_DATA结构体的指针
_PEB_LDR_DATA结构体:
当模块(DLL)被加载到进程后,通过PEB.Ldr成员可以直接获取模块加载的基地址。
_LIST_ENTRY结构体:(双向链表)
链表中保存_LDR_DATA_TABLE_ENTRY结构体信息。
每个被加载到进程的dll模块都有与之对应的_LDR_DATA_TABLE_ENTRY结构体。结构体之间相会链接形成_LIST_ENTRY双向链表
PEB.ProcessHeap与PEB.NtGlobalFlag成员
PEB.ProcessHeap与PEB.NtGlobalFlag成员用于反调试技术。若进程处于调试状态。这两个成员持有特定值。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步