zoukankan      html  css  js  c++  java
  • FS:[0] 链条

     0x01  用户态

    在x86系统中,当线程在用户态执行时,段寄存器fs总是指向当前线程的TEB。

    在Ntdll中有一个未公开的函数NtCurrentTeb() ,用来取得当前线程的TEB地址。FS:[0]的内容就是TEB的起始四个字节的内容,又因为TIB位于TEB的起始地址处,所以FS:[0]的内容实际上就是TIB的其实四个字节的内容。而NtCurrentTeb()取出的是fs;{00000018h}的内容,也就是NT_TIB的Self字段,也就是TEB和TIB结构在进程空间中的虚拟地址。

    typedef struct _NT_TIB          //sizeof  1ch  
    {  
     00h   struct _EXCEPTION_REGISTRATION_RECORD  *ExceptionList; 
     04h   PVOID                            StackBase;
     08h   PVOID                            StackLimit;
     0ch   PVOID                            SubSystemTib;  
           union {  
               PVOID                FiberData;  
     10h       DWORD                Version;  
           };  
     14h   PVOID                            ArbitraryUserPointer;  
     18h   struct _NT_TIB                   *Self; 
    }NT_TIB;  
    

      

    使用windbg命令dd fs:[0]得到TEB/TIB结构的虚拟地址:

    可以看到其中98d3b1bc就是ExceptionList字段,以此类推,7ffdf000就是Self字段,

     拿到这个地址,使用命令dt _nt_tib 7ffdf000来结构化显示TIB的字段:

    win7 x86中teb结构:

    tib结构:

    0x02  内核态

    在内核模式中,内核态的代码依然可以通过fs:[0]来引用到TIB结构,这个结构位于KPCR结构的开始处。KPCR是与处理器相关的,系统会在启动期间为每个CPU创建一个KPCR结构和KPRCB结构。

    KPCR与KPRCB结构,都是用来描述处理器的,前者叫处理器描述符,后者叫处理器控制块。

    Struct KPCR
    {
       KPCR_TIB Tib;//类似于TEB.TIB,内部第一个字段都是ExceptionList
       KPCR* self;//自身结构体的地址,方便直接寻址
       KPRCB* kprcb;//处理器控制块的地址、
       KIRQL irql;//当前cpu的irql
       USHORT* IDT;//本cpu的IDT地址,一有中断/异常就去这个表找isr、epr
       USHORT* GDT;//全局描述符表地址
       KTSS* TSS;//记录了本cpu上当前运行线程的状态信息,重要字段有内核栈地址,IO权限位图
       ……
    }
    
    Struct KPRCB
    {
       KTHREAD* CurrentThread;//本cpu上当前运行的线程
       KTHREAD* NextThread;//本cpu上将抢占当前线程的下个线程(抢占式调度核心)
       BYTE CpuID;
       ULONG KernelTime,UserTime;//本cpu的累计运行时间统计信息
       ……
    }
    

      

    windbg中查看KPC:

    !pcr命令:

    找到KPCR的地址为0x83f32c00

    输入命令:dt _KPCR  83f32c00

     

  • 相关阅读:
    【leetcode】Binary Search Tree Iterator
    【leetcode】Palindrome Partitioning II
    【leetcode】Best Time to Buy and Sell Stock III
    【leetcode】Best Time to Buy and Sell Stock II
    【leetcode】Longest Consecutive Sequence
    【leetcode】Factorial Trailing Zeroes
    【leetcode】Simplify Path
    【leetcode】Generate Parentheses
    【leetcode】Combination Sum II
    【leetcode】Combination Sum
  • 原文地址:https://www.cnblogs.com/lsh123/p/8303731.html
Copyright © 2011-2022 走看看