2012-06-21 23 views

回答

4

這樣的問題在幾天前已經被問到了。這裏有一個簡單的解決方案:

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?

+0

謝謝,但這個函數會返回一個數字。 如何將其作爲起始地址使用? –

+0

該函數返回目標進程地址空間中線程的起始地址。您可以以任何您想要的方式使用它(例如,如果您知道函數定義,則可以使用CreateRemoteThread函數將其轉換並調用)。 –

+0

我可以找回像這樣的東西:chrome.dll!chromeMain + 0x11ded 使用那個數字嗎? –

3

NtQueryInformationThreadThreadQuerySetWin32StartAddress。另一種可能是用StackWalk64走線的堆棧。

如果您只需要起始地址,NtQueryInformationProcesslot更簡單。即使編碼相當簡潔,走棧也需要幾百個左右。