JIURL玩玩Win2k进程线程篇 TEB

windbg获取TEB(线程环境块)信息 windbg下载安装配置符号路径 如果是win10直接下载windbg预览版,预览版只有win10才能用,我的是win7所以下载的是老版本的,老版本去官网中的win10 sdk中下载 链接:https://developer.microsoft.com/zh-cn/windows/downloads/sdk-archive 下载后会有x86和64位两个版本,两个版本都要配置符号路径,否则只能使用... 阅读详情
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 {
NT_TIB Tib;
PVOID EnvironmentPointer;
CLIENT_ID Cid;
PVOID ActiveRpcInfo;
PVOID ThreadLocalStoragePointer;
PPEB Peb;
ULONG LastErrorValue;
ULONG CountOfOwnedCriticalSections;
PVOID CsrClientThread;
PVOID Win32ThreadInfo;
ULONG Win32ClientInfo[0x1F];
PVOID WOW32Reserved;
ULONG CurrentLocale;
ULONG FpSoftwareStatusRegister;
PVOID SystemReserved1[0x36];
PVOID Spare1;
ULONG ExceptionCode;
ULONG SpareBytes1[0x28];
PVOID SystemReserved2[0xA];
ULONG GdiRgn;
ULONG GdiPen;
ULONG GdiBrush;
CLIENT_ID RealClientId;
PVOID GdiCachedProcessHandle;
ULONG GdiClientPID;
ULONG GdiClientTID;
PVOID GdiThreadLocaleInfo;
PVOID UserReserved[5];
PVOID GlDispatchTable[0x118];
ULONG GlReserved1[0x1A];
PVOID GlReserved2;
PVOID GlSectionInfo;
PVOID GlSection;
PVOID GlTable;
PVOID GlCurrentRC;
PVOID GlContext;
NTSTATUS LastStatusValue;
UNICODE_STRING StaticUnicodeString;
WCHAR StaticUnicodeBuffer[0x105];
PVOID DeallocationStack;
PVOID TlsSlots[0x40];
LIST_ENTRY TlsLinks;
PVOID Vdm;
PVOID ReservedForNtRpc;
PVOID DbgSsReserved[0x2];
ULONG HardErrorDisabled;
PVOID Instrumentation[0x10];
PVOID WinSockData;
ULONG GdiBatchCount;
ULONG Spare2;
ULONG Spare3;
ULONG Spare4;
PVOID ReservedForOle;
ULONG WaitingOnLoaderLock;
PVOID StackCommit;
PVOID StackCommitMax;
PVOID StackReserved;
} 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 是该线程用户模式堆栈的最低地址(有效部分)。

线程的内核模式堆栈的信息在线程 ETHREAD 结构中。

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 开始的这段地址空间中是当前线程的有关信息,对于不同的线程,这段地址空间中的内容也是不一样。

为了方便观察某个进程地址空间中内容,我写了一个叫 JiurlProcessMemSee 的程序,可以获得指定进程地址空间中的内容。

欢迎交流,欢迎交朋友,
欢迎访问 http://jiurl.yeah.net http://jiurl.cosoft.org.cn/forum

 

下载 JiurlProcessMemSee 可执行文件及源程序

TEB结构思考 在网上看到的一篇文章如下: TEB与PEB的结构分析,如阿燐燐所诉FS寄存器指向当前活动线程的TEB结构(线程结构)    用OD打开一个任意程序可以看到FS段寄存器的状况,其中选择子是003B,在GDT中的起始位置是7FFDF000,大小是00FFFFFF,是一个RING3的调用门。 在数据窗口中跟踪7FFDF000然后以长型地址的方式查看数据,可以完整的看到TEB结构 , 阅读详情

相关推荐

2 海康视觉平台VisionMaster 上手系列:大纲及准备

海康视觉平台VisionMaster 大纲,课前准备 快速入门 工业机器视觉 机器视觉

HuangGong2022的博客 1万+

JIURL玩玩Win2k进程线程篇 EPROCESS

JIURL玩玩Win2k进程线程篇 EPROCESS作者: JIURL                 主页: http://jiurl.yeah.net     日期: 2003-7-30     每个进程都有一个 EPROCESS 结构,里面保存着进程的各种信息,和相关结构的指针

jiurl的专栏 3916

RK3588上rknn_toolkit_lite2报错解决:手把手教你更新librknnrt.so的正确姿势

本文针对在RK3588平台上使用rknn_toolkit_lite2时遇到的“Invalid RKNN model version”等常见错误,提供了完整的诊断与解决方案。文章深入剖析了RKNN生态系统各组件(如librknnrt.so、RKNN Server)版本不兼容的根源,并手把手指导如何安全、正确地更新librknnrt.so运行时库,确保AI模型在RK3588 NPU上实现高效推理。

weixin_29189003的博客 521

JIURL玩玩Win2k进程线程篇 ETHREAD

JIURL玩玩Win2k进程线程篇 ETHREAD作者: JIURL                 主页: http://jiurl.yeah.net     日期: 2003-7-30     每个线程都有一个 ETHREAD 结构。Win2k Build 2195 中 ETHR

jiurl的专栏 3061

LabVIEW与MySQL实时数据存储:传感器采集与数据库同步实践

本文详细介绍了如何将LabVIEW与MySQL结合,实现传感器数据的实时采集与高效存储。通过设计合理的数据库表结构、配置LabVIEW数据库连接工具包,并编写核心的采集与存储VI,构建了稳定可靠的数据链路。文章重点分享了批量插入、连接管理、时间同步等关键优化技巧与避坑指南,帮助工程师应对工业监控、环境监测等场景下的实时数据同步挑战。

weixin_29281915的博客 262

【Docker】Ubuntu安装Docker

1 安装Docker 安装Docker有三种方法,这里只用repository安装,更详细的安装方法可以看官方文档。 1.1 添加repository 首先更新apt: sudo apt-get update 安装一些包让apt可以通过https使用repository: sudo apt-get install \ apt-transport-https \ ca-certif...

widiot的博客 9950

利用TEB和PEB在3环 断链模块 遍历模块

nt!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIENT_ID //UniqueProcess UniqueThread 进程ID +4 线程ID +0x028 ActiveRpcHan...

qq_41490873的博客 943

剪映专业版教程:用AI生成音乐MV并重新制作画面—《漂泊与归梦》完全原创实战

本文详细拆解如何用AI生成音乐MV并重新制作画面的全流程。以歌曲《漂泊与归梦》为例,首先用AI将歌词转化为带音乐的MP4文件;导入剪映后分离音频并删除原视频,通过“识别字幕”功能提取歌词文本并逐句核对修正;接着设置“向右擦除”动画并锁定字幕轨道;最后根据歌词意境配置动漫、风景等非真人画面规避审核风险。教程涵盖从AI生成、音频分离、字幕提取到画面重制的每个环节,助你打造完全原创、无侵权风险的音乐短视频。

深耕计算机专业知识与技术。 1077

FS寄存器指向当前活动线程的TEB结构(线程结构)

FS寄存器指向当前活动线程的TEB结构(线程结构) 偏移 说明 000 指向SEH链指针 004 线程堆栈顶部 008 线程堆栈底部 00C SubSystemTib 010 FiberData 014 ArbitraryUserPointer 018 FS段寄存器在内存中的镜像地址 020 进程PID 024 线程ID 02C 指向线程局部存储指针 030 PEB

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 3665

【python科研数据处理】将Endnote自动搜索的所有pdf文件,全都移动指定文件夹中

将Endnote自动搜索到的全部pdf文件,全都移动指定文件夹中1 背景2 问题解决 手动反爬虫,禁止转载:原博地址 https://blog.youkuaiyun.com/lys_828/article/details/122370892(优快云博主:Be_melting) 知识梳理不易,请尊重劳动成果,文章仅发布在优快云网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息 1 背景 在进行期末考试周后,面对最后一门功课,需要提交至少80篇SCI参考文献,因此最快下载文献的方式就是通过Web of S

lys_828的博客 1827

人形机器人硬件电路设计入门

人形机器人属于。

blotemj.blog.youkuaiyun.com 232

JIURL玩玩Win2k 地址空间的布局

JIURL玩玩Win2k 地址空间的布局作者: JIURL                 主页: http://jiurl.yeah.net     日期: 2003-7-30     地址空间的布局,每个进程有4G的地址空间,其中低2G是用户地址空间,高2G是系统地址空间。用户地

jiurl的专栏 4638

CentOS7安装OpenSSL1.1.1s

CentOS7安装OpenSSL1.1.1s

Bertram的博客 733

关于进程PEB结构的修改实现

关于进程PEB结构前辈们给出了几篇比较详细的文章。例如:《JIURL玩玩Win2k进程线程篇 PEB》《陆麟 的 WIN2000 SP1的PEB结构》其中JIURL写的那篇是我到现在看到最详细的了。但是他们都没有给出具体的编程实现。所以在这里我就实现了一下PEB结构修改算是一个小小补充吧:)。下面是我的实现代码。关于原理我在里就不多说了,原理的东西可以看上面两个大牛的文章。代码如下:CODE:

eaglenet的专栏 4945

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

通过TEB遍历进程模块

#include "StdAfx.h" #include #include #include typedef struct _PEB_LDR_DATA { UINT Length; BYTE Initialized; void* SsHandle; LIST_ENTRY InLoadOrderModuleList; } PEB_LDR_DATA, *PPEB_LDR_DATA;

Koma的主页 3419

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TEB(线程环境块)学习

文章目录TEBTEB结构中的两个重要成员NtTib成员PEB成员PEB.BeingDebuggedPEB.ImageBaseAddressPEB.LdrPEB.ProcessHeap & PEB.NtGolbalFlag TEB TEB结构中的两个重要成员 +0x000 NtTib :_NT_TIB . . . +0x30 ProcessEnvironmentBlock ...

weixin_44156885的博客 5963

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JIURL玩玩Win2k进程线程篇 PEB

JIURL玩玩Win2k进程线程篇 PEB 作者: JIURL                 主页: http://jiurl.yeah.net     日期: 2003-7-30     PEB,Process Environment Block ,进程环境块。位于用户地址空间。

jiurl的专栏 2855

遍历进程线程

typedef struct _CL_PROCESS_THREADINFO { LPVOID pvStartAddr; // 线程的起始地址 DWORD dwTid; // 线程Id WCHAR wszModuleName[MAX_PATH]; // 所属的模块路径 }CL_PROCESS_THREADINFO;  BOOL CLThread::QueryThreadInf

qq_25420503的专栏 1551

用ollydbg浅识TEB和PEB用来反跟踪

本文目的:借助工具直观接触TEB和PEB。 首先,来了解下什么是TEB和PEB。 TEB(Thread Environment Block,线程环境块):系统在此TEB中保存频繁使用的线程相关的数据。位于用户地址空间。进程中的每个线程都有自己的一个TEB。一个进程的所有TEB都以堆栈的方式,存放在从0x7FFDE000(WinXP,当然,不同的系统可能位于不同的地址)开始的线性内存中,每4KB...

weixin_30267691的博客 328

TEB PEB

PEB typedef struct _PEB { UCHAR InheritedAddressSpace; // 00h UCHAR ReadImageFileExecOptions; // 01h UCHAR BeingDebugged; // 02h UCHAR Spare; // 03h PVOID Mutant; // 04h PVOID

Tan小白的日常 318

TEB

TEB指线程环境块,该结构体包含进程中运行线程的各种信息,进程中的每个线程都对应一个TEB结构体。 Windows7中的TEB结构体成员。 +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIENT_ID //进程的pid +0x028 ActiveRpcHandle : Ptr3.

qq_39249347的博客 2177

TEB结构说明

kd> dt _teb nt!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIENT_ID :1.可以得到当前进程的ID,我们应该这样子得到呢? +0x028 ActiveRpcHandle : Ptr3

IT男也疯狂 9292
上一篇: JIURL玩玩Win2k进程线程篇 PEB
下一篇: flat assembler 1.41 编程者手册
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值