JIURL玩玩Win2k程序執行緒篇 TEB

2021-04-06 12:29:45 字數 4252 閱讀 3358

teb,thread environment block,執行緒環境塊。位於使用者位址空間。在比 peb 所在位址低的地方,比如 0x7ffdf000,0x7ffde000。每個執行緒都有自己的乙個 teb。由於 teb 在使用者位址空間,所以本程序中執行在使用者模式下的**就可以訪問 teb 結構。win2k build 2195 中乙個執行緒的 ethread 結構偏移 +020 處的 *teb 指向這個執行緒的 teb 結構。在 undocumented.ntinternals.net (需要注意的是這是個非官方的站點)我們可以找到 teb 及其相關結構的定義。從 kd 中也可以找到一些相關結構的定義。我們首先列出結構的定義,然後對一些內容進行說明。

// 來自 undocumented.ntinternals.net

typedef struct _teb teb, *pteb;

// 來自 kd

struct _nt_tib (sizeof=28)

+00 struct _exception_registration_record *exceptionlist

+04 void *stackbase

+08 void *stacklimit

+0c void *subsystemtib

+10 void *fiberdata

+10 uint32 version

+14 void *arbitraryuserpointer

+18 struct _nt_tib *self

struct _client_id (sizeof=8)

+0 void *uniqueprocess

+4 void *uniquethread

struct _exception_registration_record (sizeof=8)

+0 struct _exception_registration_record *next

+4 function *handler

struct _unicode_string (sizeof=8)

+0 uint16 length

+2 uint16 maximumlength

+4 uint16 *buffer

異常處理鏈

struct _teb

struct _nt_tib (sizeof=28)

+00 struct _exception_registration_record *exceptionlist

指向結構化異常處理(seh)鏈的指標。

執行緒使用者模式下的堆疊

struct _teb

struct _nt_tib (sizeof=28)

+04 void *stackbase

+08 void *stacklimit

乙個執行緒,有兩個自己的堆疊(stack)。乙個是核心模式下的堆疊,乙個是使用者模式下的堆疊。當執行緒在核心模式,也就是 ring0 下,執行**的時候,使用的是核心模式堆疊。當執行緒在使用者模式下,也就是 ring3 下,執行**的時候,使用的是使用者模式堆疊。某些只在核心模式執行的執行緒沒有使用者模式堆疊,比如 system 程序(pid為8的程序)的一些執行緒。

乙個執行緒的使用者模式堆疊,位於使用者位址空間。執行緒 teb 偏移 +04 處的 stackbase 是該執行緒使用者模式堆疊的最高位址,也就是開始位址,堆疊是向下增長的。執行緒 teb 偏移 +08 處的 stacklimit 是該執行緒使用者模式堆疊的最低位址(有效部分)。

fs 段

在系統的許多函式的彙編**中我們程序可以看到使用 fs 段。對於 x86 來說,分段機制是預設,並且必須使用的。win2k 使用了平坦(flat)模型,把段設為整個4g位址空間,隱藏了分段機制。不過 fs 段是乙個例外。對於執行在使用者模式下,也就是執行在ring3下的程式,fs 段是當前執行緒的 teb 所在位址空間。對於執行在核心模式下,也就是執行在ring0下的程式,fs 段是從位址 ffdff000 開始,大小為 0x2000 的那部分位址空間。

下面我們使用 softice 分別觀察在 ring3 執行**的 fs段 和在 ring0 執行**的 fs段。

ring3

在ring3執行某一時刻的段暫存器和全域性描述符表

:r -d

cs:eip=001b:00401919 ss:esp=0023:0012fe20

eax=00000001 ebx=7ffdf000 ecx=0012ffb0 edx=00040000

esi=0012fe20 edi=0012ff80 ebp=0012ff80 efl=00000246

ds=0023 es=0023 fs=0038 gs=0000

注意 cs 為 1b ,說明 cpl 為 ring3。注意 fs 段選擇符。

:gdt

sel. type base limit dpl attributes

gdtbase=80036000 limit=03ff

0008 code32 00000000 ffffffff 0 p re

0010 data32 00000000 ffffffff 0 p rw

001b code32 00000000 ffffffff 3 p re

0023 data32 00000000 ffffffff 3 p rw

0028 tss32 801f4000 000020ab 0 p b

0030 data32 ffdff000 00001fff 0 p rw

003b data32 7ffde000 00000fff 3 p rw

// fs 對應的段描述符,base=7ffde000 dpl=3

// 當前的執行緒的 teb 就在 7ffde000 開始處的 4kb 位址空間中。

0043 data16 00000400 0000ffff 3 p rw

0048 reserved 00000000 00000000 0 np

0050 tss32 80470040 00000068 0 p

...ring0 

剛才的ring3程式進行系統呼叫,產生了 int 2e 中斷。當轉到中斷2e的中斷處理程式時,cpu 以及轉換了堆疊段,**段。中斷2e的中斷處理程式會把原來的fs段選擇符壓棧,將fs段選擇符賦值為30。

這時的段暫存器和全域性描述符表

// 注意 cs 和 ss ,cpl 已經是 ring0 了。注意 fs 值為30。

:r -d

cs:eip=0008:804615dd ss:esp=0010:ef0b5db4

eax=00000038 ebx=00000030 ecx=80002000 edx=0012fd9c

esi=00000000 edi=0012ff80 ebp=0012fdf8 efl=00000002

ds=0023 es=0023 fs=0030 gs=0000

:gdt

sel. type base limit dpl attributes

gdtbase=80036000 limit=03ff

0008 code32 00000000 ffffffff 0 p re

0010 data32 00000000 ffffffff 0 p rw

001b code32 00000000 ffffffff 3 p re

0023 data32 00000000 ffffffff 3 p rw

0028 tss32 801f4000 000020ab 0 p b

0030 data32 ffdff000 00001fff 0 p rw

// fs 對應的段描述符,base=ffdff000 dpl=0

003b data32 7ffde000 00000fff 3 p rw

...使用者模式下的 fs 段是當前執行緒的 teb。

核心模式下的 fs 段,是 ffdff000 開始的8kb(通常只有4kb映**物理記憶體)位址空間。它的內容是和當前執行緒有關的一些資訊。其中

偏移+00 處的4個位元組是核心模式下 exception_registration_record *exceptionlist 。

偏移+04 處的4個位元組,偏移+08 處的4個位元組,是和執行緒核心堆疊有關的資訊。

偏移+124 處的4個位元組,是指向當前執行緒的 ethread 結構的指標。

注意 ffdff000 開始的這段位址空間中是當前執行緒的有關資訊,對於不同的執行緒,這段位址空間中的內容也是不一樣。

為了方便觀察某個程序位址空間中內容,我寫了乙個叫

jiurlproces**emsee 的程式,可以獲得指定程序位址空間中的內容。

Win2K服務詳解

svchost.exe 檔案對那些從動態鏈結庫中執行的服務來說是乙個普通的主機程序名 最基本的系統程序 也就是說,這些程序是系統執行的基本條件,有了這些程序,系統就能正常執行 ss.exe session manager csrss.exe 子系統伺服器程序 winlogon.exe 管理使用者登入...

關機 win2k或以上

handle htoken token privileges tkp get a token for this process.if openprocesstoken getcurrentprocess token adjust privileges token query,htoken retur...

Win2k下isapi dll除錯設定

1.控制面板 管理工具 internet services manager 要設定的 屬性 主目錄 設定最下面的 應用程式保護 為 低 iis 程序 將存放dll的虛擬目錄同樣設定 2.控制面板 管理工具 服務 將http ftp smtp服務設定為手工開啟 3.控制面板 管理工具 本地安全設定 本...