Поиск информационного блока другой темы
Есть ли способ найти Информационный блок потока (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;
}