1

我想访问一个衍生进程的 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)。

感谢您的帮助。

4

2 回答 2

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...
        }
    }
}

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

使用 NtQueryInformationProcess 获取进程信息

于 2013-05-05T09:42:21.520 回答
0

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

于 2013-05-05T14:32:29.043 回答