我想使用进程ID和线程ID检索进程的线程的起始地址。
这是我的代码:

DWORD WINAPI GetThreadStartAddress(DWORD tid, DWORD pid)
{

 NTSTATUS ntStatus;

 HANDLE hDupHandle;

 DWORD dwStartAddress;

 HANDLE hProcess;

HANDLE hTread;

pNtQIT NtQueryInformationThread;

hTread = OpenThread(THREAD_ALL_ACCESS, FALSE, tid);

NtQueryInformationThread = (pNtQIT)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQueryInformationThread");

if(NtQueryInformationThread == NULL)
    return 0;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
SuspendThread(hTread);
if(!DuplicateHandle(hProcess, hTread, hProcess, &hDupHandle, THREAD_QUERY_INFORMATION, FALSE, 0)){

    SetLastError(ERROR_ACCESS_DENIED);

    return 0;

}

ntStatus = NtQueryInformationThread(hDupHandle, ThreadQuerySetWin32StartAddress, &dwStartAddress, sizeof(DWORD), NULL);
ResumeThread(hTread );
CloseHandle(hTread);
CloseHandle(hProcess);

CloseHandle(hDupHandle);



if (ntStatus != 0)
    return 0;

return dwStartAddress;


}

但是ntStatus始终不为0。为什么?

最佳答案

假设pid指向您要获取信息的流程,那么您是在该远程流程的上下文中而不是您自己的环境中创建hDupHandle的。您自己的进程可能具有或没有具有相同数值的句柄,但这不是您打算使用的那个。

同样,出于相同的原因,您正在复制远程进程中的随机句柄,而不是从OpenThread中获得的句柄。

呼叫DuplicateHandle应该是

DuplicateHandle(GetCurrentProcess(), hTread, GetCurrentProcess(), &hDupHandle,
  THREAD_QUERY_INFORMATION, FALSE, 0)


尽管我不知道为什么首先要复制手柄,而不是直接使用它。

关于c - NtQueryInformationThread总是在我的代码中失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11153402/

10-10 21:25