GetThreadSelectorEntry
函数原型
BOOL GetThreadSelectorEntry(
[in] HANDLE hThread,
[in] DWORD dwSelector,
[out] LPLDT_ENTRY lpSelectorEntry
);
typedef struct _LDT_ENTRY {
WORD LimitLow;
WORD BaseLow;
union {
struct {
BYTE BaseMid;
BYTE Flags1;
BYTE Flags2;
BYTE BaseHi;
} Bytes;
struct {
DWORD BaseMid : 8;
DWORD Type : 5;
DWORD Dpl : 2;
DWORD Pres : 1;
DWORD LimitHi : 4;
DWORD Sys : 1;
DWORD Reserved_0 : 1;
DWORD Default_Big : 1;
DWORD Granularity : 1;
DWORD BaseHi : 8;
} Bits;
} HighWord;
} LDT_ENTRY, *PLDT_ENTRY;
//代码展示
int main(int argc, char* argv[])
{
HANDLE hThread = GetCurrentThread();
DWORD dwSelector = 0;
WORD wSelector = 0;
__asm
{
mov ax,fs
mov wSelector,ax
};
dwSelector = wSelector;
LDT_ENTRY ldt = {0};
BOOL b = GetThreadSelectorEntry(hThread,dwSelector,&ldt);
return 0;
}
执行结果
TEB和PEB知识参考: TEB和PEB知识参考
1.拼接base 00 37 3000limit:0x0fff
2. teb+0x30 = peb
peb+0x8 = imagebase
参数
[in] hThread
包含指定选择器的线程的句柄。 句柄必须具有THREAD_QUERY_INFORMATION访问权限。 有关详细信息,请参阅 线程安全和访问权限。
[in] dwSelector
要在线程的描述符表中查找的全局或本地选择器值。
[out] lpSelectorEntry
指向 LDT_ENTRY 结构的指针,如果指定的选择器在指定线程的描述符表中有一个条目,该结构接收描述符表条目的副本。 此信息可用于将段相对地址转换为线性虚拟地址。
返回值
如果该函数成功,则返回值为非零值。 在这种情况下, lpSelectorEntry 参数指向的结构将接收指定描述符表条目的副本。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。
注解
GetThreadSelectorEntry 仅在基于 x86 的系统上运行。 对于不基于 x86 的系统,函数返回 FALSE。
调试器使用此函数将段相对地址转换为线性虚拟地址。 ReadProcessMemory 和 WriteProcessMemory 函数使用线性虚拟地址。