基于动态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检索步骤
- 获取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获取方式、多样化的调用模式以及与其他绕过技术的结合使用,以提高在高级安全环境下的隐蔽性和成功率。
注意:本文仅用于技术研究和防御目的,请勿用于非法用途。