# 杀毒软件与EDR原理

### **背景**  


如今，渗透测试人员和红队操作员在红队行动中面临着重大挑战，因为杀毒软件和 EDR (终端检测与响应) 等安全产品会阻止许多载荷与工具的执行。在本章节中，我们将讨论攻击者用来规避检测的一些技术。

### **恶意软件检测**

杀毒软件采用多种技术组合来检测恶意软件，这些技术包括**静态分析**、**动态分析**、**基于特征的检测**、**启发式分析**、**行为分析**以及**机器学习等**。而 EDR 则更加复杂，维度更多。

#### **杀毒软件**

##### **静态分析**

静态分析是在不实际运行代码的情况下分析恶意软件二进制代码的过程。它涉及文件指纹 (例如哈希)、字节序列模式、逆向工程、加壳检测等。

##### **动态分析**

动态分析涉及在严密监控的虚拟环境中执行程序。它使用基于程序行为的方法进行恶意软件检测，涉及对 API 调用、对注册表更改、文件读写操作、网络连接与流量的监控、对内存操作的检视等方法。

##### **基于特征的检测**

基于特征的检测依赖于识别恶意软件代码中的已知模式或特征。杀毒软件使用已知恶意软件特征的数据库来扫描文件并将其与这些模式进行比较。如果找到匹配项，该文件将被标记为恶意文件。基于签名的检测可有效对抗已知的恶意软件，但难以识别新的或未知的威胁。

##### **启发式分析**

启发式分析检查文件的特征和结构，以确定它们是否表现出通常与恶意软件相关的特征。该技术不依赖于已知的特征，因此可以检测之前未知或修改过的恶意软件。然而，启发式分析有时会导致误报，将良性文件标记为恶意文件，因为它们与恶意软件相似。

##### **行为分析**

行为分析侧重于监视文件或程序执行时的操作和活动，而不是检查文件本身。此方法可以识别恶意行为，例如**对敏感数据的未授权访问**、与已知恶意服务器的通信，或尝试禁用安全产品。行为分析可以更有效地检测以前未知的恶意软件，但在威胁已经在系统上处于活动状态之前，它可能无法识别威胁。

##### **机器学习**

机器学习涉及使用算法来分析大量数据并识别可能表明恶意软件存在的模式或趋势。通过训练机器学习模型来识别已知恶意软件的特征并适应新威胁的出现。这种方法可以提高检测率并减少误报，但它仍然可能难以应对全新或独特的威胁。

#### **EDR**

EDR 有多个部分组成：Agent、遥测、传感器。

Agent，顾名思义，是安装在终端上的应用，它控制和使用来自传感器组件的数据，执行一些基本分析以确定给定的活动或一系列事件是否与攻击者行为一致，并将遥测数据转发到主服务器，主服务器进一步分析来自所有部署在一个环境中的 Agent 的事件。如果 Agent 认为某些活动或操作可疑，它可能会以发送到 SIEM 的警报的形式记录该恶意活动，或阻止恶意操作的执行，或返回无效值来欺骗攻击者。

传感器负责收集遥测数据，而遥测指的是 Agent 或者系统产生的原数据，例如进程的创建、文件的读写、对 URL 的访问等。这些数据可被防御者用于分析行为恶意与否。该 Github 仓库([https://github.com/tsale/EDR-Telemetry](https://github.com/tsale/EDR-Telemetry)) 罗列了一些常见 EDR 所收集的遥测数据：

[![image.png](https://raven-medicine.com/uploads/images/gallery/2024-03/scaled-1680-/uJjnLeRYPFOScHqV-image.png)](https://raven-medicine.com/uploads/images/gallery/2024-03/uJjnLeRYPFOScHqV-image.png)

EDR 相比杀毒软件，有着更加全面的检测，也更加棘手。在上述所讨论过的检测方式之外，EDR 有着更先进的检测，其中一些如下：

##### **API 调用检测**

一些在恶意软件中常用的 API 所对应的 NTAPI (例如 NtAllocateVirtualMemory)会被 EDR 通过用户态 Hooking 的方式劫持运行流程，从而实现对参数以及调用目的的检视，我们会在稍后讲解其原理与绕过。

##### **内核回调**

Windows 驱动程序能够在内核中注册回调例程，当特定事件发生时，例如进程的创建、映像文件的加载，会触发这些例程。例如，当一个新的进程创建后，注册了 PsSetCreateProcessNotifyRoutineEx 的所有驱动都会收到通知，从而采取对应行动，例如阻止该进程的创建，或者注入 EDR 的 DLL 从而实现 API 调用检测。

```c
NTSTATUS PsSetCreateProcessNotifyRoutineEx(
  [in] PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine,
  [in] BOOLEAN                           Remove
);
```

##### **ETW 事件**

Windows 事件跟踪 (ETW) 日志记录工具让开发人员够跟踪代码的执行、监视或调试潜在的问题。在网络安全的上下文中，ETW 提供了 Agent 无法直接获得的有价值的遥测。例如，加载到每个 .NET 进程中的 CLR 时使用 ETW 发出特定的事件，与其他机制相比，该事件可以更深入地了解主机上执行的托管代码的性质，这允许 EDR 代理收集新数据，从中创建新警报或丰富现有事件。

##### **过滤器驱动**

过滤器驱动可以实现对特定类型活动的检测与采取行动，例如与文件的交互、网络的交互等。现实一点的例子有，阻止对 lsass 进程的转储，EDR 可能会立即删除 LSASS 转储。还可以用于检测与阻止对其他主机的横向移动。

EDR 的绕过是一个有争议的话题，何为绕过？行为没有被立即阻止？没有产生警报？没有生成遥测？