DLL远程线程注入技术

文章目录

  • DLL注入
    • Main
    • DLL

DLL注入

DLL注入:简而言之就是将一个不属于某进程的DLL文件加载到该进程当中。

Dll注入初衷是给第三方的应用程序进行一个功能的扩展

API作用
OpenProcess打开远程进程
VirtualAllocEx在远程进程中申请内存空间
WriteProcessMemory写入数据到远程进程
CreateRemoteThread创建远程线程
Loadlibrary加载模块
WaitForSingleObject等待信号
VirtualFreeEx释放远程进程内存空间
CloseHandle关闭句柄

常用API:

OpenProcess : 根据进程ID,打开进程句柄

HANDLE OpenProcess([in] DWORD dwDesiredAccess,	//对此进程打开的权限[in] BOOL  bInheritHandle,	//是否继承[in] DWORD dwProcessId		//进程ID
);

VirtualAllocEx:在指定的进程中分配虚拟内存空间

LPVOID VirtualAllocEx([in]           HANDLE hProcess,	//进程句柄[in, optional] LPVOID lpAddress,	//分配的虚拟地址的起始地址,NULL则默认[in]           SIZE_T dwSize,		//分配的虚拟内存大小[in]           DWORD  flAllocationType,	//分配的类型,预定/提交状态[in]           DWORD  flProtect	//分配的内存的属性  可读/可写 ...
);

WriteProcessMemory: 往指定的进程写入内存

BOOL WriteProcessMemory([in]  HANDLE  hProcess,	//进程句柄[in]  LPVOID  lpBaseAddress,	//指向指定进程中写入数据的基地址的指针,说白了就是你刚刚分配的虚拟内存的地址[in]  LPCVOID lpBuffer,//要写入的数据缓冲区的指针[in]  SIZE_T  nSize,	//要写入的数据的大小[out] SIZE_T  *lpNumberOfBytesWritten//接收传输到目标的字节数
)

CreateRemoteThread :创建进程的一个虚拟线程

HANDLE CreateRemoteThread([in]  HANDLE                 hProcess,//进程句柄[in]  LPSECURITY_ATTRIBUTES  lpThreadAttributes,//安全描述符[in]  SIZE_T                 dwStackSize,//栈大小[in]  LPTHREAD_START_ROUTINE lpStartAddress,//线程的函数指针[in]  LPVOID                 lpParameter,//传入函数的参数[in]  DWORD                  dwCreationFlags,//创建线程的标识[out] LPDWORD                lpThreadId//接收线程标识符
);

VirtualFreeEx : 释放开辟的虚拟内存

BOOL VirtualFreeEx([in] HANDLE hProcess,	//进程句柄[in] LPVOID lpAddress,//开辟的虚拟内存的地址[in] SIZE_T dwSize,//大小[in] DWORD  dwFreeType//释放类型
);

Main

  1. 打开指定的进程句柄。
DWORD ProId = 4424;
//打开进程句柄
HANDLE ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProId);
  1. 为这个进程开辟虚拟内存
//申请远程虚拟内存
LPVOID Alloc=VirtualAllocEx(ProcessHandle,NULL,nlen,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
if (!Alloc)
{printf("申请远程内存失败!  %d\n", GetLastError());system("pause");return 0;
}
  1. 往指定的进程中写入此虚拟内存的数据
//写入内存
SIZE_T realsize = 0;	
WriteProcessMemory(ProcessHandle,Alloc,"MyDll.dll",nlen,&realsize);
  1. 开辟进程的远程线程,并等待线程句柄处于有信号状态。
//3. 创建远程线程
HANDLE MyHandle =  CreateRemoteThread(ProcessHandle,NULL,NULL,(LPTHREAD_START_ROUTINE)LoadLibraryA,Alloc,	//传入线程的变量,加载内存空间NULL,NULL
);
WaitForSingleObject(MyHandle, -1);
  1. 释放句柄及虚拟内存
printf("LastError:%d\n", GetLastError());
VirtualFreeEx(ProcessHandle, (char*)Alloc, NULL, MEM_RELEASE);
CloseHandle(ProcessHandle);
CloseHandle(MyHandle);

完整代码:

#include 
#include int main()
{DWORD nlen = strlen("MyDll.dll") + 1;DWORD ProId = 4424;//打开进程句柄HANDLE ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProId);//申请远程虚拟内存LPVOID Alloc=VirtualAllocEx(ProcessHandle,NULL,nlen,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);if (!Alloc){printf("申请远程内存失败!  %d\n", GetLastError());system("pause");return 0;}//写入内存SIZE_T realsize = 0;	WriteProcessMemory(ProcessHandle,Alloc,"MyDll.dll",nlen,&realsize);//3. 创建远程线程HANDLE MyHandle =  CreateRemoteThread(ProcessHandle,NULL,NULL,(LPTHREAD_START_ROUTINE)LoadLibraryA,Alloc,	//传入线程的变量,加载内存空间NULL,NULL);WaitForSingleObject(MyHandle, -1);printf("LastError:%d\n", GetLastError());VirtualFreeEx(ProcessHandle, (char*)Alloc, NULL, MEM_RELEASE);CloseHandle(ProcessHandle);CloseHandle(MyHandle);system("pause");return 0;
}

DLL

我们让它弹出一个框。

设置DLL文件项目的属性为 DLL动态库类型:
在这里插入图片描述

#include 
#includeBOOL WINAPI DllMain(DWORD Reason, LPVOID Param)
{if (Reason == DLL_THREAD_ATTACH){MessageBoxA(NULL, "DLL注入成功!", "提示", MB_OK);}return TRUE;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部