创建远程进程是在其他进程(非当前进程)中创建一个线程,需要使用 CreateRemoteThread 函数。CreateRemoteThread 函数和 CreateThread 函数相比,只多了一个 HANDLE 类型的参数,这个参数是需要创建线程的进程的句柄。获取到进程句柄后调用 CreateRemoteThread 函数就行了。
被创建线程的进程的源代码如下:
1 #include <stdio.h> 2 #include <Windows.h> 3 4 void foo() { 5 printf("this is foo function! "); 6 return; 7 } 8 9 int main() { 10 11 printf("The address of foo: %x ", &foo); 12 foo(); 13 14 getchar(); 15 16 return 0; 17 }
当前进程的源代码:
1 #include <stdio.h> 2 #include <Windows.h> 3 4 char msg[128]; 5 6 BOOL MyCreateRemoteThread(DWORD dwProcessId, DWORD fun) { 7 /* 8 1. 获取被创建线程的进程的句柄 9 */ 10 HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, NULL, dwProcessId); 11 if (!hProc) { 12 sprintf(msg, "OpenProcess failed: %d", GetLastError()); 13 MessageBox(NULL, msg, NULL, MB_OK); 14 return false; 15 } 16 /* 17 2. 创建远程线程 18 */ 19 HANDLE hrThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)fun, NULL, 0, NULL); 20 if (!hrThread) { 21 sprintf(msg, "CreateRemoteThread failed: %d", GetLastError()); 22 CloseHandle(hProc); 23 MessageBox(NULL, msg, NULL, MB_OK); 24 return false; 25 } 26 27 28 CloseHandle(hProc); 29 CloseHandle(hrThread); 30 return true; 31 } 32 33 int main() { 34 /* 这里的两个参数分别是要被创建线程的进程的PID和创建进程后要执行的代码的地址(注意这个地址不能是当前进程的地址)*/ 35 MyCreateRemoteThread(8764, 0xf510f0); 36 return 0; 37 }
执行结果:
创建远程进程前:
创建远程线性后,foo 函数又执行了一遍。