2

プロセスで実行されている別のスレッドのスレッド情報ブロック (TIB) を見つける方法はありますか?

別のスレッドの例外ハンドラを構築する必要がありますが、スレッド自体では実行できません。したがって、TIB を見つけて、別のスレッド内から構築する必要があります。どうすればこれを達成できますか?

4

4 に答える 4

1

FS レジスタから直接 TIB のアドレスにアクセスできます ( http://www.microsoft.com/msj/archive/S2CE.aspxを確認してください)。別のスレッドの TIB を取得するには、GetThreadContext() を使用して FS の値を取得し、TIB のアドレスを取得できますか? (ただの推測です、私はこれを試していません!)

于 2011-05-11T15:51:17.597 に答える
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

于 2012-07-27T15:39:31.773 に答える
0

スレッドの TIB を取得することはできますが、それを変更することはできません。

ポールが正しく指摘したように、これは使用されたスレッドの TIB のみを取得するため、このデータが必要なスレッドで呼び出してから、使用する必要があるスレッドに移動することをお勧めします。

それを取得するには、ここで説明する次のようなものを使用できます。

// Microsoft C
void *getTib()
{
    void *pTib;
    __asm {
        mov EAX, FS:[0x18]
        mov [pTib], EAX
    }
    return pTib;
}
于 2011-05-11T15:48:02.430 に答える
0

これはうまくいかないかもしれませんが、例外ハンドラーを設定するターゲット スレッドにユーザー モード APC をキューに入れてみてください。

于 2011-05-11T15:52:28.043 に答える