CreateRemoteThread函数
CreateRemoteThread函數(shù)
創(chuàng)建在另一個進(jìn)程的虛擬地址空間中運行的線程。
使用CreateRemoteThreadEx函數(shù)創(chuàng)建在另一個進(jìn)程的虛擬地址空間中運行的線程,并可選擇指定擴(kuò)展屬性。
語法
HANDLE CreateRemoteThread(HANDLE hProcess,LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId );參數(shù)
- hProcess
要創(chuàng)建線程的進(jìn)程的句柄。句柄必須具有PROCESS_CREATE_THREAD,PROCESS_QUERY_INFORMATION,PROCESS_VM_OPERATION,PROCESS_VM_WRITE和PROCESS_VM_READ訪問權(quán)限,并且在某些平臺上沒有這些權(quán)限時可能會失敗。有關(guān)更多信息,請參閱 進(jìn)程安全性和訪問權(quán)限。
- lpThreadAttributes
指向SECURITY_ATTRIBUTES結(jié)構(gòu)的指針,該 結(jié)構(gòu)指定新線程的安全描述符,并確定子進(jìn)程是否可以繼承返回的句柄。如果lpThreadAttributes為NULL,則線程獲取默認(rèn)安全描述符,并且不能繼承句柄。線程的默認(rèn)安全描述符中的訪問控制列表(ACL)來自創(chuàng)建者的主令牌。
Windows XP: 線程的默認(rèn)安全描述符中的ACL來自創(chuàng)建者的主要或模擬令牌。Windows XP SP2和Windows Server 2003更改了此行為。
- dwStackSize
堆棧的初始大小,以字節(jié)為單位。系統(tǒng)將此值四舍五入到最近的頁面。如果此參數(shù)為0(零),則新線程將使用可執(zhí)行文件的默認(rèn)大小。有關(guān)更多信息,請參閱 線程堆棧大小。
- lpStartAddress
指向由線程執(zhí)行的LPTHREAD_START_ROUTINE類型的應(yīng)用程序定義函數(shù)的指針,表示遠(yuǎn)程進(jìn)程中線程的起始地址。該功能必須存在于遠(yuǎn)程進(jìn)程中。有關(guān)更多信息,請參閱 ThreadProc。
- lpParameter
指向要傳遞給線程函數(shù)的變量的指針。
- dwCreationFlags
控制線程創(chuàng)建的標(biāo)志。
| 0 | 該線程在創(chuàng)建后立即運行。 |
| CREATE_SUSPENDED 0x00000004 | 線程是在掛起狀態(tài)下創(chuàng)建的,并且在調(diào)用ResumeThread函數(shù)之前不會運行 。 |
| STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000 | 所述dwStackSize參數(shù)指定堆棧的初始保留大小。如果未指定此標(biāo)志,則dwStackSize指定提交大小。 |
- lpThreadId
指向接收線程標(biāo)識符的變量的指針。
如果此參數(shù)為NULL,則不返回線程標(biāo)識符。
返回值
如果函數(shù)成功,則返回值是新線程的句柄。
如果函數(shù)失敗,則返回值為NULL。要獲取擴(kuò)展錯誤信息,請調(diào)用 GetLastError。
請注意,即使lpStartAddress指向數(shù)據(jù),代碼或無法訪問, CreateRemoteThread也可能成功。如果線程運行時起始地址無效,則發(fā)生異常,并且線程終止。由于無效的起始地址導(dǎo)致的線程終止被視為線程進(jìn)程的錯誤退出。此行為類似于CreateProcess的異步特性, 即使創(chuàng)建進(jìn)程無效或缺少動態(tài)鏈接庫(DLL),也會創(chuàng)建該進(jìn)程。
備注
該遠(yuǎn)程線程函數(shù)會導(dǎo)致一個新的執(zhí)行線程指定進(jìn)程的地址空間開始。該線程可以訪問進(jìn)程打開的所有對象。
終端服務(wù)按設(shè)計隔離每個終端會話。因此,如果目標(biāo)進(jìn)程與調(diào)用進(jìn)程位于不同的會話中,則 CreateRemoteThread將失敗。
創(chuàng)建新的線程句柄,可以完全訪問新線程。如果未提供安全描述符,則句柄可用于需要線程對象句柄的任何函數(shù)中。當(dāng)提供安全描述符時,在授予訪問權(quán)限之前,對句柄的所有后續(xù)使用執(zhí)行訪問檢查。如果訪問檢查拒絕訪問,則請求進(jìn)程無法使用句柄來獲取對線程的訪問權(quán)限。
如果線程是在可運行狀態(tài)下創(chuàng)建的(即,如果未使用CREATE_SUSPENDED標(biāo)志),則線程可以在CreateThread返回之前開始運行,特別是在調(diào)用者接收到創(chuàng)建的線程的句柄和標(biāo)識符之前。
創(chuàng)建的線程的線程優(yōu)先級為THREAD_PRIORITY_NORMAL。使用 GetThreadPriority和 SetThreadPriority函數(shù)來獲取和設(shè)置線程的優(yōu)先級值。
當(dāng)線程終止時,線程對象獲得信號狀態(tài),該狀態(tài)滿足等待對象的線程。
線程對象保留在系統(tǒng)中,直到線程終止并且通過調(diào)用CloseHandle關(guān)閉它的所有 句柄。
ExitProcess, ExitThread, CreateThread, CreateRemoteThread的功能,以及正在啟動一個過程(作為結(jié)果 的CreateProcess呼叫)的過程中彼此之間串行化。這些事件中只有一個一次發(fā)生在地址空間中。這意味著以下限制:
- 在進(jìn)程啟動和DLL初始化例程期間,可以創(chuàng)建新線程,但是在為進(jìn)程執(zhí)行DLL初始化之前它們不會開始執(zhí)行。
- 進(jìn)程中只有一個線程可以一次處于DLL初始化或分離例程中。
- 所有線程完成DLL初始化或分離例程后,ExitProcess返回。
此函數(shù)的一個常見用途是將線程注入正在調(diào)試的進(jìn)程中以發(fā)出中斷。但是,建議不要使用此方法,因為額外的線程會使調(diào)試應(yīng)用程序的人感到困惑,并且使用此技術(shù)會產(chǎn)生一些副作用:
- 它將單線程應(yīng)用程序轉(zhuǎn)換為多線程應(yīng)用程序。
- 它改變了進(jìn)程的時序和內(nèi)存布局。
- 它導(dǎo)致調(diào)用進(jìn)程中每個DLL的入口點。
此函數(shù)的另一個常見用途是將一個線程注入進(jìn)程以查詢堆或其他進(jìn)程信息。這可能會導(dǎo)致前一段中提到的相同副作用。此外,如果線程嘗試獲取另一個線程正在使用的鎖的所有權(quán),則應(yīng)用程序可能會死鎖。
總結(jié)
以上是生活随笔為你收集整理的CreateRemoteThread函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python从视频中提取音频_提取视频中
- 下一篇: 前端如何调用后端接口_后端开发:如何写出