线程本地存储 (TLS) 包含线程的静态或全局值。当内存位置不是静态的时,这些值对于找到对内存结构的可靠引用可能非常重要。
我想获取另一个进程的线程本地存储。
TLS 应位于线程信息块 (TIB) 中的 [FS:0x2C] 处。虽然我不太明白 FS 寄存器是如何工作的。我想我必须先找到TIB Base地址?我想我可以在使用WINAPI GetThreadContext获得的线程上下文中找到它,但我有点不知所措。
线程本地存储 (TLS) 包含线程的静态或全局值。当内存位置不是静态的时,这些值对于找到对内存结构的可靠引用可能非常重要。
我想获取另一个进程的线程本地存储。
TLS 应位于线程信息块 (TIB) 中的 [FS:0x2C] 处。虽然我不太明白 FS 寄存器是如何工作的。我想我必须先找到TIB Base地址?我想我可以在使用WINAPI GetThreadContext获得的线程上下文中找到它,但我有点不知所措。
您需要使用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()
此处查看执行类似操作的一些示例代码的函数。