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

时间:2013-05-05 09:10:54

标签: c++ c windows multithreading winapi

我想访问一个衍生进程的TIB(我成功创建了CreateProcessW进程)。

我通过以下方式获得了一个指向生成进程的TIB的指针:

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

格式为10位指针后,我留下的值。

如何使用此变量代替fs寄存器来访问线程信息块? 我将访问它的传统方式通常如此:

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

但是,用指针变量替换“fs”当然不会起作用,并且删除分号会产生意外结果。 那么如何通过这个指针值访问TIB的成员,我觉得好像我正在访问不应该被访问的内存(或尝试无论如何:P)。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

你采取了错误的做法。使用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...
        }
    }
}

有关详细信息,请参阅以下文章:

Get Process Info with NtQueryInformationProcess

答案 1 :(得分:0)

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