首页
社区
课程
招聘
WindowsPE文件格式入门10.TLS表
发表于: 2025-5-2 14:13 4248

WindowsPE文件格式入门10.TLS表

2025-5-2 14:13
4248

0daK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2T1M7s2y4W2L8X3c8Q4x3X3g2F1k6i4c8Q4x3V1k6@1K9s2u0W2j5h3c8Q4x3X3b7@1x3o6N6Q4x3X3b7I4i4K6u0V1x3g2)9J5k6h3S2@1L8h3H3`.

当一个全局变量,所有的线程都会同时访问这个全局变量,其实就是访问同一块内存,有时我们希望所有的内存访问同一块内存,它们的值是不一样的,同一个线程里面是同一个值,不同线程里面是不同的值.

例如上面代码, 线程1 Thread1 和线程 Thread2 同时运行,访问 函数 TestFunc1 ,但是里面全局变量的值是相互独立,互不影响的,系统提供了2种方式, 显式TLS 和隐式TLS

线程局部存储

由四个api负责

TlsAlloc: 判断数组中哪个元素可以使用,将该元素分配并保留,返回值是数组下标。 TlsSetValue:给数组元素赋值 TlsGetValue:获取数组元素的值 TlsFree: 释放索引 *Set和Get:元素值可以是4字节的值,也可以是指针。比如存结构体类型的TLS,在SetValue之前new个内存, 将指针存入元素;读取的是结构体指针,使用时强转。

TlsAlloc 返回的索引不是无限大的,最基础的需求是64个, 说明线程多的话,索引值可能相同,相同的话也不会存到同一块内存,每个线程都是独立的,该变量的是存入到 TEB 的 E10 位置处

image.png

fs:[18] 保存的是teb的信息

image.png

隐式TLS

变量

●语法:__declspec(thread) 类型 变量名 = xx。对这些变量的访问与普通变量一样,编译器负责处理其中细节分配索引和初始化等,生成动态使用时的代码。

●静态使用TLS变量需要在main之前(入口代码之前)申请数组下标并初始化元素为0。如果在main 中申请,在main之前执行代码时用到TLS变量来不及申请。所以只能记录在PE中,加载完PE立刻申请 TLS。

●每开辟一条新的线程,系统都会拷贝一份TLS变量副本到该线程中。作用域限制在各个线程内部。

●各个线程中TLS变量的初始值取决于申请TLS变量时赋的初始值。

●静态创建的TLS变量不能用于DLL动态库中。

image.png

可以看到全局变量的值被改了,那么怎么变成线程的局部变量呢 变量前面 __declspec(thread)

img

可以看到此时局部变量的值没有被修改

img

fs:[2C] 处,TEB结构体的2C处,先从2C处取首地址,然后根据index计算偏移,将3333333存储到该位置处。tls_index 发现是一个固定地址,猜测在文件中。

img

PE头里面的 TLS 表,使用隐式TLS的时候才存在该表,数据目录第 9(下标) 项


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 5
支持
分享
最新回复 (6)
雪    币: 502
活跃值: (970)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
大佬我们去教课吧,工作是没的搞头了
2025-5-2 14:27
0
雪    币: 1981
活跃值: (2902)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
AL10000 大佬我们去教课吧,工作是没的搞头了[em_051]
哈哈哈哈哈
2025-5-2 14:31
0
雪    币: 34
活跃值: (116)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
教课有成就感
2025-5-6 10:22
0
雪    币: 1421
活跃值: (1702)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

对方撤回一条评论

最后于 2025-5-7 17:20 被cmputer编辑 ,原因:
2025-5-7 17:09
0
雪    币: 1593
活跃值: (1599)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
对方撤回一条评论
2025-5-9 09:37
0
雪    币: 2
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
教课有成就感
2025-5-9 10:12
0
游客
登录 | 注册 方可回帖
返回