9-MapViewOfFile+NtMapViewOfSection

一、前言

CreateFileMappingMapViewOfFile 实际上是对内核API的高级封装,我们可以直接使用NT内核 NtCreateSectionNtMapViewOfSection 来完成相同的功能。这两个API都封装在ntdll.dll中。

在微软官方的解释中,创建的文件映射对象也称为 ,我们将要用此内核函数创建恶意本地进程与远程目标进程共享的物理内存块也就是

因为本小节涉及到 动态获取api函数 的内容,所有我们来看一下这两个API的函数原型吧

NtCreateSection:官方文档:NtCreateSection 函数 (ntifs.h) - Windows drivers | Microsoft Learnarrow-up-right

__kernel_entry NTSYSCALLAPI NTSTATUS NtCreateSection(
  [out]          PHANDLE            SectionHandle,
  [in]           ACCESS_MASK        DesiredAccess,
  [in, optional] POBJECT_ATTRIBUTES ObjectAttributes,
  [in, optional] PLARGE_INTEGER     MaximumSize,
  [in]           ULONG              SectionPageProtection,
  [in]           ULONG              AllocationAttributes,
  [in, optional] HANDLE             FileHandle
);

NtMapViewOfSection:官方文档: ZwMapViewOfSection 函数 (wdm.h) - Windows drivers | Microsoft Learnarrow-up-right

NTSYSAPI NTSTATUS ZwMapViewOfSection(
  [in]                HANDLE          SectionHandle,
  [in]                HANDLE          ProcessHandle,
  [in, out]           PVOID           *BaseAddress,
  [in]                ULONG_PTR       ZeroBits,
  [in]                SIZE_T          CommitSize,
  [in, out, optional] PLARGE_INTEGER  SectionOffset,
  [in, out]           PSIZE_T         ViewSize,
  [in]                SECTION_INHERIT InheritDisposition,
  [in]                ULONG           AllocationType,
  [in]                ULONG           Win32Protect
);

MapViewOfFile + NtMapViewOfSection 完成映射注入的原理与我在 映射注入(Mapping Injection) 这一小节介绍的原理大差不差。就是通过 NtCreateSection 创建一个进程之间共享的节,然后使用 NtMapViewOfSection 将进程的虚拟地址空间中的某一个内存区域与节建立映射关系。这样进程对内存映射区域的操作其实就是对共享节的操作。

二、流程

  1. 创建一个具有 RWX 权限的共享内存节(section

  2. 在本地进程中创建内存节区(section)的本地视图(native view)

  3. 将shellcode复制到本地视图(native view),这也同步影响到共享内存节区

  4. 打开远程进程,获得其句柄

  5. 在远程进程中创建内存节区(section)的视图(remote view)

  6. 在目标进程创建远程线程,执行shellcode

三、代码实现

其实映射注入的执行链有很多条,常见的有以下几条

  1. CreateFileMappingMapViewOfFileMapViewOfFile2

  2. NtCreateSectionNtMapViewOfSection

  3. CreateFileMappingMapViewOfFileNtMapViewOfSection(Cobalt Strike 的进程注入选项中就有这条链)

  4. NtCreateSectionMapViewOfFile ->NtMapViewOfSection

第二章-执行与注入技术 中我只介绍第一条和第二条执行链,其余两条执行链,感兴趣的读者可以自己去实现,原理大差不差。

Last updated