x86/x64汇编基础10.汇编基础6:使用x32dbg学习FS与线程TEB-汇编语言社区论坛-技术社区-学技术网

x86/x64汇编基础10.汇编基础6:使用x32dbg学习FS与线程TEB

笔记

学习最新前沿软件逆向安全技术、游戏安全辅助脚本技术,B 站 小迪 xiaodi 老师

微信 i-xiaodi

拓展

1.在 dbg 中查看fs:[0]中的数据的两种方法

图片[1]-x86/x64汇编基础10.汇编基础6:使用x32dbg学习FS与线程TEB-汇编语言社区论坛-技术社区-学技术网

方法 1:输入命令

图片[2]-x86/x64汇编基础10.汇编基础6:使用x32dbg学习FS与线程TEB-汇编语言社区论坛-技术社区-学技术网

方法 2:直接双击 FS 寄存器

图片[3]-x86/x64汇编基础10.汇编基础6:使用x32dbg学习FS与线程TEB-汇编语言社区论坛-技术社区-学技术网

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;

主要字段说明

  1. NtTib:线程信息块(TIB,Thread Information Block),它是 TEB 的最开始部分,主要包含栈的信息。

TIB 是用于维护线程的堆栈和异常处理的基本结构。

    • NtTib.StackBase:线程栈的基地址。
    • NtTib.StackLimit:线程栈的限制地址。
  1. EnvironmentPointer:指向线程的环境块,这个指针通常为空。在某些特殊情况下,可能会用到。
  2. ClientId:客户端标识符,包含线程的唯一标识符以及其所属的进程 ID。
typedef struct _CLIENT_ID {
    HANDLE UniqueProcess;  // 进程ID
    HANDLE UniqueThread;   // 线程ID
} CLIENT_ID;
  1. ThreadLocalStoragePointer:指向线程局部存储(TLS)的指针。TLS 是每个线程可以使用的内存区域,每个线程都有自己的独立副本。
  2. ProcessEnvironmentBlock:指向进程环境块(PEB)的指针。PEB 存储了与当前进程相关的信息,例如进程的启动参数、模块信息、进程内存布局等。
  3. LastErrorValue:线程最近的错误值,通常是 Windows 系统调用或 API 函数的错误代码。
  4. CountOfOwnedCriticalSections:线程拥有的临界区(Critical Section)数量。临界区用于线程间的同步,防止多个线程同时访问共享资源。
  5. CsrClientThread:该字段通常用于与 CSRSS(Client/Server Runtime Subsystem)通信,它是用户模式与内核模式之间的一个接口。
  6. Win32ThreadInfo:指向 Win32 线程信息的指针。这通常与用户模式的线程交互相关。
  7. FlsData:线程本地存储数据(FLS)。它允许线程存储和检索特定于线程的数据。

 

 

作业

1.写一段汇编代码,获取进程 ID

2.写一段汇编代码,获取线程 ID

3.写一段汇编代码,获取 PEB 地址

 

 

拓展阅读: TEB 的用途

TEB 存储了与线程相关的各种数据,是线程的核心数据结构之一。它的用途包括:

  1. 线程局部存储(TLS):TEB 包含指向线程局部存储的指针,TLS 使得每个线程可以存储独立于其他线程的数据。例如,fs:[0] 指向的 TEB 包含指向线程局部存储的指针,程序可以利用这个指针来获取线程的本地数据。
  2. 异常处理TEB 中包含与线程相关的异常信息和栈信息(由 NtTib 字段管理),Windows 内核和用户模式代码都依赖这些信息来执行异常处理。
  3. 线程的标识和上下文TEB 中存储了 ClientId,它标识了线程的唯一身份(包括线程 ID 和进程 ID)。此外,LastErrorValue 字段存储了与线程相关的错误代码。
  4. 进程环境信息:通过 ProcessEnvironmentBlock 字段,线程可以访问其所在进程的环境信息。它通常被用于获取进程级的资源,例如 DLL 列表、环境变量等。
  5. 调试:调试工具(如 x32dbg)通过 fs:[0] 获取线程的 TEB,并可以通过 TEB 中的信息来分析线程状态。

 

 

请登录后发表评论

    没有回复内容