DLL注入

概念

DLL注入是将代码注入到一个远程进程中,并让远程进程调用LoadLibrary()函数,从而强制远程进程加载一个DLL程序到进程中。而当DLL被加载时就会运行DLL中的DllMain()函数,所以就会为恶意代码的执行提供机会,而因为DLL本身是由感染后的进程加载的同时PE文件也并没有对系统进行过多的敏感操作,所以这种技术具有相当强的一种隐蔽性。

图示:

DLL注入

DLL注入主要应用于:改善功能与修复Bug、消息钩取、API钩取、恶意代码、监视和管理PC用户的应用程序等。

DLL注入的实现方法:1、创建远程线程(CreateRemoteThread() API2、使用注册表(AppInit_DLLs值):User32.dll加载时会读取AppInit_DLLs,若有值则调用LoadLibrary() API来加载DLL。3、消息钩取(SetWindowsHookEx() API)

相关API函数:

OpenProcess - 用于打开要寄生的目标进程。
VirtualAllocEx/VirtualFreeEx - 用于在目标进程中分配/释放内存空间。
WriteProcessMemory - 用于在目标进程中写入要加载的DLL名称。
CreateRemoteThread - 远程加载DLL的核心内容,用于控制目标进程调用API函数。
LoadLibrary - 目标进程通过调用此函数来加载病毒DLL。

DLL远线程注入技术

远程线程的创建

远线程注入

远程的调用LoadLibraryA去载入我们的DLL

远线程注入技术:

强制创建一个目标进程的线程,将DLL注入进去

强制创建一个目标进程的线程:CreateRemoteThread

示例:

#include “iostream”

#include <Windows.h>

void Inject(int pid)
{
//返回的进程的句柄
HANDLE ProcessHandle=OpenProcess(PROCESS_ALL_ACCESS,NULL,pid);

​ HMODULE hModule = GetModuleHandleA(“kernel32.dll”);

​ //获取 DLL载入 函数的地址
​ LPTHREAD_START_ROUTINE lpStartAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule,“LoadLibraryA”);

​ //创建远程线程
​ CreateRemoteThread(ProcessHandle,NULL,0,lpStartAddress,内存地址,0,NULL);

}

int main()
{

​ system(“pause”);

​ return 0;

}

OpenProcess函数:

打开现有的本地进程对象

参数:

PROCESS_ALL_ACCESS,NULL,PID(processid本地进程标识符)

CreateRemoteThread函数:

参数:

要创建线程的进程的句柄,指向SECURITY_ATTRIBUTES的指针,堆栈的初始大小,lpStartAddress,指向要传递给线程函数的变量的指针(内存地址)

lpStartAddress(最重要的参数)

指向由进程创建的LPTHREAD_START_ROUTINE 类型的应用程序定义函数的指针,表示远程进程中线程的起始地址,该功能必须存在于远程进程中

指向由进程创建的LPTHREAD_START_ROUTINE 类型的应用程序定义函数的指针,表示远程进程中线程的起始地址,该功能必须存在于远程进程中

相关文章: