这种从线程本地存储指向的内存模式是什么意思?

逆向工程 C++ 线 记忆
2021-07-07 05:55:41

我目前正在寻找的一个应用程序正在使用线程并通过线程本地存储访问某些内容。它是用 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 结构的一部分。

at 的值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(又名AddressOfIndex)字段指向。)

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