Поиск информационного блока другой темы

Есть ли способ найти Информационный блок потока (TIB) другого потока, работающего в вашем процессе?

Мне нужно создать обработчик исключений для другого потока, но я не могу сделать это в самом потоке. Поэтому мне нужно найти его TIB и построить его из другого потока. Как мне этого добиться?

4 ответа

Решение

Вы можете получить доступ к адресу TIB непосредственно из реестра FS (см. http://www.microsoft.com/msj/archive/S2CE.aspx). Таким образом, чтобы получить TIB для другого потока, может быть, можно использовать GetThreadContext(), чтобы получить значение FS и, следовательно, адрес TIB? (просто предположение, я не пробовал это!)

void PrintTibAddress(DWORD thread_id) {
  HANDLE thread_handle = OpenThread(THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION, FALSE, thread_id);
  if (thread_handle == NULL) return;

  SuspendThread(thread_handle);

  CONTEXT context;
  context.ContextFlags = CONTEXT_SEGMENTS;
  if (!GetThreadContext(thread_handle, &context)) {
    CloseHandle(thread_handle);
    return;
  }

  LDT_ENTRY ldtSel;
  if (!GetThreadSelectorEntry(thread_handle, context.SegFs, &ldtSel)) return;

  ResumeThread(thread_handle);

  DWORD fs_base = (ldtSel.HighWord.Bits.BaseHi << 24 ) | ( ldtSel.HighWord.Bits.BaseMid << 16 ) | ( ldtSel.BaseLow );
  fwprintf(stdout, L"[i] FS:[0] (TIB) is @ 0x%08X\n", fs_base);
}

Рекомендации:

http://recxltd.blogspot.de/2012/02/from-archives-printing-seh-chain-from.html http://msdn.microsoft.com/en-us/library/windows/desktop/ms679362(v = vs.85).aspx

Полный пример программы: http://pastebin.com/gSTcPz1y

Это может не сработать, но попробуйте поставить APC пользовательского режима в очередь на целевой поток, который устанавливает ваш обработчик исключений.

Вы можете получить TIB потока, но изменяя его, я очень сомневаюсь, что вы можете сделать.

Как правильно указал Пол, он получает TIB только для потока, в котором он использовался, поэтому я предлагаю вызвать его в потоке, из которого вам нужны эти данные, и затем переместить его в поток, где вам нужно его использовать.

Чтобы получить его, вы можете использовать что-то вроде этого, описанное здесь:

// Microsoft C
void *getTib()
{
    void *pTib;
    __asm {
        mov EAX, FS:[0x18]
        mov [pTib], EAX
    }
    return pTib;
}
Другие вопросы по тегам