标签:comm address 内存 步骤 进程id write 拷贝 关闭 入口
1.远程注入流程:
在进程A中创建远程线程,将线程函数指向为LoadLibrary();
具体实现步骤:
1 // 远程线程注入.cpp : 定义控制台应用程序的入口点。 2 // 3 4 5 #include "stdafx.h" 6 #include <windows.h> 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