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成员用于反调试技术。若进程处于调试状态。这两个成员持有特定值。

    

 

 

        

 

 

 

    

 

    

      

  

 

posted @   KnowledgePorter  阅读(1579)  评论(0编辑  收藏  举报
(评论功能已被禁用)
点击右上角即可分享
微信分享提示