远程线程注入

Posted hanhandaren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了远程线程注入相关的知识,希望对你有一定的参考价值。

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 

 

以上是关于远程线程注入的主要内容,如果未能解决你的问题,请参考以下文章

远程线程注入

远程线程注入

远程线程DLL注入, 如何释放DLL和结束DLL的线程

远程线程注入

远程线程注入

PE基础6_远程线程注入-HOOK(消息-InLine-IAT)