2012-06-21 18 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更简单。即使编码相当简洁,走栈也需要几百个左右。