【免杀】突破 360 核晶防护的 Syscall 免杀策略

admin 2024年4月2日10:03:45评论33 views字数 1857阅读6分11秒阅读模式

想第一时间看到我们的大图推送吗?赶紧把我们设为星标吧!这样您就不会错过任何精彩内容啦!感谢您的支持!🌟

目录

0x01 基础知识

0x02 Syscall Bypass 杀软原理

0x03 利用Syscall上线实验

0x04 杀软效果检测

0x01 基础知识

Intel的CPU将特权级别分为4个级别--从R0到R3,R0是系统核心态,在核心态运行,拥有最高权限;R1和R2运行的是设备驱动程序;R3是用户代码态,在用户态下运行,拥有最低权限,每一层支持访问本层以及权限更低层的数据。

【免杀】突破 360 核晶防护的 Syscall 免杀策略

如果用户态运行的系统要控制系统或者运行系统代码,就要提权至R0,也就是从用户态进入核心态中,中间的切换就是syscall的作用,以notepad.exe为例,如下图:

【免杀】突破 360 核晶防护的 Syscall 免杀策略

简单来讲,syscall就是一种绕过杀软用户态hook的方式,通过syscall生成的exe文件会构造syscall stub的汇编指令直接进入内核态调用里面的函数,相对于常规的exe文件,就不会调用大量系统自带的dll文件,更容易绕过杀软的检测。

基本的syscall stub:

mov     r10,rcxmov     eax,[系统调用号]syscallret

0x02 Syscall Bypass 杀软原理

如下图所示,当用户在运行Malware.exe时,系统会调用一些windows API,有些杀软就会hook系统所调用的API,但是最终我们调用的还是Ntxxx这个种函数,此时有些Ntxxx函数并没有被杀软 hook,因此可以Bypass 杀软。

【免杀】突破 360 核晶防护的 Syscall 免杀策略

0x03 利用Syscall上线实验

然后,结合syscall的原理,编写上线代码:

【免杀】突破 360 核晶防护的 Syscall 免杀策略

GetMainModule——关键函数             获取指定进程的主模块句柄

HMODULE mainModule = NULL;     主模块句柄,初始化为NULL
HMODULE* lphModule;                    指向模块句柄数组的指针
LPBYTE lphModuleBytes;                  指向模块句柄缓冲区的指针
DWORD lpcbNeeded;                       存储模块句柄所需的缓冲区大小

上面是初始化,是调用函数前必须要进行的预处理。

初始化后,首先需要利用LocalAlloc函数为线程的模块内存申请。

之后调用EnumProcessModules来获取存储模块句柄所需的空间大小(以字节为单位)。

【免杀】突破 360 核晶防护的 Syscall 免杀策略

GetMainModuleInformation——关键函数       获取主模块信息
GetCurrentProcess                                         获取当前进程句柄
GetMainModule                                             获取主模块句
GetModuleInformation                                  获取模块信息,存储在mi
VirtualProtect                                  将页面属性设置为可执行可读可写
该函数主要的功能是利用上述函数,获取进程的相关信息,并更改权限为可读可写,方便后续写入shellcode并执行。

【免杀】突破 360 核晶防护的 Syscall 免杀策略

main——主函数
unsigned char replace[] = { 0x0f, 0x05, 0x90, 0x90, 0xC3, 0x90, 0xCC, 0xCC }; 
该代码是将汇编代码的硬编码写入replace变量中,方便后续做syscall的替换。
相关代码硬编码的对应关系如下:
 nop; nop; ret; nop; int3; int3
0x0f, 0x05, 0x90, 0x90, 0xC3, 0x90, 0xCC, 0xCC
unsigned char egg[] = { 0x74, 0x0, 0x0, 0x7a, 0x74, 0x0, 0x0, 0x7a }

改代码是一个egg代码,主要目的是通过改代码与自定义函数FindAndReplace配合,准确定位syscall代码的位置。

准备充分后通过syscall调用NtAllocateVirtualMemory函数与NtWriteVirtualMemory函数实现内存的申请与写入。

最终通过NtCreateThreadEx函数创建线程,成功实现shellcode上线。

【免杀】突破 360 核晶防护的 Syscall 免杀策略

0x04 杀软效果检测

360,成功上线不报毒

【免杀】突破 360 核晶防护的 Syscall 免杀策略

360核晶,成功上线不报毒

【免杀】突破 360 核晶防护的 Syscall 免杀策略

火绒,成功上线不报毒

【免杀】突破 360 核晶防护的 Syscall 免杀策略

Win Defender,成功上线不报毒

【免杀】突破 360 核晶防护的 Syscall 免杀策略

本文所涉及源码

链接:https://pan.baidu.com/s/1Fsz0it1VtJft9p51fkR4rQ?pwd=9437

原文始发于微信公众号(赤鸢安全):【免杀】突破 360 核晶防护的 Syscall 免杀策略

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月2日10:03:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【免杀】突破 360 核晶防护的 Syscall 免杀策略https://cn-sec.com/archives/2622121.html

发表评论

匿名网友 填写信息