Поиск информационного блока другого потока - PullRequest
2 голосов
/ 11 мая 2011

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

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

Ответы [ 4 ]

1 голос
/ 27 июля 2012
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

1 голос
/ 11 мая 2011

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

0 голосов
/ 11 мая 2011

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

0 голосов
/ 11 мая 2011

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

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

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

// Microsoft C
void *getTib()
{
    void *pTib;
    __asm {
        mov EAX, FS:[0x18]
        mov [pTib], EAX
    }
    return pTib;
}
...