0

プロセス 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 ではありません。なぜですか?

4

2 に答える 2

1

pidそれが情報を取得しようとしているプロセスを指していると仮定するとhDupHandle、自分のプロセスではなく、そのリモートプロセスのコンテキストで作成していることになります。独自のプロセスには同じ数値のハンドルがある場合とない場合がありますが、それは意図したものではありません。

また、同じ理由で、OpenThreadから取得したハンドルではなく、リモートプロセスからランダムなハンドルを複製しています。

への呼び出しDuplicateHandle

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

ハンドルを直接使用するのではなく、そもそもなぜ複製しているのかわかりませんが。

于 2012-06-24T21:46:15.783 に答える
1

OpenThread と OpenProcess が失敗する可能性があります (特に権限が不十分なため)。NtQueryInformationThread を呼び出す前に、有効なハンドルがあることを確認する必要があります。

于 2012-06-25T07:20:06.830 に答える