查找另一个线程的线程信息块

时间:2011-05-11 15:35:53

标签: windows multithreading seh

有没有办法找到进程中运行的另一个线程的线程信息块(TIB)?

我需要为另一个线程构造一个异常处理程序,但我不能在线程本身中做到这一点。因此,我需要找到它的TIB并从另一个线程内部构造它。我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:1)

您可以直接从FS寄存器访问TIB的地址(选中http://www.microsoft.com/msj/archive/S2CE.aspx)。 因此,为了获得另一个线程的TIB,可以使用GetThreadContext()来获取FS的值,从而得到TIB的地址? (只是一个猜测,我没试过这个!)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

你可以获得一个帖子的TIB,但是改变它我很怀疑你能做什么。

正如保罗正确指出的那样,这只会获得它所使用的线程的TIB,所以我建议在需要这些数据的线程中调用它,然后将其移动到需要使用它的线程中。

要获得它,您可以使用类似的内容,描述here

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

答案 3 :(得分:0)

这可能不起作用,但请尝试queueing a user-mode APC到设置异常处理程序的目标线程。