在Windows系统运行过程中,无论是由内存问题还是应用程序引起的异常,都是难以避免的现象。然而,Windows系统提供了一套强大的异常处理机制,其灵活性和可靠性使得开发人员能够有效地管理和应对这些异常情况,从而提高系统的稳定性和可用性。大体上来讲,Windows提供了SEH(结构化异常处理)、VEH(向量化异常处理)这两种种异常处理机制。
SEH(Structed Exception Handler)是Windows操作系统提供的强大异常处理机制,程序源代码中使用__try,__except,__finally关键字来具体实现。SEH分为两个部分,终止处理器和异常处理器,其中终止处理器由__try和__finally组成,无论__try块中的代码有无异常,finally块总是被调用执行 ,其作用主要是保证应用程序在一段被保护的代码发生中断后还能够完成关闭文件,清理内存等工作;而异常处理器由__try和__except组成, 当__try块中的代码发生异常时,__except()中的过滤程序就被调用。
除了SEH,从XP开始,Windows还支持了向量化异常处理VEH。VEH的基本思想:通过注册回调函数来接收和处理异常。
VEH通常是用AddVectoredExceptionHandler去添加一个异常处理函数,可以通过第一个参数决定是否将VEH函数插入到VEH链表头,插入到链表头的函数先执行,如果为1,则会最优先执行。当在用户模式下发生异常时,异常处理分发函数在内部会先调用遍历 VEH 记录链表的函数, 如果没有找到可以处理异常的注册函数,再开始遍历 SEH 注册链表。所以其优先级比SEH更高
首先需要对两个函数Sleep与VirtualAlloc进行挂钩。
创建函数HookSleep与HookVirtualAlloc用于挂钩。
UnHookSleep与UnHookVirtualAlloc进行脱钩。
这里预先对四个函数进行定义,避免报错。
这是挂钩替换的新的Sleep与新的VirtualAlloc函数,Sleep函数的主要目的是用于判断杀软的动态监测。很多杀软都会对Sleep函数进行挂钩,一旦Sleep函数被杀软挂钩,就会对事件进行设置。
此处是SetProtect函数,用于更改内存空间的属性。
此处是用于异常检测的函数。
首先我们需要报错的异常是0xc0000005,报错原因是内存的权限不够。
除此之外,我们还需要检测地址信息,检测是否是shellcode的地址。
通过AddVectoredExceptionHandler函数创建异常处理函数,随后对VirtualAlloc,Sleep函数挂钩。
通过读取文件的方式,加载shellcode。
初始shellcode不要带有可执行权限,这一点是异常免杀的核心。
利用实时更改内存权限的方法,在需要执行shellcode的时候对内存权限添加可执行,执行完成后删除执行权限,一定程度上能避免掉队内存的检测。
0x03 杀软效果检测
喜欢我们的文章的话,别忘了给我们点个赞哦!感谢您的支持👍
原文始发于微信公众号(赤鸢安全):【免杀】利用VEH异常处理机制突破360核晶内存扫描的壁垒
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论