一种Reflective DLL注入后的DLL卸载处理

2024-03-25 21:28

本文主要是介绍一种Reflective DLL注入后的DLL卸载处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概念

Reflective DLL injection,即反射型DLL注入,是一种库注入技术,其中采用反射编程的概念来执行将库从内存加载到主机进程中的操作。因此,该库负责通过实现最小的可移植可执行(PE)文件加载器来加载自身。然后,它可以通过与主机系统和进程的最小交互来控制它将如何加载并与主机交互。
反射DLL注入是一种允许攻击者从内存注入,而不是从磁盘文件将DLL注入目标进程的技术。

概述

假设我们在主机进程中执行代码,并且我们希望注入的库已写入主机进程中内存的任意位置,反射 DLL 注入的工作原理如下:

  • 执行通过 CreateRemoteThread() 或小型引导 shellcode 传递到库的 ReflectiveLoader 函数,该函数是库导出表中的导出函数。
  • 由于库的图像当前存在于内存中的任意位置,ReflectiveLoader 将首先计算其自己的图像在内存中的当前位置,以便能够解析其自己的标头以供稍后使用。
  • 然后ReflectiveLoader将解析主机进程kernel32.dll导出表,以计算加载程序所需的三个函数的地址,即LoadLibraryA、GetProcAddress和VirtualAlloc。
  • ReflectiveLoader 现在将分配一个连续的内存区域,它将继续加载自己的图像。该位置并不重要,因为加载程序稍后会正确地重新定位图像。
  • 库的标头和节被加载到内存中的新位置。
  • 然后 ReflectiveLoader 将处理新加载的图像导入表副本,加载任何其他库并解析它们各自的导入函数地址。
  • 然后 ReflectiveLoader 将处理新加载的图像重定位表副本。
  • 然后 ReflectiveLoader 将使用 DLL_PROCESS_ATTACH 调用其新加载的图像的入口点函数 DllMain。该库现已成功加载到内存中。
  • 最后,ReflectiveLoader 将返回执行到调用它的初始引导 shellcode,或者如果通过 CreateRemoteThread 调用它,则线程将终止。
    参考代码:Reflective DLL Injection

需求

在某些业务场景下,希望在被注入进程退出时进行一些额外的操作。一般情况下,在一个进程中,通过LoadLibrary或者通过CreateRemoteThread方式LoadLibrary的DLL,在进程退出时都会调用DLL的DLL_PROCESS_DETACH方法,这样可以在此时做一些清理工作。
通过反射注入的DLL,因为在内存中自己实现对DLL的映射加载,没有调用系统API LoadLibrary函数,导致进程退出时,注入的DLL中的DLL_PROCESS_DETACH不会触发,无法实现后期的清理动作。
大致流程

方案

当调用LoadLibrary加载DLL时,基本流程如下:
在这里插入图片描述
Peb->Ldr->InInitializationOrderModuleList记录了加载后的DLL相关信息,包含DLL的DllMain方法,即:EntryPoint方法,最后触发DLL中的DLL_PROCESS_ATTACH。

当调用FreeLibrary时,基本流程如下:
在这里插入图片描述
这里,通过遍历InInitializationOrderModuleList链表,当卸载某一系统dll时,Hook掉它的EntryPoint方法,即可实现在进程退出时进行后期的清理工作

		pListHeader = &pLdr->InInitializationOrderModuleList;pListEntry = (PLIST_ENTRY64)pListHeader->Flink;for (;;){if ( pListEntry == pListHeader ){break;}ldrDataTable = CONTAINING_RECORD(pListEntry, LDR_DATA_TABLE_ENTRY64, InInitializationOrderModuleList);if ( _wcsicmp((PWCHAR)ldrDataTable->BaseDllName.Buffer, L"kernel32.dll") == 0 ){// Found itldrDataTable->EntryPoint = (ULONG64)DllMainDummy;break;}pListEntry = (PLIST_ENTRY64)pListEntry->Flink;}
BOOL APIENTRY DllMainDummy( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
{WCHAR Name[MAX_PATH] = {0};GetModuleFileNameW(hModule, Name, MAX_PATH);switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:wprintf(L"DllMainDummy: Hooked DLL_PROCESS_ATTACH, %ws \r\n", Name);break;case DLL_PROCESS_DETACH:wprintf(L"DllMainDummy: Hooked DLL_PROCESS_DETACH, %ws \r\n", Name);FreeLibrary(hModule);break;}return TRUE;
}

此时,当进程退出时,就会卸载kernel32.dll,调用kernel32.dll中的DLL_PROCESS_DETACH分支,此时的kernel32.dll中EntryPoint已经被Hook掉了,就会触发我们的DllMainDummy方法。

这篇关于一种Reflective DLL注入后的DLL卸载处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846292

相关文章

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是