如何找到 Windows 进程线程的线程本地存储 (TLS)?

逆向工程 视窗 登录 线
2021-07-04 08:35:35

线程本地存储 (TLS) 包含线程的静态或全局值。当内存位置不是静态的时,这些值对于找到对内存结构的可靠引用可能非常重要。

我想获取另一个进程的线程本地存储。

TLS 应位于线程信息块 (TIB) 中的 [FS:0x2C] 处虽然我不太明白 FS 寄存器是如何工作的。我想我必须先找到TIB Base地址?我想我可以在使用WINAPI GetThreadContext获得的线程上下文中找到它,但我有点不知所措。

1个回答

您需要使用GetThreadSelectorEntry().

伪代码:

GetThreadContext(hThread, &context);
GetThreadSelectorEntry(hThread, context.SegFs, &selectorEntry);
ReadProcessMemory(hProcess, (selectorEntry.BaseLow | (selectorEntry.HighWord.Bytes.BaseMid << 0x10) | (selectorEntry.HighWord.Bytes.BaseHi << 0x18)) + 0x2C, &pTLS, sizeof(pTLS), &numberOfBytesRead);

您可以在GetProcessEntryPointAddress() 此处查看执行类似操作的一些示例代码的函数