1-创建纤程注入(CreateFiber Injection)

一、前言

学习过操作系统都知道,进程是进行资源分配的基本单位,而线程又是CPU调度的基本单位,在现代的操作系统的用户模式中,纤程是比线程更小的调度单位。

定义:纤程(Fiber)是一种轻量级的线程,也被称为协程(Coroutine)或微线程(Microthread)。它们是一种用户级别的线程,由程序自身管理,而不是由操作系统内核管理。纤程是一种可以提高程序执行效率的调度机制,特别适用于需要大量并发执行任务的场景

二、流程

  1. VirtualProtect:更改调用进程的虚拟地址空间中已提交页面区域的保护,在本例中就是将指定内存区域的属性改为:可读、可写、可执行。官方文档:VirtualProtect 函数 (memoryapi.h) - Win32 apps | Microsoft Learnarrow-up-right

  2. ConvertThreadToFiber:将当前线程转换为纤程。官方文档:convertThreadToFiber 函数 (winbase.h) - Win32 apps | Microsoft Learnarrow-up-right

  3. CreateFiber:创建一个纤程对象,关联到shellcode作为纤程入口点。官方文档:createFiber 函数 (winbase.h) - Win32 apps | Microsoft Learnarrow-up-right

  4. SwitchToFiber:切换到新创建的纤程,开始执行shellcode。官方文档:switchToFiber 函数 (winbase.h) - Win32 apps | Microsoft Learnarrow-up-right

  5. DeleteFiber:shellcode执行完毕后,删除纤程对象。官方文档 deleteFiber 函数 (winbase.h) - Win32 apps | Microsoft Learnarrow-up-right

shellcode的注入大致分为三步

  1. 为shellcode分配内存

  2. 将shellcode移动到已分配的内存区域

  3. 执行shellcode

可以看到本节所介绍的 创建纤程注入 shellcode的方式的三个步骤与前面介绍的 创建线程注入 都不同。但是呢,前两步是可以等价替换的,即 VirtualProtect 可以用 VirtualAlloc+RtlMoveMemory 进行等价替换。

VirtualProtect:直接修改原有 buf 数组的内存保护属性,不创建新的内存空间。在安全编程实践中更推荐 VirtualAlloc+RtlMoveMemory 的组合,但是在免杀中,没这么多讲究,只要达成目的即可(maybe?)

在这里再提一种方法,memcpy:C 库函数,也能实现内存数据的的复制,当然复制/移动shellcode并不是很复杂的操作,自己都可以封装成一个函数用几十行代码就能完成,最重要的是 VirtualAllocVirtualProtect 可以改变内存保护属性。

读者可以尝试积累可以完成shellcode的注入三步骤的函数

三、代码实现

Last updated