笔记
学习最新前沿软件逆向安全技术、游戏安全辅助脚本技术,B 站 小迪 xiaodi 老师
微信 i-xiaodi
拓展
1.在 dbg 中查看fs:[0]
中的数据的两种方法
方法 1:输入命令
方法 2:直接双击 FS 寄存器
fs
段寄存器的详细介绍
在 Windows 操作系统中,fs
是一个段寄存器(Segment Register),它用于指向线程的线程环境块(TEB,Thread Environment Block)。fs
寄存器主要用于访问当前线程的局部存储区域,而不是全局数据。这使得线程能够高效地存储和访问其专有的信息,而不需要锁定整个进程的数据。
在 32 位 Windows 操作系统中,fs
寄存器的默认值是指向当前线程的 TEB 的地址。具体来说:
fs:[0]
存储的是当前线程的 TEB 的基地址,通常被用来获取该线程的相关信息。
TEB(线程环境块)的结构和用途
TEB
(Thread Environment Block)是为每个线程分配的一个数据结构,用来存储线程的相关信息。每个线程都有一个独立的 TEB,它被用来存储多种信息,包括线程的本地存储、异常处理、TLS(线程局部存储)、栈指针等。每个线程都会通过 fs:[0]
获取指向其 TEB 的指针。
进程是外壳,内部是由线程来构成的
TEB 结构详细说明
在 32 位 Windows 中,TEB
结构大致如下:
typedef struct _TEB {
NT_TIB NtTib; // +0x0000 TIB (Thread Information Block) 用于存储堆栈信息
PVOID EnvironmentPointer; // +0x001C 指向线程的环境块(通常为空)
CLIENT_ID ClientId; // +0x0020 线程的 ClientId(由线程 ID 和进程 ID 组成)
PVOID ActiveRpcHandle; // +0x0028 当前线程的 RPC 句柄
PVOID ThreadLocalStoragePointer; // +0x002C 指向线程局部存储的指针
PVOID ProcessEnvironmentBlock; // +0x0030 指向进程环境块(PEB)的指针
ULONG LastErrorValue; // +0x0034 最后错误值
ULONG CountOfOwnedCriticalSections; // +0x0038 当前线程拥有的临界区数量
PVOID CsrClientThread; // +0x003C 相关的 CsrClient 线程
PVOID Win32ThreadInfo; // +0x0040 线程信息
ULONG User32Reserved[26]; // +0x0044 保留字段(26个 ULONG)
ULONG UserReserved[5]; // +0x00AC 保留字段(5个 ULONG)
PVOID WOW32Reserved; // +0x00C0 32 位 Windows 下的保留区域
PVOID CurrentTransactionHandle; // +0x00C4 当前事务的句柄
// 其他字段...
} TEB;
主要字段说明
- NtTib:线程信息块(TIB,Thread Information Block),它是 TEB 的最开始部分,主要包含栈的信息。
TIB 是用于维护线程的堆栈和异常处理的基本结构。
-
NtTib.StackBase
:线程栈的基地址。NtTib.StackLimit
:线程栈的限制地址。
EnvironmentPointer
:指向线程的环境块,这个指针通常为空。在某些特殊情况下,可能会用到。ClientId
:客户端标识符,包含线程的唯一标识符以及其所属的进程 ID。
typedef struct _CLIENT_ID {
HANDLE UniqueProcess; // 进程ID
HANDLE UniqueThread; // 线程ID
} CLIENT_ID;
ThreadLocalStoragePointer
:指向线程局部存储(TLS)的指针。TLS 是每个线程可以使用的内存区域,每个线程都有自己的独立副本。ProcessEnvironmentBlock
:指向进程环境块(PEB)的指针。PEB 存储了与当前进程相关的信息,例如进程的启动参数、模块信息、进程内存布局等。LastErrorValue
:线程最近的错误值,通常是 Windows 系统调用或 API 函数的错误代码。CountOfOwnedCriticalSections
:线程拥有的临界区(Critical Section)数量。临界区用于线程间的同步,防止多个线程同时访问共享资源。CsrClientThread
:该字段通常用于与 CSRSS(Client/Server Runtime Subsystem)通信,它是用户模式与内核模式之间的一个接口。Win32ThreadInfo
:指向 Win32 线程信息的指针。这通常与用户模式的线程交互相关。FlsData
:线程本地存储数据(FLS)。它允许线程存储和检索特定于线程的数据。
作业
1.写一段汇编代码,获取进程 ID
2.写一段汇编代码,获取线程 ID
3.写一段汇编代码,获取 PEB 地址
拓展阅读: TEB 的用途
TEB 存储了与线程相关的各种数据,是线程的核心数据结构之一。它的用途包括:
- 线程局部存储(TLS):TEB 包含指向线程局部存储的指针,TLS 使得每个线程可以存储独立于其他线程的数据。例如,
fs:[0]
指向的 TEB 包含指向线程局部存储的指针,程序可以利用这个指针来获取线程的本地数据。 - 异常处理:
TEB
中包含与线程相关的异常信息和栈信息(由NtTib
字段管理),Windows 内核和用户模式代码都依赖这些信息来执行异常处理。 - 线程的标识和上下文:
TEB
中存储了ClientId
,它标识了线程的唯一身份(包括线程 ID 和进程 ID)。此外,LastErrorValue
字段存储了与线程相关的错误代码。 - 进程环境信息:通过
ProcessEnvironmentBlock
字段,线程可以访问其所在进程的环境信息。它通常被用于获取进程级的资源,例如 DLL 列表、环境变量等。 - 调试:调试工具(如 x32dbg)通过
fs:[0]
获取线程的 TEB,并可以通过 TEB 中的信息来分析线程状态。
没有回复内容