远程线程注入

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 }

 

转载于:https://www.cnblogs.com/hanhandaren/p/11147457.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值