有没有办法找到在您的进程中运行的另一个线程的线程信息块 (TIB)?
我需要为另一个线程构造一个异常处理程序,但我不能在线程本身中做到这一点。因此我需要找到它的 TIB 并从另一个线程中构建它。我怎样才能做到这一点?
有没有办法找到在您的进程中运行的另一个线程的线程信息块 (TIB)?
我需要为另一个线程构造一个异常处理程序,但我不能在线程本身中做到这一点。因此我需要找到它的 TIB 并从另一个线程中构建它。我怎样才能做到这一点?
您可以直接从 FS 寄存器访问 TIB 的地址(检查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
您可以获得线程的 TIB,但我非常怀疑您可以更改它。
正如 Paul 正确指出的那样,这只会获取它使用它的线程的 TIB,因此我建议在您需要此数据的线程中调用它,然后将其移动到您需要使用它的线程。
要得到它,你可以使用这样的东西,在这里描述:
// Microsoft C
void *getTib()
{
void *pTib;
__asm {
mov EAX, FS:[0x18]
mov [pTib], EAX
}
return pTib;
}
这可能不起作用,但尝试将用户模式 APC 排队到设置异常处理程序的目标线程。