【发布时间】:2012-06-24 06:13:42
【问题描述】:
我正在使用 C 语言开发一个迷你 Windows 进程资源管理器,我有一个线程句柄。
如何检索该线程的起始地址?像这样:
【问题讨论】:
标签: c windows multithreading winapi
我正在使用 C 语言开发一个迷你 Windows 进程资源管理器,我有一个线程句柄。
如何检索该线程的起始地址?像这样:
【问题讨论】:
标签: c windows multithreading winapi
几天前已经有人问过这样的问题。这是一个示例解决方案:
DWORD WINAPI GetThreadStartAddress(HANDLE hThread)
{
NTSTATUS ntStatus;
HANDLE hDupHandle;
DWORD dwStartAddress;
pNtQIT NtQueryInformationThread = (pNtQIT)GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQueryInformationThread");
if(NtQueryInformationThread == NULL)
return 0;
HANDLE hCurrentProcess = GetCurrentProcess();
if(!DuplicateHandle(hCurrentProcess, hThread, hCurrentProcess, &hDupHandle, THREAD_QUERY_INFORMATION, FALSE, 0)){
SetLastError(ERROR_ACCESS_DENIED);
return 0;
}
ntStatus = NtQueryInformationThread(hDupHandle, ThreadQuerySetWin32StartAddress, &dwStartAddress, sizeof(DWORD), NULL);
CloseHandle(hDupHandle);
if(ntStatus != STATUS_SUCCESS)
return 0;
return dwStartAddress;
}
来源:http://forum.sysinternals.com/how-to-get-the-start-address-and-modu_topic5127_post18072.html#18072
您可能必须包含此文件:http://pastebin.com/ieEqR0eL
相关问题:How to add ntdll.dll to project libraries with LoadLibrary() and GetProcAddress() functions?
【讨论】:
CreateRemoteThread函数调用)。
ntdll.dll 或 chrome.dll 中),获取其中的代码ImageBaseAddress,然后计算偏移量(+0x11ded 部分)。可以通过直接分析 DLL 文件来检索函数名称(msdn.microsoft.com/en-us/library/ms809762.aspx 参见 PE 文件导出部分)。快乐的黑客攻击!
NtQueryInformationThread 与 ThreadQuerySetWin32StartAddress。另一种可能性是使用StackWalk64 遍历线程的堆栈。
如果您只需要起始地址,NtQueryInformationProcess 会更简单很多。即使使用相当简洁的编码,遍历堆栈也需要几百个 lines of code 左右。
【讨论】:
您应该能够使用StackWalk64 或相关函数获取堆栈跟踪,然后使用 dbghelp.dll 对其进行解析。
这篇 CodeProject 文章详细解释了这一切: http://www.codeproject.com/KB/threads/StackWalker.aspx
【讨论】: