- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
因为关于这个特定问题的大多数链接都在 http://undocumented.ntinternals.net 上显然已经死了,NtQueryInfoThread 以及相关的 THREADINFOCLASSes 已经从 Winternl.h 中消失了。我现在正坐在这里努力寻找我知道其句柄的进程的 TEB。我尝试从 ntdll.dll 加载方法,这是另一个似乎有效的解决方案,但遗憾的是我仍然无法获得所需的地址。
typedef NTSTATUS(*ThreadInfoProc)(HANDLE, THREADINFOCLASS, PVOID, ULONG, PULONG);
PVOID CProcessHelper::GetThreadStackTopAddress(HANDLE hThread)
{
HINSTANCE ntdllInstance;
ThreadInfoProc NtQueryInfoThread;
ntdllInstance = LoadLibrary("Ntdll.dll");
if (ntdllInstance != NULL)
{
NtQueryInfoThread = (ThreadInfoProc)GetProcAddress(ntdllInstance, "NtQueryInformationThread");
if (NtQueryInfoThread != NULL)
{
THREAD_BASIC_INFORMATION bi;
NT_TIB tib;
NTSTATUS ntstat = 0;
NTSTATUS ntstat = (NtQueryInfoThread)(hThread, (THREADINFOCLASS)0, &bi, sizeof(THREAD_BASIC_INFORMATION),NULL);
ReadProcessMemory(CurrentProcessHandle, bi.TebBaseAddress, &tib, sizeof(NT_TIB), 0);
PrintHex(tib.StackBase); // output: CCCCCCCCCC
}
}
return nullptr;
}
是否有任何其他方式,也许使用公共(public) api 调用来获取线程的 TEB? (正如 MSDN 所述,不应再使用这种方法。)
最好的问候,
亚历克斯
最佳答案
工作正常:S 获取线程的 TEB 的唯一其他方法是使用以下方式读取它:
NT_TIB* tib = (NT_TIB*)__readfsdword(0x18);
并从中读取基址。
您的调用可能会失败,因为您可能没有读取内存的正确权限。尝试使用 VirtualProtect
?
下面的工作,但我只在当前进程上测试过它..
#include <iostream>
#include <windows.h>
typedef LONG NTSTATUS;
typedef DWORD KPRIORITY;
typedef WORD UWORD;
typedef struct _CLIENT_ID
{
PVOID UniqueProcess;
PVOID UniqueThread;
} CLIENT_ID, *PCLIENT_ID;
typedef struct _THREAD_BASIC_INFORMATION
{
NTSTATUS ExitStatus;
PVOID TebBaseAddress;
CLIENT_ID ClientId;
KAFFINITY AffinityMask;
KPRIORITY Priority;
KPRIORITY BasePriority;
} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
enum THREADINFOCLASS
{
ThreadBasicInformation,
};
void* GetThreadStackTopAddress(HANDLE hProcess, HANDLE hThread)
{
bool loadedManually = false;
HMODULE module = GetModuleHandle("ntdll.dll");
if (!module)
{
module = LoadLibrary("ntdll.dll");
loadedManually = true;
}
NTSTATUS (__stdcall *NtQueryInformationThread)(HANDLE ThreadHandle, THREADINFOCLASS ThreadInformationClass, PVOID ThreadInformation, ULONG ThreadInformationLength, PULONG ReturnLength);
NtQueryInformationThread = reinterpret_cast<decltype(NtQueryInformationThread)>(GetProcAddress(module, "NtQueryInformationThread"));
if (NtQueryInformationThread)
{
NT_TIB tib = {0};
THREAD_BASIC_INFORMATION tbi = {0};
NTSTATUS status = NtQueryInformationThread(hThread, ThreadBasicInformation, &tbi, sizeof(tbi), nullptr);
if (status >= 0)
{
ReadProcessMemory(hProcess, tbi.TebBaseAddress, &tib, sizeof(tbi), nullptr);
if (loadedManually)
{
FreeLibrary(module);
}
return tib.StackBase;
}
}
if (loadedManually)
{
FreeLibrary(module);
}
return nullptr;
}
void __stdcall Test()
{
for (int i = 0; i < 10; ++i)
{
printf("Hi. ");
Sleep(500);
}
}
int main()
{
std::cout<<GetThreadStackTopAddress(GetCurrentProcess(), GetCurrentThread())<<"\n";
DWORD threadID = 0;
HANDLE hThread = CreateThread(nullptr, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(Test), nullptr, 0, &threadID);
std::cout<<GetThreadStackTopAddress(GetCurrentProcess(), hThread)<<"\n\n";
CloseHandle(hThread);
Sleep(7000);
return 0;
}
关于c++ - 通过线程句柄获取线程的 TIB/TEB (2015),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297431/
是否有可能(以及如何)访问某个其他进程的线程的线程信息 block ? 最佳答案 这是可能的。 第一步是使用 NtQueryInformationThread 获取线程信息 block 的地址。 Th
经过相当多的谷歌搜索和一些提示后 here ,我终于设法find a layout FS 段(Windows 用来存储 TIB 数据)。我特别感兴趣的是 PSDK 中提供的 ArbitraryUser
我们有 RV 消息系统发布和接收消息。最近升级了一些底层 jar - 这些是所有发布者和订阅者使用的序列化 jar。然而,似乎一些发布者仍在引用旧版本的序列化 jar,因此接收者在尝试反序列化收到的消
因为关于这个特定问题的大多数链接都在 http://undocumented.ntinternals.net 上显然已经死了,NtQueryInfoThread 以及相关的 THREADINFOCLA
我想访问衍生进程的 TIB(我使用 CreateProcessW 成功创建了进程)。 我通过以下方式获得了指向生成进程的 TIB 的指针: GetThreadContext(当然有权限设置) 访问 p
Thread-Information Block 应该广为人知,可以用来访问一些重要的信息。但是我可以用它来保存数据吗? 我已经看到该结构在偏移 14h (x86)/28h (x86-64) 处有一个
我的问题的起源实际上源于想要在支持用户提供堆栈的 Windows 上提供 pthreads 的实现。具体来说,pthread_attr_setstack 应该做一些有意义的事情。我的实际要求比这要复杂
深入研究与 TIB(线程信息 block )一起工作的 Win32 API 函数的实现,例如: TLS 访问函数:TlsAlloc、TlsFree、TlsSetValue、TlsGetValue Ge
在 Windows 中,很早就知道当前线程的线程信息 block (TIB) 可以在 FS:0 处找到(如果未记录的话)。但这只适用于 Intel CPU,其中 FS 寄存器首先存在。现在我想在基于
这是一道面试题: Suppose: I have 100 trillion elements, each of them has size from 1 byte to 1 trillion byte
我是一名优秀的程序员,十分优秀!