基于动态SSN检索的间接系统调用加载器实现与绕过EDR初探
字数 1419 2025-09-23 19:27:38

基于动态SSN检索的间接系统调用加载器实现与绕过EDR技术

一、系统调用基础原理

1.1 Windows系统调用机制

在Windows系统中,应用程序不直接调用内核函数,而是通过ntdll.dll中的函数(如NtCreateFile)作为接口,这些函数通过CPU的syscall指令进入内核模式。

1.2 系统服务编号(SSN)

  • 每个系统调用都有唯一的系统服务编号(SSN)
  • 发起syscall指令前,必须将正确的SSN放入eax寄存器
  • 内核根据eax寄存器中的值判断应执行的功能

1.3 系统调用存根结构

系统调用存根是ntdll.dll中的一小段预生成机器代码,基本结构为:

mov eax, SSN    ; 将系统调用号加载到eax寄存器
syscall/int 2eh ; 执行指令切换到内核模式
ret             ; 从系统调用返回

二、动态SSN检索技术实现

2.1 避免硬编码SSN的缺陷

依赖硬编码的SSN会使装载机变得脆弱并限制其作用范围,因此需要动态检索。

2.2 SSN检索步骤

  1. 获取ntdll.dll句柄:使用GetModuleHandle获取ntdll.dll的HMODULE句柄
  2. 计算函数地址:通过GetProcAddress获取原生函数的起始地址
  3. 定位SSN位置:从函数起始地址计算偏移量获取系统调用指令地址

2.3 偏移量计算

  • 系统调用指令地址偏移:+0x12字节
  • 系统调用号地址偏移:+0x4字节

三、技术实现细节

3.1 核心代码功能

syscalls.asm实现三个主要功能:

  1. 动态获取系统调用号(SSN)和系统调用地址
  2. 将C调用约定转换为系统调用约定
  3. 直接跳转到syscall指令,绕过API Hook

3.2 内存地址计算

通过分析ntdll.dll中系统调用存根的结构:

  • 跳过四字节后获取SSN的值
  • 计算本机函数系统调用存根中指令的有效内存地址

四、绕过EDR/AV检测分析

4.1 测试结果

  • 360安全卫士:无检测
  • Windows Defender:无检测
  • 火绒安全:无检测
  • 卡巴斯基优选版:阻止运行但未删除文件

4.2 卡巴斯基检测机制分析

卡巴斯基可能使用以下技术进行检测:

  • 事件跟踪(ETW)监控
  • Windows威胁情报事件跟踪(EtwTi)
  • 检查整个调用堆栈
  • 监控基础API的使用模式(GetProcAddress、GetModuleHandleA等)

4.3 现代EDR检测技术

高级EDR/AV采用的多层检测机制:

  1. 用户模式钩子:Hook系统调用函数
  2. 行为分析:监控API使用模式
  3. ETW/ETWTI事件跟踪:实时监控系统活动
  4. 启发式检测:识别间接系统调用的特征模式

五、技术局限性与应对策略

5.1 当前技术的局限性

  • 依赖的基础API函数可能已被EDR监控或破坏
  • 高级EDR能够检测动态SSN检索的行为模式
  • 系统调用存根结构可能随系统更新而变化

5.2 改进方向

  1. 替代API获取方法:使用其他方式获取模块基址和函数地址
  2. 直接解析PE结构:手动解析ntdll.dll的PE结构获取导出函数信息
  3. 多样化调用模式:避免固定的调用模式以规避启发式检测
  4. 结合其他绕过技术:与直接系统调用、硬件断点等技术结合使用

六、总结与展望

动态SSN检索的间接系统调用技术是绕过用户模式钩子的有效方法,但随着EDR技术的不断发展,需要持续改进和创新。未来的研究方向应包括更加隐蔽的SSN获取方式、多样化的调用模式以及与其他绕过技术的结合使用,以提高在高级安全环境下的隐蔽性和成功率。

注意:本文仅用于技术研究和防御目的,请勿用于非法用途。

基于动态SSN检索的间接系统调用加载器实现与绕过EDR技术 一、系统调用基础原理 1.1 Windows系统调用机制 在Windows系统中,应用程序不直接调用内核函数,而是通过ntdll.dll中的函数(如NtCreateFile)作为接口,这些函数通过CPU的syscall指令进入内核模式。 1.2 系统服务编号(SSN) 每个系统调用都有唯一的系统服务编号(SSN) 发起syscall指令前,必须将正确的SSN放入eax寄存器 内核根据eax寄存器中的值判断应执行的功能 1.3 系统调用存根结构 系统调用存根是ntdll.dll中的一小段预生成机器代码,基本结构为: 二、动态SSN检索技术实现 2.1 避免硬编码SSN的缺陷 依赖硬编码的SSN会使装载机变得脆弱并限制其作用范围,因此需要动态检索。 2.2 SSN检索步骤 获取ntdll.dll句柄 :使用GetModuleHandle获取ntdll.dll的HMODULE句柄 计算函数地址 :通过GetProcAddress获取原生函数的起始地址 定位SSN位置 :从函数起始地址计算偏移量获取系统调用指令地址 2.3 偏移量计算 系统调用指令地址偏移:+0x12字节 系统调用号地址偏移:+0x4字节 三、技术实现细节 3.1 核心代码功能 syscalls.asm实现三个主要功能: 动态获取系统调用号(SSN)和系统调用地址 将C调用约定转换为系统调用约定 直接跳转到syscall指令,绕过API Hook 3.2 内存地址计算 通过分析ntdll.dll中系统调用存根的结构: 跳过四字节后获取SSN的值 计算本机函数系统调用存根中指令的有效内存地址 四、绕过EDR/AV检测分析 4.1 测试结果 360安全卫士:无检测 Windows Defender:无检测 火绒安全:无检测 卡巴斯基优选版:阻止运行但未删除文件 4.2 卡巴斯基检测机制分析 卡巴斯基可能使用以下技术进行检测: 事件跟踪(ETW)监控 Windows威胁情报事件跟踪(EtwTi) 检查整个调用堆栈 监控基础API的使用模式(GetProcAddress、GetModuleHandleA等) 4.3 现代EDR检测技术 高级EDR/AV采用的多层检测机制: 用户模式钩子 :Hook系统调用函数 行为分析 :监控API使用模式 ETW/ETWTI事件跟踪 :实时监控系统活动 启发式检测 :识别间接系统调用的特征模式 五、技术局限性与应对策略 5.1 当前技术的局限性 依赖的基础API函数可能已被EDR监控或破坏 高级EDR能够检测动态SSN检索的行为模式 系统调用存根结构可能随系统更新而变化 5.2 改进方向 替代API获取方法 :使用其他方式获取模块基址和函数地址 直接解析PE结构 :手动解析ntdll.dll的PE结构获取导出函数信息 多样化调用模式 :避免固定的调用模式以规避启发式检测 结合其他绕过技术 :与直接系统调用、硬件断点等技术结合使用 六、总结与展望 动态SSN检索的间接系统调用技术是绕过用户模式钩子的有效方法,但随着EDR技术的不断发展,需要持续改进和创新。未来的研究方向应包括更加隐蔽的SSN获取方式、多样化的调用模式以及与其他绕过技术的结合使用,以提高在高级安全环境下的隐蔽性和成功率。 注意 :本文仅用于技术研究和防御目的,请勿用于非法用途。