DLL注入
概念
DLL注入是将代码注入到一个远程进程中,并让远程进程调用LoadLibrary()函数,从而强制远程进程加载一个DLL程序到进程中。而当DLL被加载时就会运行DLL中的DllMain()函数,所以就会为恶意代码的执行提供机会,而因为DLL本身是由感染后的进程加载的同时PE文件也并没有对系统进行过多的敏感操作,所以这种技术具有相当强的一种隐蔽性。
图示:
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 类型的应用程序定义函数的指针,表示远程进程中线程的起始地址,该功能必须存在于远程进程中