远程线程注入
标签:comm address 内存 步骤 进程id write 拷贝 关闭 入口
1.远程注入流程:
在进程A中创建远程线程,将线程函数指向为LoadLibrary();
具体实现步骤:
- 在进程A中分配空间,存储“A.DLL”
- 获取LoadLibrary函数的地址
- 创建远程线程,执行LoadLibrary();
1 // 远程线程注入.cpp : 定义控制台应用程序的入口点。
2 //
3
4
5 #include "stdafx.h"
6 #include 7
8 /************************************************************************/
9 /* 函数功能加载DLL
10 参数:dwProcessID 要注入进程的ID
11 szDllpathName加载的Dll路径*/
12 /************************************************************************/
13
14 BOOL LoadDll(DWORD dwProcessID, char *szDllpathName)
15 {
16 BOOL bRet;
17 HANDLE hProcess;
18 HANDLE hThread;
19 DWORD dwLength;
20 DWORD dwLoadAddr;
21 LPVOID lpAllocAddr;
22 DWORD dwThreadID;
23 HMODULE hModule;
24
25 bRet = 0;
26 dwLoadAddr = 0;
27 //1.获取进程的句柄
28 hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
29 if (hProcess == NULL)
30 {
31 OutputDebugString("OpenProcessError!\n");
32 return FALSE;
33 }
34 //2.计算DLL路径名字长度,并且要加上0结尾的长度
35 dwLength = strlen(szDllpathName) + 1;
36
37 //3.在目标进程分配内存
38 lpAllocAddr = VirtualAllocEx(hProcess, NULL, dwLength, MEM_COMMIT, PAGE_READWRITE);//在指定的进程中分配内存
39 if (lpAllocAddr == NULL)
40 {
41 OutputDebugString("VirtualAllocEx Error!\n");
42 CloseHandle(hProcess);
43 return FALSE;
44 }
45
46 //4.拷贝DLL路径名字到目标进程的内存
47 bRet = WriteProcessMemory(hProcess, lpAllocAddr, szDllpathName, dwLength, NULL);
48 if (bRet == NULL)
49 {
50 OutputDebugString("WriteProcessMemory Error!\n");
51 CloseHandle(hProcess);
52 return FALSE;
53 }
54
55 //5.获取模块地址
56 /*因为每个进程中的LoadLibrary函数都在Kernel32,dll中,而且此dll的物理页是共享的,所以
57 我们进程中获得的LoadLibrary地址和别的进程都是一样的*/
58 hModule = GetModuleHandle("kernel32.dll");
59 if (!hModule)
60 {
61 OutputDebugString("WriteProcessMemory Error!\n");
62 CloseHandle(hProcess);
63 return FALSE;
64 }
65
66 //6.获取LoadLibraryA的 函数地址
67 //GetProcAddress是一个计算机函数,功能是检索指定的动态链接库(DLL)中的输出库函数地址。lpProcName参数能够识别DLL中的函数。
68 dwLoadAddr =(DWORD) GetProcAddress(hModule, "LoadLibraryA");
69 if (!dwLoadAddr)
70 {
71 OutputDebugString("WriteProcessMemory Error!\n");
72 CloseHandle(hProcess);
73 CloseHandle(hModule);
74 return FALSE;
75 }
76
77 //7.创建远程线程,加载DLL
78 hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)dwLoadAddr, lpAllocAddr, 0, NULL);//lpAllocAddr传给线程函数的参数.因为dll名字分配在内存中
79 if (hThread == NULL)
80 {
81 OutputDebugString("CreateRemoteThread Error!\n");
82 CloseHandle(hProcess);
83 CloseHandle(hModule);
84 return FALSE;
85 }
86 //8.关闭资源
87 CloseHandle(hProcess);
88 CloseHandle(hThread);
89 CloseHandle(hModule);
90 return TRUE;
91 }
92
93
94
95
96 int main()
97 {
98 //LoadDll(进程ID,dll地址);
99 return 0;
100 }
远程线程注入
标签:comm address 内存 步骤 进程id write 拷贝 关闭 入口
原文地址:https://www.cnblogs.com/hanhandaren/p/11147457.html
文章来自:
搜素材网的
编程语言模块,转载请注明文章出处。
文章标题:
远程线程注入
文章链接:http://soscw.com/essay/31658.html
评论