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

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

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

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

​​

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

▶ 初始立足点

▶ 权限提升

▶ 横向移动

▶ 报告/分析

▶ 教训/修复

目录

1.防病毒软件规避

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

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

1.主要技术:内存注入(PE注入)

2.技术方法概览

[1.2.2.1 远程进程内存注入](#1.2.2.1 远程进程内存注入)

1.核心技术流程

2.远程内存注入的形象解析

3.一些重要概念的解释

[①什么是Windows API?](#①什么是Windows API?)

②什么是句柄(HANDLE)?

[欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论](#欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论)


1.防病毒软件规避

1.2 绕过杀毒软件检测技术

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

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

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


1.2.2 内存中的逃避技术

内存注入也被称为PE注入。内存逃避技术是现代恶意软件对抗杀毒软件(AV)的高级手段 。其核心在于:完全避开磁盘,直接在易失性内存中执行恶意操作,从而绕过以文件扫描为核心的传统AV防御体系。

⚡ 核心优势:无文件化

特性 说明 关键点
🚫 不接触磁盘 恶意代码不写入或修改磁盘文件。 直击传统AV的盲区,因其主要监控磁盘文件活动。
🎯 操作在内存中 所有注入、解密、执行均在进程内存空间内完成。 隐蔽性极强,只留下短暂的内存痕迹。
🛡️ 难以静态检测 没有可供扫描的静态恶意文件实体。 迫使AV依赖更高级的行为监控与内存扫描。
1.主要技术:内存注入(PE注入)
  • 流程简述 :将恶意负载(如一个PE文件)完整写入 到另一个进程(如explorer.exe)的内存中,并操控其执行流程去运行这段注入的代码。

  • 常用载体PowerShell 因其强大的系统访问能力和在内存中执行代码的特性,成为实施此类攻击的热门工具

2.技术方法概览

除详细的PowerShell注入外,其他内存逃避技术还包括(因需C/C++等底层知识,此处仅简述):

  • 进程空心化(Process Hollowing)

  • 动态链接库注入(DLL Injection)

  • 线程执行劫持(Thread Execution Hijacking)

补充:进程和线程的对比:


1.2.2.1 远程进程内存注入

远程进程内存注入是一种将恶意代码植入到合法进程内存空间 的高级技术。通过利用++Windows系统API++ ,攻击者能够在不接触磁盘 的情况下,在另一个进程的"庇护"下执行恶意操作,从而有效绕过传统杀毒软件的检测。

1.核心技术流程

📋 关键Windows API函数

步骤 API函数 作用 权限要求
① 获取目标进程句柄 OpenProcess 打开目标进程,获取进程操作句柄(HANDLE) 需足够权限来访问目标进程PROCESS_ALL_ACCESS或类似高权限
② 分配内存 VirtualAllocEx 在目标进程虚拟空间中分配新内存区域 内存读写权限
③ 写入负载 WriteProcessMemory 将恶意代码写入已分配的内存区域 内存写入权限
④ 执行代码 CreateRemoteThread 在目标进程中创建线程执行注入的代码 线程创建权限

尽管上述技术涉及复杂的Windows API编程,但PowerShell等脚本语言 提供了简化实现的方法。通过利用.NET框架和内置cmdlet,攻击者可以用更少的代码完成类似功能,这也是为什么PowerShell成为红队操作中内存注入的首选工具之一

2.远程内存注入的形象解析

下面将通过一个大楼与房间的比喻,生动解析远程进程内存注入的四个核心步骤:

📋 技术步骤与比喻对照表

技术步骤 大楼比喻 对应的Windows API 关键行为
① 获取进程句柄 获得房间钥匙 用特殊手段取得进入特定房间(进程)的高权限钥匙。 OpenProcess 以足够权限 (如PROCESS_ALL_ACCESS)打开目标进程。
② 分配远程内存 在房间内扩建空间 在房间里合法"租赁"一块新区域,用来存放外来设备。 VirtualAllocEx 在目标进程的虚拟地址空间中分配可读/写/执行的内存区域。
③ 写入恶意负载 将恶意设备搬入扩建区 偷偷将组装好的恶意计算机(代码)搬入刚建好的空间。 WriteProcessMemory 将恶意代码(payload)写入到已分配的内存中。
④ 创建远程线程 启动设备并让其自动运行 按下恶意计算机的"开机键",使其在房间内独立运行。 CreateRemoteThread 在目标进程内创建新线程,指向并执行注入的代码。

🔍 检测与防御视角

  • 异常钥匙申请 :监控异常高权限的 OpenProcess 调用。

  • 可疑空间扩建 :检测进程内非常规的内存分配请求

  • 陌生设备搬入 :发现进程向非自身镜像的内存区域写入代码

  • 多出的工作人员 :警惕进程中出现来源不明的新线程


3.一些重要概念的解释
①什么是Windows API?

Windows API是微软为开发者提供的标准编程接口集合 ,它不是单个函数,而是由数千个函数、数据结构、常量和消息组成的完整工具箱 。通过这个接口,程序可以与Windows操作系统进行深度交互,实现从文件操作到窗口管理的各种功能。比喻,它像是操作系统的"服务总台"。

🏗️ Windows API核心组成部分

组件类型 作用 实用示例
📞 函数 执行具体操作的核心工具 CreateFile(创建文件)、OpenProcess(打开进程)
🏛️ 数据结构 组织信息的标准化格式 RECT(定义矩形区域)、WNDCLASS(窗口类配置)
🔢 常量 预定义的固定值,用于参数配置 MB_OK(确定按钮)、WM_KEYDOWN(键盘按下消息)
📨 消息 系统与应用程序间的通信机制 WM_PAINT(重绘窗口)、WM_CLOSE(关闭窗口)

🔄 工作原理

Windows API通过动态链接库(DLL) 实现,主要分布在:

  • kernel32.dll:核心系统服务(进程、内存、文件)

  • user32.dll:用户界面功能(窗口、消息)

  • gdi32.dll:图形绘制功能

开发者调用这些DLL中的函数,系统内核执行实际操作并将结果返回,比如窗口管理、文件操作、网络通信等。

DLL 文件与可执行文件(EXE)类似,但不能独立运行,必须由其他程序调用。它的主要作用是将常用的函数或资源封装起来,供多个应用程序共享,从而实现代码复用、模块化开发内存优化

🍽️ 生动比喻:Windows API就像"高级餐厅的服务体系"

想象你在一家豪华餐厅(Windows操作系统) 用餐:

餐厅组件 对应Windows API概念 说明
📋 标准化菜单 函数库 提供可点的菜品(功能),如"牛排套餐"=CreateFile
🛎️ 服务员 API调用 你(程序)通过服务员点餐,无需自己进厨房
🥘 厨房后台 操作系统内核 实际完成烹饪(操作)的神秘区域,顾客无法进入
📝 订单表格 数据结构 标准化的点餐单,确保信息准确传递
🚨 传菜铃 消息机制 厨房通知服务员上菜的信号,类似系统消息
✨ 菜品标准 常量定义 如"七分熟"=MB_OK,确保理解一致

这种设计让开发者无需了解操作系统内部复杂原理,只需通过标准化的"点餐流程"(API调用),就能获得所需服务,大大降低了编程难度。


②什么是句柄 (HANDLE)

句柄:操作系统分配给资源的++唯一标识符++ ,相当于一个资源访问凭证 。它不是直接指向资源本身的指针,而是由**++操作系统内部++管理** 的++抽象引用++ ,程序通过这个"凭证"来安全地操作各种系统资源,像是操作系统的"资源钥匙"。

🤔 为什么需要句柄?

原因 说明
🛡️ 安全性 避免应用程序直接操作敏感资源,防止系统崩溃或数据损坏
🔒 抽象化 隐藏资源内部复杂实现细节,简化编程接口
🎮 统一管理 操作系统可以统一跟踪、管理和回收所有分配的资源

✨ 句柄的核心特点

  • 🎫 抽象标识 :通常表现为无符号整数,不直接暴露资源内部结构

  • 🏛️ 系统管理 :由操作系统统一分配、跟踪和释放

  • 🚫 间接访问 :只能通过专用API函数操作,无法直接读写资源内容

📚 常见句柄类型

句柄类型 对应资源 典型API
📄 文件句柄 打开的文件 CreateFileReadFile
🪟 窗口句柄 应用程序窗口 CreateWindowShowWindow
🧠 内存句柄 分配的内存块 VirtualAllocHeapAlloc
🖨️ 设备句柄 硬件设备 CreateDC(设备上下文)
🔗 进程句柄 运行中的进程 OpenProcessCreateProcess

📝 实战示例:文件句柄的创建与使用

🔧 CreateFile 函数原型:

使用CreateFile函数打开文件并返回一个文件句柄。hFile就是文件句柄。

cs 复制代码
HANDLE hFile = CreateFile(
    "example.txt",          // 📍 文件名
    GENERIC_READ,           // 🔓 访问权限:只读
    0,                      // 👥 共享模式:独占访问
    NULL,                   // 🛡️ 安全属性:默认
    OPEN_EXISTING,          // 🚪 打开方式:仅打开已存在文件
    0,                      // 🏷️ 文件属性:普通文件
    NULL                    // 📋 模板文件:无
);
参数 常用值 含义 比喻
访问权限 GENERIC_READ 只读访问 🔓 获得"阅读许可证"
GENERIC_WRITE 写入权限 ✍️ 获得"修改许可证"
共享模式 0 独占访问 👑 包场,其他人不得进入
FILE_SHARE_READ 共享读取 👥 允许其他人一起阅读
打开方式 OPEN_EXISTING 仅打开存在的文件 🚪 只进已有的门
CREATE_NEW 创建新文件 🆕 开一扇全新的门

✅ 返回值解析

CreateFile函数返回值直接体现如下。它返回一个文件句柄(HANDLE)用于后续对该文件的操作,如读取、写入、关闭等。

cs 复制代码
HANDLE hFile = CreateFile(...);  // ← 返回值赋给hFile变量
  • 📬 成功 :返回有效的句柄值 (如 0x000007F4

  • 🚫 失败 :返回 INVALID_HANDLE_VALUE-10xFFFFFFFF

⚠️ 重要注意事项

  1. 🧹 及时关闭 :使用 CloseHandle() 及时释放句柄,避免资源泄漏

  2. 🔍 错误检查 :每次API调用后检查返回值,使用 GetLastError() 诊断问题

  3. 🎭 作用域管理:确保句柄在有效作用域内使用,避免悬空引用

🔄 完整的生命周期示例

cs 复制代码
// 📝 1. 创建/打开文件并接收返回值
HANDLE hFile = CreateFile(
    "test.txt",              // 文件名
    GENERIC_READ,            // 访问模式
    FILE_SHARE_READ,         // 共享模式
    NULL,                    // 安全属性
    OPEN_EXISTING,           // 创建方式
    FILE_ATTRIBUTE_NORMAL,   // 文件属性
    NULL                     // 模板文件句柄
);

// ✅ 2. 验证返回值(体现成败)
if (hFile == INVALID_HANDLE_VALUE) {
    // ❌ 失败:返回值无效
    DWORD error = GetLastError();
    printf("打开文件失败,错误码:%lu\n", error);
    return;
}

// 🎯 3. 使用返回值(体现为句柄)
// hFile现在代表"test.txt"文件
char buffer[100];
DWORD bytesRead;
BOOL success = ReadFile(
    hFile,      // ← 使用CreateFile返回的句柄
    buffer,
    sizeof(buffer),
    &bytesRead,
    NULL
);

// 🚪 4. 释放资源(使用句柄关闭)
CloseHandle(hFile);  // ← 需要传入句柄作为参数

重要解释:

·返回值:即文件句柄hFile

CreateFile函数返回HANDLE类型的值hFile,即文件句柄 。文件句柄是操作系统用于标识该文件的一个标识符。此文件句柄将用于后续的文件操作,如读取文件、写入文件、关闭文件等。
有效句柄: 0x00000002 或 0x000007F4 等。
**无效句柄(失败的情况):**INVALID_HANDLE_VALUE,其值通常为 -1 或 0xFFFFFFFF。

·文件句柄的使用

一旦获得了有效的文件句柄(如 0x00000002),可以在后续的API调用中使用它,直到不再需要它时才关闭。典型的文件操作包括读取(ReadFile)、写入 (WriteFile)、移动文件指针(SetFilePointer)、获取文件信息 (GetFileInformationByHandle) 等。在操作完成后,记得使用CloseHandle 关闭文件句柄,以释放资源。

🏷️ 生动比喻:句柄就像"酒店房卡"

想象操作系统是一家豪华酒店🏨

概念 酒店比喻 说明
系统资源 酒店的各个房间、餐厅、健身房等设施 操作系统管理的实体
句柄 房卡🔑 不是房间本身,而是访问房间的凭证
CreateFile 前台办理入住 获得指定房间(文件)的房卡(句柄)
API函数 酒店服务电话☎️ 通过标准接口请求服务,不直接操作设施
CloseHandle 退房交还房卡 释放资源,让房间可被重新使用
无效句柄 无效房卡/已注销房卡 无法打开任何房门

关键优势:酒店(操作系统)通过房卡系统,既让你方便使用设施,又保护了房间内部(资源实现细节)的隐私和安全。


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

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

相关推荐
若尘啊若辰12 小时前
安全通用要求之六安全管理制度
安全·网络安全·等保·等级保护·安全通用要求
介一安全14 小时前
【Frida Android】实战篇17:Frida检测与绕过——基于inline hook的攻防实战
android·网络安全·逆向·安全性测试·frida
小韩博19 小时前
小迪第42课:PHP应用&MYSQL架构&SQL注入&跨库查询&文件读写&权限操作
sql·mysql·网络安全·架构·php
网安INF1 天前
SSL/TLS体系结构
网络·网络协议·网络安全·ssl
小快说网安1 天前
等保测评技术检测要点:网络与数据安全核心指标实操指南
网络·网络安全·等保测评
玥轩_5211 天前
防火墙技术-综合应用实验
运维·网络·网络协议·网络安全·智能路由器·路由器·防火墙
Ancelin安心1 天前
关于代理的一些网络知识复盘
linux·运维·网络·计算机网络·web安全·ubuntu·网络安全
重生之我在番茄自学网安拯救世界1 天前
网络安全中级阶段学习笔记(十一):服务器解析漏洞全解析(原理、利用与防御)
运维·服务器·web安全·网络安全·渗透测试·服务器解析漏洞
世界尽头与你1 天前
CVE-2021-40438_ Apache HTTP Server mod_proxy 模块 SSRF漏洞
安全·网络安全·渗透测试·apache