❾⁄₅ ⟦ OSCP ⬖ 研记 ⟧ 防病毒软件规避 ➱ 内存中的逃避技术(中)

**郑重声明:**本文所涉安全技术仅限用于合法研究与学习目的,严禁任何形式的非法利用。因不当使用所导致的一切法律与经济责任,本人概不负责。任何形式的转载均须明确标注原文出处,且不得用于商业目的。

🔋 点赞 | 能量注入 ❤️ 关注 | 信号锁定 🔔 收藏 | 数据归档 ⭐️ 评论| 保持连接💬

🌌 立即前往 👉晖度丨安全视界🚀

​​

▶ 信息收集
▶ 漏洞检测 ➢ 防病毒软件概述 ➢ 内存中的逃避技术🔥🔥🔥

▶ 初始立足点

▶ 权限提升

▶ 横向移动

▶ 报告/分析

▶ 教训/修复

目录

1.防病毒软件规避

[1.2 绕过杀毒软件检测技术](#1.2 绕过杀毒软件检测技术)

[1.2.2 内存中的逃避技术](#1.2.2 内存中的逃避技术)

[1.2.2.2 反射式DLL注入技术](#1.2.2.2 反射式DLL注入技术)

[1.常规DLL注入 vs 反射式DLL注入](#1.常规DLL注入 vs 反射式DLL注入)

2.反射式DLL注入完整流程

3.反射式DLL注入的挑战

4.攻击者关键做法

5.LoadLibrary介绍


1.防病毒软件规避

1.2 绕过杀毒软件检测技术

现代恶意软件为逃避防病毒软件的检测,通常采用两类主要技术:

①磁盘上的逃避: 侧重于修改物理存储在磁盘上的恶意文件,以逃避检测;
②内存中的逃避: 由于现代防病毒软件的文件扫描引擎日趋成熟,更多恶意软件转向完全避免落地磁盘直接在内存中执行恶意操作,从而大幅降低被检测概率。

💡 关键点:内存逃避技术属于"无文件攻击"范畴,恶意代码常通过合法进程注入、脚本加载等方式在内存中运行,不留下传统文件痕迹。


前文介绍了第一种内存逃避技术-----远程进程内存注入,本文接前文介绍反射式DLL注入技术

1.2.2 内存中的逃避技术

1.2.2.2 反射式DLL注入技术
1.常规DLL注入 vs 反射式DLL注入
对比维度 常规DLL注入 反射式DLL注入
加载源头 磁盘文件 (.dll)加载到目标进程的内存 内存的某个位置 (二进制流)加载.dll
依赖机制 操作系统API (LoadLibrary/LoadLibraryEx) 自定义加载器 (手动实现加载逻辑)
必经路径 标准模块加载流程 绕过标准加载流程
磁盘痕迹 必然存在 (恶意DLL需物理存储) 可以做到完全无文件
关键动作 调用API,由系统完成后续所有加载步骤 在目标进程内存中"手动组装"DLL并初始化
隐蔽性 较低 (API调用易被监控,文件易被扫描) 极高 (无文件、无标准API调用)
技术本质 利用系统提供的合法功能 模拟 系统功能,并绕过其限制

🎯 核心差异一句话

常规注入是 "请求系统帮忙加载一个文件" ;反射式注入是 "在内存中亲手组装并启动一个DLL"

🍽️ 形象比喻:

①常规DLL注入 → "外卖点餐"

你(攻击者)想让目标吃特定的食物(恶意DLL)。

  • 食物存在哪里? → 在饭店的厨房里(磁盘上的DLL文件)。

  • 如何送达? → 你通过外卖平台LoadLibrary API)下单。

  • 发生了什么? → 平台接到订单,派骑手去饭店取餐,然后配送到目标地址(目标进程)。整个过程公开、可追踪。(因此,被可以防御系统发现。)

  • 特点依赖饭店和平台留下订单记录 (日志),食物有实体包装(磁盘文件)。

②反射式DLL注入 → "进入私厨"

你同样想让目标吃特定的食物(恶意DLL)。

  • 食物存在哪里? → 在你脑海中的菜谱 (网络或内存中的二进制数据流)。

  • 如何送达? → 你亲自潜入 目标家中(注入代码到目标进程),凭借记忆 (自定义加载器)当场将食材变出并烹饪好。

  • 发生了什么? → 食物自行烹饪后出现在目标的餐桌上。没有外卖订单,没有饭店记录,没有包装袋。

  • 特点不依赖外部平台 (绕过API),无实体痕迹(无文件),过程如同魔法。

2.反射式DLL注入完整流程

1️⃣ 获取目标进程句柄

  • 使用 OpenProcess 函数 获取目标进程的操作权限

  • 🔑 关键:需要足够的权限(如 PROCESS_ALL_ACCESS

2️⃣ 分配内存空间

  • 使用**VirtualAllocEx 函数**在目标进程中分配内存空间

  • 🎯 用途:存储++DLL的二进制内容++ 或++加载器代码++

3️⃣ 写入DLL内容

  • 使用**WriteProcessMemory函数**将数据写入目标进程

  • 两种方式

    • 路径注入(写入DLL路径)

    • 代码注入 (直接写入DLL二进制数据)→ 反射式注入采用此方式

4️⃣ 手动加载DLL(核心步骤)

复制代码
标准流程被绕过 → 自定义加载器接管
  • 加载器代码 :将DLL的加载代码(反射加载代码)作为一个小型加载器嵌入目标进程中。该加载器不依赖于Windows API(模拟Windows加载器功能),而是通过编写自定义的加载代码将DLL的内容加载到目标进程的内存空间。

  • 手动调用DllMain :加载器代码将DLL内容加载到内存后,手动触发DLL的入口函数DllMain,并传入适当的参数。

5️⃣ 执行DLL代码

  • DLL的入口**函数 DllMain**被执行

  • 🚀 恶意DLL功能在目标进程内生效

6️⃣ 清理资源

  • 使用**VirtualFreeEx函数**释放分配的内存

  • 🧹 消除注入痕迹,提高隐蔽性

3.反射式DLL注入的挑战
挑战 说明 攻击者解决方案
API限制 Windows的标准API(如LoadLibrary)只能从++磁盘加载DLL文件++ ,而不直接支持++从内存加载DLL++。因此,攻击者不能直接使用这些标准API来进行反射式DLL注入。 编写自定义加载器
无公开API Windows未提供现成的API来直接从内存中加载DLL。攻击者要绕过这些限制,需自己编写代码来模拟和实现加载DLL的过程。 逆向工程系统加载机制
PE结构复杂 DLL需要正确解析和重定位 手动实现PE加载逻辑
4.攻击者关键做法
  • 🚫 绕过标准API :不依赖 LoadLibrary,避免触发监控

  • 💾 全内存操作:DLL不落地,减少被AV/EDR检测机会

  • 🔧 自实现加载器:包含以下功能:

    • 内存分配与权限设置

    • PE头部解析与节区映射

    • 导入表解析与函数地址解析

    • 重定位处理

    • TLS回调执行(如存在)

    • DllMain调用

5.LoadLibrary介绍

Windows操作系统的标准模块加载器 ,用于将++磁盘上的DLL文件++动态加载到进程内存中。

🔧 核心功能

  • 加载动态链接库:LoadLibrary可以加载指定路径的DLL文件,之后就可以使用该DLL中定义的函数、数据或其他资源。
  • 返回模块句柄:成功加载DLL后,LoadLibrary会返回一个模块句柄(HMODULE),这个句柄代表着已加载的DLL。可以用它来访问DLL中的函数、资源等。
  • 调用DLL中的函数:加载DLL后,可以使用GetProcAddress来获取DLL中函数的地址,然后通过这个地址调用DLL中的特定函数。
功能 说明
📂 文件加载 从硬盘读取DLL文件到内存
🔗 地址映射 建立DLL与进程地址空间的关联
🆔 句柄返回 返回模块句柄(HMODULE)作为访问标识
🔍 函数定位 为后续GetProcAddress调用提供基础

📝 函数原型详解

cs 复制代码
HMODULE LoadLibrary(
     LPCTSTR lpFileName
  );
  • 参数 : lpFileName - DLL文件路径

    • 这个路径可以是:相对路径、绝对路径或系统目录中的文件名
  • 返回值:

    • ✅ 成功 → HMODULE (模块句柄)

    • ❌ 失败 → NULL (需用GetLastError()获取错误码)

🔄 典型使用流程

优势特点

  • 标准化: Windows官方API,稳定可靠

  • 自动化: 自动处理DLL初始化(调用DllMain)

  • 集成化: 自动解析依赖、处理重定位等复杂工作

  • 兼容性: 支持不同路径格式和系统目录查找

⚠️ 限制与注意

  • 📍 仅限磁盘文件 : 只能从文件系统加载,不支持纯内存加载

  • 📝 路径要求: 路径错误或文件不存在会导致失败

  • 🛡️ 安全限制: 受UAC、权限控制等安全机制约束

  • 🔍 可监控: 安全软件可轻松监控此API调用

🆚 LoadLibrary vs 手动加载

对比项 LoadLibrary 反射式手动加载
来源 必须来自磁盘文件 可来自内存数据
复杂度 简单调用即可 需实现完整加载逻辑
隐蔽性 低(易被监控) 高(绕过标准API)
依赖 完全依赖系统机制 独立实现,不依赖系统API

🛠️ 实用示例

cs 复制代码
// 基本使用模式
HMODULE hModule = LoadLibrary("MyLibrary.dll");
if (hModule != NULL) {
    // 获取函数地址
    MyFuncType myFunc = (MyFuncType)GetProcAddress(hModule, "MyFunction");
    if (myFunc != NULL) {
        // 调用函数
        myFunc();
    }
    // 使用完毕后可卸载
    FreeLibrary(hModule);
} else {
    DWORD error = GetLastError();
    printf("加载失败,错误码: %d\n", error);
}

🔍 安全视角

  • 红队用途: 常用于常规DLL注入,但易被检测

  • 蓝队监控: 关键监控点,异常LoadLibrary调用可能是攻击迹象

  • 绕过技巧: 高级攻击者会避免使用LoadLibrary,改用反射式注入

💎 一句话总结

LoadLibrary是Windows系统提供的"官方搬运工",只能从磁盘搬货(DLL)到内存,全程可监控、有记录。


欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论

每一份支持,都是我持续输出的光。

相关推荐
Pith_4 小时前
React2Shell漏洞复现(CVE-2025-55182)
react.js·网络安全
白帽黑客-晨哥4 小时前
2026网络安全学习攻略:从入门到专家之路
web安全·网络安全·零基础·渗透测试·湖南省网安基地
网安INF5 小时前
电子邮件的系统架构和核心协议详解
网络·网络协议·安全·网络安全·密码学·电子邮件
执念WRD10 小时前
JWT介绍
web安全·网络安全
网安INF10 小时前
电子邮件安全协议详解
网络·网络协议·安全·网络安全
Hi, how are you10 小时前
GyAn数字资产守护系统
python·安全·http·网络安全·信息与通信
半路_出家ren11 小时前
Python操作MySQL(详细版)
运维·开发语言·数据库·python·mysql·网络安全·wireshark
网安INF1 天前
SSL/TLS密钥派生机制与安全攻防体系深度解析
网络·安全·网络安全·密码学·ssl
一岁天才饺子1 天前
Redis漏洞复现
redis·web安全·网络安全