171124 逆向-執行緒環境塊(TEB)
阿新 • • 發佈:2019-01-05
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