基于CLR内存复用的C#隐蔽执行技术研究——动态调用与系统调用实现
字数 1953 2025-09-23 19:27:38

基于CLR内存复用的C#隐蔽执行技术教学文档

1. 技术概述

本技术研究旨在通过C#实现隐蔽的非托管代码执行,核心目标是规避安全产品的检测机制(如API Hooking、IAT检测等)。主要包含两大技术方向:

  1. 动态调用(DInvoke) - 运行时手动加载DLL并通过函数指针调用函数
  2. 系统调用(Syscall) - 直接进行系统调用,避免用户层API调用

两项技术均基于CLR内存复用机制实现隐蔽性。

2. 核心概念区分

2.1 非托管代码 vs 托管代码

  • 非托管代码:直接在处理器运行的机器码,无需中间翻译
  • 托管代码:运行于CLR环境,需要将MSIL中间语言翻译为机器码

2.2 .NET程序编译与执行流程

阶段 输入 输出 核心组件
编译时 C#/VB等高级语言代码 Microsoft中间语言(MSIL) 对应语言编译器
运行时 MSIL 机器码(原生代码) JIT编译器
执行阶段 机器码 操作系统服务调用 CLR

3. JIT编译器与内存特征

3.1 JIT编译逻辑

  • 仅在代码首次调用时将MSIL编译为机器码
  • 编译结果存储于JIT Code Heap(RWX权限内存区域)
  • 后续调用直接执行机器码,避免重复编译

3.2 内存关键发现

  • CLR分配的Private属性RWX内存中包含大量0字节空闲区域(代码洞穴)
  • 这些区域可复用为临时代码存储区,无需额外内存分配
  • 可能因CFG保护和硬件强制堆栈保护(如Intel CET或AMD Shadow Stack)导致Guard Page

4. 动态调用(DInvoke)技术

4.1 实现原理

  1. 运行时加载DLL(不产生静态导入记录)
  2. 借助函数指针定位非托管函数
  3. 通过.NET的Delegate API包装函数指针实现动态调用

4.2 优势场景

  • 手动映射PE模块
  • 执行系统调用
  • 避免可疑导入
  • 规避API挂钩(API Hooking)
  • 规避IAT中可疑导入的检测

5. CLR内存复用技术

5.1 技术实现

  1. 枚举内存区域寻找RWX权限区域
  2. 定位连续的零字节序列(代码洞穴)
  3. 通过直接操作内存指针byte* array = (byte*)addr绕过.NET内存安全检查
  4. 实现对代码洞穴的"写入/擦除"操作

5.2 关键技术点

  • 复用CLR分配的RWX内存区域存储并执行汇编代码(shellcode)
  • 无需额外内存分配
  • 执行后清除代码以降低检测率
  • 不调用任何内存分配或内存保护函数
  • 使用Windows组件管理的合法内存区域
  • 减少与操作系统的交互

6. 直接系统调用实现

6.1 技术基础

  • 基于SharpASM技术
  • 借鉴ElephantSe4l技术动态获取NTDLL中Zw*函数的系统调用号
  • 无需从磁盘读取NTDLL(避免被安全产品标记为可疑)

6.2 实现方法

  1. 通过PEB(进程环境块)直接从内存中访问NTDLL
  2. 动态检索系统调用号
  3. 实现C#中直接系统调用
  4. 替换DInvoke调用方式

7. 检测与规避

7.1 检测手段

  • 模块加载事件关联
  • 内存扫描
  • ETW监控
  • 行为分析

7.2 应对策略

  • 复用合法内存区域减少可疑行为
  • 执行后清除代码痕迹
  • 避免磁盘操作(如读取NTDLL)
  • 减少系统交互频率

8. 实践注意事项

8.1 环境配置

  • 创建C#的.Net Framework空项目
  • 分析时选择x86架构,实际应用选择x64架构
  • 整个流程调用可能会失败,需要多次尝试

8.2 已知问题

  • 并发执行冲突
  • 代码覆盖崩溃
  • 核晶模式下的检测规避(部分环境不可用)

9. 测试结果

9.1 安全产品检测情况

  • MSF:未检测到(效果较好)
  • 卡巴斯基:强力检测(HEUR:Trojan.MSIL.Agent.gen和HEUR:Trojan.MSIL.Shella.gen)
  • Windows Defender:未检测到(通过)

9.2 结论

技术具备一定隐蔽性,但对抗高级安全产品仍需改进

10. 未来改进方向

  1. 增强对抗高级EDR的能力
  2. 优化内存操作稳定性
  3. 改进并发处理机制
  4. 扩展系统调用支持范围
  5. 增强代码混淆和反分析能力

11. 总结

本文介绍的技术通过结合DInvoke动态调用和CLR内存复用机制,实现了在C#环境中较为隐蔽的非托管代码执行。通过复用JIT编译器分配的RWX内存区域,避免了可疑的内存分配行为,同时通过直接系统调用减少了用户层API的调用痕迹。这项技术为红队操作提供了更加隐蔽的攻击手段,但同时也指出了当前技术的局限性和未来改进方向。

注意:本技术仅用于安全研究和防御目的,请勿用于非法活动。

基于CLR内存复用的C#隐蔽执行技术教学文档 1. 技术概述 本技术研究旨在通过C#实现隐蔽的非托管代码执行,核心目标是规避安全产品的检测机制(如API Hooking、IAT检测等)。主要包含两大技术方向: 动态调用(DInvoke) - 运行时手动加载DLL并通过函数指针调用函数 系统调用(Syscall) - 直接进行系统调用,避免用户层API调用 两项技术均基于CLR内存复用机制实现隐蔽性。 2. 核心概念区分 2.1 非托管代码 vs 托管代码 非托管代码 :直接在处理器运行的机器码,无需中间翻译 托管代码 :运行于CLR环境,需要将MSIL中间语言翻译为机器码 2.2 .NET程序编译与执行流程 | 阶段 | 输入 | 输出 | 核心组件 | |------|------|------|----------| | 编译时 | C#/VB等高级语言代码 | Microsoft中间语言(MSIL) | 对应语言编译器 | | 运行时 | MSIL | 机器码(原生代码) | JIT编译器 | | 执行阶段 | 机器码 | 操作系统服务调用 | CLR | 3. JIT编译器与内存特征 3.1 JIT编译逻辑 仅在代码首次调用时将MSIL编译为机器码 编译结果存储于JIT Code Heap(RWX权限内存区域) 后续调用直接执行机器码,避免重复编译 3.2 内存关键发现 CLR分配的Private属性RWX内存中包含大量0字节空闲区域(代码洞穴) 这些区域可复用为临时代码存储区,无需额外内存分配 可能因CFG保护和硬件强制堆栈保护(如Intel CET或AMD Shadow Stack)导致Guard Page 4. 动态调用(DInvoke)技术 4.1 实现原理 运行时加载DLL(不产生静态导入记录) 借助函数指针定位非托管函数 通过.NET的Delegate API包装函数指针实现动态调用 4.2 优势场景 手动映射PE模块 执行系统调用 避免可疑导入 规避API挂钩(API Hooking) 规避IAT中可疑导入的检测 5. CLR内存复用技术 5.1 技术实现 枚举内存区域寻找RWX权限区域 定位连续的零字节序列(代码洞穴) 通过直接操作内存指针 byte* array = (byte*)addr 绕过.NET内存安全检查 实现对代码洞穴的"写入/擦除"操作 5.2 关键技术点 复用CLR分配的RWX内存区域存储并执行汇编代码(shellcode) 无需额外内存分配 执行后清除代码以降低检测率 不调用任何内存分配或内存保护函数 使用Windows组件管理的合法内存区域 减少与操作系统的交互 6. 直接系统调用实现 6.1 技术基础 基于SharpASM技术 借鉴ElephantSe4l技术动态获取NTDLL中Zw* 函数的系统调用号 无需从磁盘读取NTDLL(避免被安全产品标记为可疑) 6.2 实现方法 通过PEB(进程环境块)直接从内存中访问NTDLL 动态检索系统调用号 实现C#中直接系统调用 替换DInvoke调用方式 7. 检测与规避 7.1 检测手段 模块加载事件关联 内存扫描 ETW监控 行为分析 7.2 应对策略 复用合法内存区域减少可疑行为 执行后清除代码痕迹 避免磁盘操作(如读取NTDLL) 减少系统交互频率 8. 实践注意事项 8.1 环境配置 创建C#的.Net Framework空项目 分析时选择x86架构,实际应用选择x64架构 整个流程调用可能会失败,需要多次尝试 8.2 已知问题 并发执行冲突 代码覆盖崩溃 核晶模式下的检测规避(部分环境不可用) 9. 测试结果 9.1 安全产品检测情况 MSF :未检测到(效果较好) 卡巴斯基 :强力检测(HEUR:Trojan.MSIL.Agent.gen和HEUR:Trojan.MSIL.Shella.gen) Windows Defender :未检测到(通过) 9.2 结论 技术具备一定隐蔽性,但对抗高级安全产品仍需改进 10. 未来改进方向 增强对抗高级EDR的能力 优化内存操作稳定性 改进并发处理机制 扩展系统调用支持范围 增强代码混淆和反分析能力 11. 总结 本文介绍的技术通过结合DInvoke动态调用和CLR内存复用机制,实现了在C#环境中较为隐蔽的非托管代码执行。通过复用JIT编译器分配的RWX内存区域,避免了可疑的内存分配行为,同时通过直接系统调用减少了用户层API的调用痕迹。这项技术为红队操作提供了更加隐蔽的攻击手段,但同时也指出了当前技术的局限性和未来改进方向。 注意 :本技术仅用于安全研究和防御目的,请勿用于非法活动。