DLL注入

将一个不属于某进程的DLL文件加载到该进程当中,称之为DLL注入

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

DLL注入方式

远程线程注入

给进程创建一个远程线程来处理

远程线程注入相关API

OpenProcess打开远程进程
VirtualAllocEx 在远程进程中申请内存空间
WriteProcessMemory 写入数据到远程进程
CreateRemoteThread 创建远程线程
LoadLibrary 加载模块
WaitForSingleObject 等待信号
VirtualFreeEx 释放远程进程内存空间
CloseHandle 关闭句柄
//例子
void Dll_Injection(DWORD pid,char Dll_path[])
{
//1 打开目标进程
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,
FALSE,
pid//进程ID
);
//2 开辟远程内存空间
DWORD buffSize = strlen(Dll_path)+1;
char* str = (char*) VirtualAllocEx(hProcess,0,buffSize, MEM_COMMIT,PAGE_READWRITE);
//3 将dll文件路径写入到远程内存
DWORD realWriteNum = 0;
WriteProcessMemory(hProcess, str,Dll_path, buffSize, &realWriteNum);

//4 给目标进程创建远程线程
//巧合的是LoadLibrary和线程的ThreadProc回调函数的参数是一样的,所以可以直接拿来强转使用
//通过参数传递dll文件路径,但是需要在要注入的远程的进程中开辟内存来存储
//所以需要在目标进程中开辟内存空间
//lpParameter指向要传入的线程的变量的指针
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,(LPTHREAD_START_ROUTINE)LoadLibraryA,str, 0, 0);

//5等待线程调用完毕
WaitForSingleObject(hThread, -1);

//6加载完毕后扫尾 删除内存 关闭句柄
VirtualFreeEx(hProcess, str, 0, MEM_RELEASE);
CloseHandle(hProcess);
CloseHandle(hThread);
}

远程线程注入dll原理分析

给一个进程注入一个线程,然后再这个线程中调用LoadLibrary函数就好了。LoadLibrary这个函数是在Kerner里面的一个dll,只要是Windows的程序都会有他,所以不用考虑LoadLibrary的关系,但是LoadLibrary需要一个参数,这个参数需要考虑,因为远程进程注入后是在别人的内存里面调用,所以不能直接调用你自己的程序里面的内容,需要给你要调用的参数开辟虚拟内存来处理。

远程线程注入DLL步骤

1 拿到进程句柄 OpenProcess

2 给要调用的参数开辟内存空间 VirtualAllocEx

3 给开辟的内存空间赋值 WriteProcessMemory

4 给进程创建线程,然后调用线程要调用的函数 CreateRemoteThread

5 等待线程运行完毕 WaitForSingleObject

5 进行扫尾删除处理 VirtualFreeEx CloseHandle

 

 

 

 

消息钩子注入

劫持进程创建注入

注册表注入

APC注入

ComRes注入

依赖可信进程注入

输入法注入