17 遠端執行緒
阿新 • • 發佈:2019-01-01
執行緒
1.執行緒是附屬在程序上的執行實體,是程式碼的執行流程;
2.程式碼必須通過執行緒才能執行;
/* *test.c */ #include <stdio.h> #include <windows.h> void fun() { for (int i = 0; i < 10; i++){ printf("fun.......\n"); Sleep(1000); } } DWORD WINAPI ThreadProc(LPVOID lpThreadParameter) { fun(); return 0; } int main() { HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); CloseHandle(hThread); getchar(); return 0; }
首先我們將test.c編譯生成test.exe,並在ThreadProc執行緒函式處下斷點,記錄ThreadProc該函式在test.exe啟動時的虛擬地址(注意:由於VS2013每次編譯函式的虛擬地址有可能改變,自行百度能查到使它每次編譯產生固定虛擬地址的設定),記錄完不要重新編譯該程式,然後到目錄下啟動該程式。
/* *CreateRemoteThread.c */ #include <stdio.h> #include <windows.h> BOOL MyCreateRemoteThread(DWORD dwProcessID, LPTHREAD_START_ROUTINE dwProcAddress) { HANDLE hProcess; HANDLE hThread; DWORD dwThreadID; //1.獲取程序控制代碼 hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID); if (hProcess == INVALID_HANDLE_VALUE){ return FALSE; } //2.建立遠端執行緒 hThread = CreateRemoteThread(hProcess, NULL, 0, dwProcAddress, NULL, 0, &dwThreadID); if (hProcess == INVALID_HANDLE_VALUE){ CloseHandle(hProcess); return FALSE; } //3.關閉資源 CloseHandle(hThread); CloseHandle(hProcess); return TRUE; } int main() { //此處第一個引數為工作管理員檢視的剛才啟動的test.exe的PID //第二個地址為上面記錄的該程序中執行緒處理函式的虛擬地址 MyCreateRemoteThread((DWORD)23508, (LPTHREAD_START_ROUTINE)0x001713F0); return 0; }
填好連個引數後我們編譯啟動該程式,我們可以看到test.exe又開始繼續執行又列印了10個fun,如下圖: