Syscall(系统调用)是用户空间与操作系统内核之间的接口,它允许用户程序请求操作系统提供的服务。 具体来说syscall 是通过特定的指令将控制权从用户模式切换到内核模式,从而执行操作系统内核中的预定义服务,比如文件操作、进程管理、内存分配等。 比如我们在R3层写的任何代码,在windows系统大部分都是调用的Win32API的函数,而Win32 API 是 Windows 操作系统提供给用户层应用程序的一组接口,也是属于R3层的,它本身也不属于系统内核的函数,但是由于windows的设计思想就是高度封装所以实际上的R3 api是ntdll.dll中的函数,它本身的调用流程如下图所示
可以看到这两个函数大体的汇编结构是一样的,只有给eax寄存器赋值的时候传入的参数不同,这里给eax传递的这个参数叫系统调用号(SSN system-call-number)系统会根据传递的SSN来决定调用哪个NT函数 syscall技术的技术核心就在这,通过传入不同的且唯一的SSN以此来决定调用哪个内核函数。 syscall的常用写法有如下几种: windows64位上的Syscall写法: 列如NtCreateThread函数 Windows x86 上的 int 0x2E 写法 在 Windows 32 位系统上,syscall 并不适用,取而代之的是使用中断指令 int 0x2E 来触发系统调用。
Edr的工作原理 Edr的工作原理在于对NT函数进行inline hook,也就是HOOK入口函数的前几条汇编指令,跳转到自定义函数的位置,在执行完自己定义的函数之后跳转回原来的入口函数,有点类似于修改PE的OEP,不过区别在于inline hook是在运行时针对内存中局部函数或代码段的劫持,修改PE的OEP 是在程序启动时对程序入口点的劫持。 当我们自己使用syscall技术的时候,就可以绕过Edr对NT函数的hook,可以减少被Edr检测到的概率 总结一下Syscall免杀的技术原理 Syscall免杀技术的核心原理在于通过直接调用内核系统调用(syscall),跳过常规的用户态 API 路径,绕过杀毒软件的 API Hooking,从而避免其检测和拦截。