码迷,mamicode.com
首页 > 编程语言 > 详细

远程线程注入

时间:2019-07-07 20:17:09      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:comm   address   内存   步骤   进程id   write   拷贝   关闭   入口   

1.远程注入流程:

  在进程A中创建远程线程,将线程函数指向为LoadLibrary();

具体实现步骤:

  1. 在进程A中分配空间,存储“A.DLL”
  2. 获取LoadLibrary函数的地址
  3. 创建远程线程,执行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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!