1. 程式人生 > >171124 逆向-執行緒環境塊(TEB)

171124 逆向-執行緒環境塊(TEB)

1625-5 王子昂 總結《2017年11月24日》 【連續第420天總結】
A. TEB(執行緒環境塊)
B.

介紹

該結構體中包含程序中執行執行緒的各種資訊,每個執行緒都對應一個TEB結構體。
不同OS中TEB結構的形態略微不同。

定義

結構體中有非常多的成員,其中使用者模式除錯中起著重要作用的成員有兩個:

+0 NtTib : _NT_TIB
...
+0X30 ProcessEnvironmentBlock : Ptr32_PEB

偏移0x30處的ProcessEnvironmentBlock是指向PEB(程序環境塊)結構體的指標
偏移0處的_NT_TIB結構體內容如下

typedef
struct _NT_TIB {  struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;  PVOID StackBase;  PVOID StackLimit;  PVOID SubSystemTib;  union {   PVOID FiberData;   DWORD Version;  };  PVOID ArbitraryUserPointer;  struct _NT_TIB *Self; };

ExceptionList成員指向_EXCEPTION_REGISTRATION_RECORD結構體組成的連結串列,用於Windows OS的SEH(異常處理機制)
Self成員是結構體的自引用指標

訪問方法

核心模式下可以直接檢視核心的記憶體,但是使用者模式下由於沒有相關許可權,所以只能通過OS提供的API來訪問

Ntdll.NtCurrentTeb()

用來返回當前執行緒的TEB結構體的地址
函式體:

mov eax, DWORD PTR FS:[18]
RETN
FS段暫存器

FS段暫存器就是專門用來指示當前執行緒的TEB結構體的
具體方法為
FS暫存器指示SDT的索引,其中存放著TEB結構體的地址

SDT位於核心記憶體區域,地址存放在GDTR(全域性描述符表暫存器)中
因此GDTR+FS就可以得到TEB結構體的指標了

從而有
FS:[0x18] = FS:0
(+0x18處就是self指標)
FS:[0x30] = &PEB
FS:[0] = &SEH

C. 明日計劃
執行緒環境塊PEB