我目前正在寻找添加的应用程序正在使用线程,并通过线程本地存储访问某些内容。它是使用Visual C ++(可能是6.0)编译的。第一个问题是,在哪里可以找到有关线程本地存储所包含内容的更多信息?我还不太了解。

这是应用程序从线程本地存储中读取值的汇编代码。

MOV EAX,0
MOV ECX,DWORD PTR FS:[0x2C]
MOV EDX,DWORD PTR DS:[ECX + EAX * 4]
MOV EAX,DWORD PTR DS:[EDX+4]


EAX是一个指针,指向具有特殊模式的以下存储区。



它基本上是这样的:
52
P->...
P->...
5

52
P->...
P->...
5

52
P->...
P->...
5


我想知道这是否是某种标准数据结构。

#1 楼

您正在查看的区域是该程序的特定内容;它不是Windows结构的一部分。

fs:[0x2C]的值是TLS数组-指向程序内存中某个特定于线程的变量块的指针数组。以下是对__declspec(thread)变量的典型TLS访问方式:

mov eax, DWORD PTR __tls_index    ; load TLS index for current thread
mov ecx, DWORD PTR fs:__tls_array ; load the TLS array pointer (FS:[2Ch])
mov edx, DWORD PTR [ecx+eax*4]    ; fetch the pointer to the TLS block for current thread
mov eax, DWORD PTR [edx+4h]       ; load the thread variable at offset 4 in the TLS block


__tls_index变量由PE TLS目录的TlsIndex(aka AddressOfIndex)字段指向) 。)

TLS块的实际内容取决于程序-操作系统仅确保每个线程都获得初始TLS模板的单独副本,并将指向它的指针放在TLS中数组。因此,要弄清楚内存块中的内容,您必须查看程序如何使用它。