PEB(Process Environment Block,进程环境块):存放进程信息,准确的PEB地址应该从系统的EXPROCESS结构的0x1b0偏移出获得,但这个结构位于系统地址空间,访问 需要 ring0权限,所以一般通过TEB结构的偏移0x30处获取PEB.
获取peb代码:mov eax, fs:[0x30]
mov PEB, eax
TEB(Thread Environment Block,线程环境块): 存放线程信息,位于用户地址空间,进程中的每个线程都有自己的一个TEB.通过fs寄存器来访问,一般储存在fs:[0].
1. PEB:
使用windbg查看peb:
1)!peb (注意:使用!peb只能看到重要成员信息,但是可以看到它的起始地址.)
2)dt 7efde000 _peb (注意:使用dt _peb 能看到所有成员信息,但是看不到它的起始地址.)
通过以上输出结果,可以获得进程:
ImageBaseAddress 程序加载的基地址,
ProcessHeap 堆起始地址
BeingDebuggedDebug 运行标志
等等信息.
知识点:
... peb + 0xc ldr ==> _PEB_LDR_DATA // 可执行文件的装载信息.
... 使用dt 查看ldr.
... 查看LDR_MODULE结构
... 链表节中的Frist,Next.
以上是PEB中一些重要的信息.
2.TEB:
使用windbg查看teb
1)!teb (查看teb所有重要成员)
2)dt 7efdd000 _teb (查看teb所有成员)
fs:[0x18]指向的是TEB自身, fs[0x30]就是PEB所在的位置.
TEB各偏移说明:
0x0: 指向SEH链指针
0x4: 线程堆栈顶部
0x8: 线程堆栈底部
0x18: 指向TEB自身
0x30: PEB结构地址