windows创建远程线程

创建远程进程是在其他进程(非当前进程)中创建一个线程,需要使用 CreateRemoteThread 函数。CreateRemoteThread 函数和 CreateThread 函数相比,只多了一个 HANDLE 类型的参数,这个参数是需要创建线程的进程的句柄。获取到进程句柄后调用 CreateRemoteThread  函数就行了。

被创建线程的进程的源代码如下:

 1 #include <stdio.h>
 2 #include <Windows.h>
 3 
 4 void foo() {
 5     printf("this is foo function!\n");
 6     return;
 7 }
 8 
 9 int main() {
10 
11     printf("The address of foo: %x\n", &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 函数又执行了一遍。

 

 

posted @ 2020-04-21 15:31  syscall  阅读(677)  评论(0编辑  收藏  举报