这是应用程序从线程本地存储中读取值的汇编代码。
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中数组。因此,要弄清楚内存块中的内容,您必须查看程序如何使用它。