深入理解反射式dll注入技术

2023-11-12

 

前言

dll 注入技术是让某个进程主动加载指定的 dll 的技术。恶意软件为了提高隐蔽性,通常会使用 dll 注入技术将自身的恶意代码以 dll 的形式注入高可信进程。

常规的 dll 注入技术使用 LoadLibraryA() 函数来使被注入进程加载指定的 dll。常规dll注入的方式一个致命的缺陷是需要恶意的 dll 以文件的形式存储在受害者主机上。这样使得常规 dll 注入技术在受害者主机上留下痕迹较大,很容易被 edr 等安全产品检测到。为了弥补这个缺陷,stephen fewer 提出了反射式 dll 注入技术并在 github开源,反射式dll注入技术的优势在于可以使得恶意的dll通过 socket 等方式直接传输到目标进程内存并加载,期间无任何文件落地,安全产品的检测难度大大增加。

本文将从 dll 注入技术简介、msf migrate 模块剖析、检测思路和攻防对抗的思考等方向展开说明反射式 dll 注入技术。

dll注入技术简介

1 常规dll注入技术

常规 dll 注入有:

1)  通过调用 CreateRemoteThread()/NtCreateThread()/RtlCreateUserThread() 函数在被注入进程创建线程进行 dll 注入。

2)  通过调用 QueueUserAPC()/SetThreadContext() 函数来劫持被注入进程已存在的线程加载 dll。

3)  通过调用 SetWindowsHookEx() 函数来设置拦截事件,在发生对应的事件时,被注入进程执行拦截事件函数加载 dll。

以使用 CreateRemoteThread() 函数进行 dll 注入的方式为例,实现思路如下:

1)  获取被注入进程 PID。

2)  在注入进程的访问令牌中开启 SE_DEBUG_NAME 权限。

3)  使用 openOpenProcess() 函数获取被注入进程句柄。

4)  使用VirtualAllocEx()函数在被注入进程内开辟缓冲区并使用 WriteProcessMemory() 函数写入 DLL 路径的字符串。

5)  使用 GetProcAddress() 函数在当前进程加载的 kernel32.dll 找到 LoadLibraryA函数的地址。

6)  通过 CreateRemoteThread() 函数来调用 LoadLibraryA() 函数,在被注入进程新启动一个线程,使得被注入进程进程加载恶意的 DLL。

 

常规 dll 注入示意图如上图所示。该图直接从步骤3)开始,步骤1)和步骤2)不在赘述。

2 反射式dll注入技术

反射式 dll 注入与常规 dll 注入类似,而不同的地方在于反射式 dll 注入技术自己实现了一个 reflective loader() 函数来代替 LoadLibaryA() 函数去加载 dll,示意图如下图所示。蓝色的线表示与用常规dll注入相同的步骤,红框中的是 reflective loader() 函数行为,也是下面重点描述的地方。

Reflective loader 实现思路如下:

1)  获得被注入进程未解析的 dll 的基地址,即下图第7步所指的 dll。

2)  获得必要的 dll 句柄和函数为修复导入表做准备。

3)  分配一块新内存去取解析 dll,并把 pe 头复制到新内存中和将各节复制到新内存中。

4)  修复导入表和重定向表。

5)  执行 DllMain() 函数。

Msf migrate模块

msf 的 migrate 模块是 post 阶段的一个模块,其作用是将 meterpreter payload 从当前进程迁移到指定进程。

在获得 meterpreter session 后可以直接使用 migrate 命令迁移进程,其效果如下图所示:

migrate 的模块的实现和 stephen fewer 的 ReflectiveDLLInjection 项目大致相同,增加了一些细节,其实现原理如下:

1)  读取 metsrv.dll(metpreter payload模板dll)文件到内存中。

2)  生成最终的 payload。

  1. msf 生成一小段汇编 migrate stub 主要用于建立 socket 连接。

  2. 将 metsrv.dll 的 dos 头修改为一小段汇编 meterpreter_loader 主要用于调用reflective loader 函数和 dllmain 函数。在 metsrv.dll 的 config block 区填充meterpreter 建立 session 时的配置信息。

  3. 最后将 migrate stub 和修改后的 metsrv.dll 拼接在一起生成最终的 payload。

3)  向 msf server 发送 migrate 请求和 payload。

4)  msf 向迁移目标进程分配一块内存并写入 payload。

5)  msf 首先会创建的远程线程执行 migrate stub,如果失败了,就会尝试用 apc 注入的方式执行 migrate stub。migrate stub 会调用 meterpreter loader,meterpreter loader 才会调用 reflective loader。

6)  reflective loader 进行反射式 dll 注入。

7)  最后 msf client 和 msf server 建立一个新的 session。

原理图如下所示:

 

图中红色的线表示与常规反射式dll注入不同的地方。红色的填充表示修改内容,绿色的填充表示增加内容。migrate 模块的 reflective loader 是直接复用了 stephen fewer 的 ReflectiveDLLInjection 项目的 ReflectiveLoader.c 中的 Reflecti

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解反射式dll注入技术 的相关文章

  • HTTP 状态 404 - 请求的资源不可用

    在使用 MyEclipse IDE 中的 Tomcat 服务器和 Struts 2 框架时 我遇到了反复出现的问题 我将我的程序作为服务器应用程序运行 当它运行时 默认的index jsp 文件将成功打开 但应用程序的其他过去都不起作用 当
  • Spring控制器是线程安全的吗

    我遇到了这个控制器示例 想知道它是否是线程安全的 我特别想知道 gson 实例变量 import org springframework stereotype Controller import org springframework we
  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • Java:从元素创建 DOM 元素,而不是文档

    如您所知 在 Java 中创建 Dom 元素的正确方法是执行以下操作 import org w3c dom Document import org w3c dom Element Document d Element e e d creat
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • cucumber-junit-platform-engine 中的功能文件发现

    In cucumber junit我使用的库 CucumberOptions定义功能文件位置 package com mycompany cucumber import cucumber api CucumberOptions import
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序

随机推荐

  • 压缩感知及实验分析

    压缩感知及实验分析 摘要 压缩感知的主要内容有三个 信号x的稀疏表示 设计测量矩阵 在降维的同时 保证原始信号x的信息损失最小 设计信号恢复算法 利用降维后的观测值无失真地恢复原始信号x 根据压缩感知理论 基于Matlab平台 做了最简单的
  • MATLAB高光谱图像构建KNN图

    在高光谱图像的特征提取过程中 采用非线性降维的方式对高光谱图像降维的过程中 采用图自编码器来对数据进行降维 需要将利用高光谱图像的结构信息和内容信息 则需要将高光谱图像数据构造为一个图结构 图结构的构建需要通过KNN算法来构建邻接矩阵 文章
  • Figma 插件开发 - Vite 环境搭建

    最近工作主要和 Figma 插件打交道 梳理一些踩坑的经验 开始 官方的起始例子 www figma com plugin docs 按步骤将插件文件保存到本地即可 调试时可以右键唤起插件 可以关注下几个功能入口 Import plugin
  • 金盘系统无法连接服务器,Re:从零开始的服务器

    ipmitool H IP Address U UserID P Password sensor list all 列出系统中所有的传感器信息 CPU Temp na na 0 000 0 000 0 000 95 000 100 000
  • 清华jenkins rmp包下载地址

    清华jenkins rmp包下载地址 https mirrors tuna tsinghua edu cn jenkins
  • OpenCV实战(31)——基于级联Haar特征的目标检测

    OpenCV实战 31 基于级联Haar特征的目标检测 0 前言 1 Haar 特征图像表示 2 基于级联 Haar 特征的二分类分类器 3 级联分类器算法流程 4 使用 Haar 级联检测器进行人脸检测 5 完整代码 小结 系列链接 0
  • 可变类型 QVariant 储存各种类型

    1 可变类型 QVariant 2 QVariant储存基本类型 3 QVariant储存自定义复杂类型 存储setValue 和取出value lt 类型 gt 4 QVariant是否为空 include
  • STM32在线调试、看门狗、跑飞调试

    一 调试准备 1 STM32的调试模式 对于STM32的CPU 支持调试模式 即CPU可以被暂停 用户可以在CPU暂停后查看寄存器或变量的状态 2 在线调试工具 由于版权问题 JLink调试工具渐渐淡出 现在大部分使用ST Link 它与J
  • 【创业那些事】创始人必懂的股权分期成熟兑现机制

    转自 https zhuanlan zhihu com p 35250540 创业那些事 创始人必懂的股权分期成熟兑现机制 在公司经营期间 为了保证公司创始人的稳定 创始人股权分期成熟兑现 是将公司发展与创始人利益绑定的有效手段 同时为了应
  • html中怎么让图片做背景透明背景图片,透明背景图片怎么做?

    透明背景图片怎么做 手机端APP 傲软抠图是一款专业的图片换背景软件 适用于Windows 安卓以及iOS系统 它提供人像识别 物品识别 以及图章 logo识别 这款App采用智能识别技术 随着识别的图片增多 抠图技术越来越精细 如何制作透
  • mysql查看数据库表最后修改时间

    参考 sql How can I tell when a MySQL table was last updated Stack Overflowhttps stackoverflow com questions 307438 how can
  • 讨伐Zookeeper

    本文是学习Zookeeper时做的知识点整理 1 理论篇 1 1 Zookeeper是什么 标准回答 Zookeeper是一个分布式服务框架 是Apache Hadoop的一个子项目 它主要用来解决分布式应用中经常遇到的一些数据管理问题 如
  • windows 上c\c++ 字符处理,wchar,char 那些事

    include
  • 最好的编程语言?美国出数据了,Java吃香,objc有“钱”途

    编码江湖 长期以来就不存在什么武林盟主 相反的 各类编程语言则在自己擅长的领域独领风骚 谁要敢挑头立盟主 就会死于满天的口水之中 如今一组来自美国的数据 却再次引起了 世界上最好编程语言 之争 最好的编程语言 美国出数据了 Java吃香 o
  • postman 发送Map请求参数的post 请求

    在地址栏里输入请求url http 192 168 1 74 9090 api orginfo find 选择 POST 方式 在 headers 添加key Content Type value application x www for
  • Protues闪退解决办法

    目录 1 找到安装时的文件保存路径 图中红框所示 2 在软件安装包下复制红框中的两个文件夹 3 将两个文件夹粘贴到软件安装路径下 粘贴方式选择替换 Proteus8 7软件在运行过程中会出现突然闪退的现象 下面给出闪退解决办法 1 找到安装
  • yolo5安装配置及其目标检测

    目录 一 yolo5的下载 1 1 环境配置 1 2 下载git 1 3 下载yolo5源码 二 yolo5的安装 三 图片检测 3 1 准备工作 3 2 执行操作 3 3 结果显示 四 视频检测 4 1 准备工作 4 2 执行操作 4 3
  • AVAudioPlayer播放在线音频文件

    AVAudioPlayer播放在线音频文件 一 原里 AVAudioPlayer是不支持播放在线音频的 但是AVAudioPlayer有一个 initWithData的方法 我们可以把在线音频转换为NSdata 然后播放 二 如代码 NSD
  • kong或nginx配置前端请求跨域

    我们目前使用的是kong作为一个总的api网关 而今天出了一个问题 kong的设置默认是不支持前端跨域的 而前后端分离的项目大量的使用了跨域 前端报错 response to preflight request doesn t pass a
  • 深入理解反射式dll注入技术

    前言 dll 注入技术是让某个进程主动加载指定的 dll 的技术 恶意软件为了提高隐蔽性 通常会使用 dll 注入技术将自身的恶意代码以 dll 的形式注入高可信进程 常规的 dll 注入技术使用 LoadLibraryA 函数来使被注入进