通过FS寄存器访问衍生进程的TIB?

我想访问一个派生进程的TIB(我成功创build了CreateProcessW的过程)。

我已经获得了一个指向生成进程的TIB的指针:

  • GetThreadContext(当然有权限设置)
  • 访问pContext.SegFs
  • 格式化如下所示的值: (ldtSel.HighWord.Bits.BaseHi << 24 ) | ( ldtSel.HighWord.Bits.BaseMid << 16 ) | ( ldtSel.BaseLow ); (ldtSel.HighWord.Bits.BaseHi << 24 ) | ( ldtSel.HighWord.Bits.BaseMid << 16 ) | ( ldtSel.BaseLow ); (我不认为这是必要的)。

在格式之后我留下的值是一个10位数字的指针。

我如何使用这个variables来代替fs寄存器来访问线程信息块? 我通常会使用的传统方式就是这样:

  __asm { mov eax, fs:[0x30] // PEB mov dwPebBase, eax } 

但是,用指针variablesreplace“fs”当然是行不通的,删除分号意外的结果。 那么我怎样才能通过这个指针值来访问TIB的成员,我感觉好像在访问不应该被访问的内存(或者试图反正:P)。

感谢您的帮助。

你正在采取错误的做法。 使用NtQueryInformationProcess()而不是GetThreadContext()来访问派生进程的PEB,例如:

 PROCESS_INFORMATION pi = {0}; ... PROCESS_BASIC_INFORMATION pbi = {0}; ULONG pbi_len = 0; if (NtQueryInformationProcess(pi.hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), &pbi_len) >= 0) { if (pbi.PebBaseAddress) { PEB peb = {0}; SIZE_T peb_len = 0; if (ReadProcessMemory(pi.hProcess, pbi.PebBaseAddress, &peb, sizeof(peb), &peb_len)) { // use peb as needed... } } } 

有关更多信息,请参阅以下文章:

用NtQueryInformationProcess获取进程信息

一个简单的技巧就是在你的本地进程中调用ntdll!RtlGetCurrentPeb(),这个例程返回一个指向PEB的指针,这个指针实际上是有效的,并且也指向远程进程中的PEB,然后你可以使用ReadProcessMemory()需要。