Windows管理内存的3种方式——堆,2024年最新两年网络安全开发经验

| 空闲(FREE) | 内存页不可用 |
| 保留(Reserve) | 内存页被预定了,但为与物理内存做映射,还是不可用 |
| 提交(Commit) | 内存被分配,并且与物理内存进行了映射,进程可以使用了 |

当虚拟内存映射到物理内存时,有三种映射方式

4、内存映射方式:
映射方式描述
Private进程私有内存,不被其他进程所共享,一般是堆,栈
Mapped从别的内存映射而来
Image从程序的PE映像映射而来。

虚拟内存管理-内存属性:

Windows中,内存管理的最小单元是一个内存页 通常是0x1000=4kb

5、内存分页属性:
ReadOnly只读
READ_WRITE读写
EXECUTE执行
EXECUTE_READ_WRITE可读可写可执行
WRITE_COPY写时拷贝
6、页交换文件逻辑:

程序访问虚拟内存地址,操作系统判断数据是否在内存中,如果在就从虚拟地址映射到的物理地址,如果不在就判断是否在页交换文件当中,如果在就查看物理内存是否有闲置空间,有的话,就将页交换文件载入到物理内存,如果没有闲置内存,就从物理内存中找到一个可以释放的页,然后将页保存到页交换文件中。

7、虚拟内存相关API
VirtualAlloc分配或者预定一块虚拟内存
VirtualAllocEx可以在其他进程分配或者预定一块内存
VirtualFree释放内存
VirtualFreeEx可以释放其他进程内存
VirtualLock锁定内存不能交换到硬盘
VirtualUnLock解锁
VirtualProtect修改内存读写执行属性
VirtualProtectEx可以修改其他进程内存属性
ReadProcessMemory读取远程进程内存
WriteProcessMemory写入数据到远程进程内存
VirtualQuery查询内存状态
VirtualQueryEx
8、虚拟内存小案例

下面我们利用虚拟内存的特点来修改C++当中的常量:没错!就是那些你以为不可能被改动的const char*那些玩意🙂🙂

事情是这样的:浮沉最近经常摆烂,他感觉这样不好,于是偷偷黑入了我的电脑,把我虚拟内存常量区的《浮沉学习记录表》偷偷改了,从此,浮沉变成了一个爱学习的乖宝宝😂😂😂

以下是完整的代码部分:(他的代码忘记删了,我复制了一份)

#include
#include<Windows.h>
#include
int main()
{
const char* str = “浮沉今天在好好摆烂!\n”;
std::cout << “字符串常量修改前:” << str << std::endl;

// 获取字符串所在内存区域的地址
const void* addr = static_cast<const void*>(str);

// 修改内存保护属性为可写属性
//记得保存一下内存区域的原有访问属性,以便后续恢复他的属性,避免报错
DWORD old_protect;
VirtualProtect((char*)addr, strlen(str), PAGE_EXECUTE_READWRITE, &old_protect);
// 修改字符串内容
char* writable_str = const_cast<char*>(str);
char* index = std::strstr(writable_str, “摆烂”);
if (index != nullptr) {
std::memcpy(index, “学习!\0”, 7);
}
// 输出修改后的字符串内容
std::cout << “字符串常量修改后:” << str << std::endl;

// 恢复内存保护属性为只读属性
VirtualProtect((char*)addr, strlen(str), old_protect, &old_protect);

return 0;
}

四、文件映射

1、文件映射的概念

文件映射(File Mapping)是Windows系统中一种高效的文件访问方式。它通过将文件数据与进程的虚拟地址空间相关联,这样访问虚拟内存就是直接访问文件了,让进程可以直接读写文件数据,避免了传统的文件I/O操作带来的频繁的磁盘I/O,提高了文件访问的效率。

注:这里的所谓和虚拟地址建立联系,本质就是和物理内存建立联系!表面上来看修改虚拟内存就直接修改磁盘上的文件了,本质上还是要通过物理内存来连接滴😐

2、文件映射的原理

1)文件映射首先通过系统调用创建一个FileMapping映射对象(内核对象)

2)然后将映射对象关联到一个文件或其他I/O设备(关联我们准备操作的文件)

3)最后将映射对象的内容映射到进程的虚拟地址空间中

通过文件映射的方式使得进程可以通过访问内存的方式直接读写文件或设备的数据,修改这个内容之后由操作系统来负责自动同步磁盘上文件内容的更新,所以有时候你在内存修改文件的时候,磁盘上的源文件可能并没有同步更新,这时候我们可以使用Windows提供的另外一个接口FlushViewOfFile来刷新缓冲区,实现将映射在内存当中的文件立即写回到磁盘当中。

这个过程中,操作系统会将映射对象分页,每一页映射到虚拟地址空间的一个页面上,并且会对访问的数据进行合适的缓存,从而提高了文件访问的效率。

3、下面我来详细解释一下为什么通过文件映射可以提高访问文件的访问效率:

首先我们需要明确两点:一是在读取大文件的时候通过文件映射才可以提高访问效率,其实原因很简单,你文件太小的话,两种方式都会直接把整个文件全部读到内存当中去,启动一次磁盘,没什么效率上的区别。二是所谓提高文件访问效率本质就是减少启动磁盘的次数!

因此,我们不难发现,采用传统的方式操作文件,属于一种颗粒度比较大的读取,而且没有通过操作系统进行统一集中管理,比如在操作文件的时候,发现文件的内容没有被加载进内存,通过传统的方式就是要把相关的块一股脑地全部加载进来,但是你很有可能只需要使用其中很少的一部分内容,而且长时间不用还有读回磁盘,这就又需要额外启动磁盘,我们都知道IO设备的访问速度远远慢于内存,你直接按照块去加载会启动不止一次磁盘,而且每一层加载很多内容速率也慢,同时会造成额外的空间开销,而使用文件映射之后,就相当于是把磁盘当中内存来使用了,一样是按页来进行装载,一个页大小4KB大小,十分轻量,就算读取IO也不会浪费太多时间,而且文件映射对象是通过内核进行管理的,可以十分精确地把没有加载的内容装载进来,而不会造成额外的开销!

4、文件映射的应用场景

  1. 需要频繁地读写大文件或大数据的场景,比如视频编辑、图像处理等,使用文件映射可以提高访问效率,减少磁盘I/O带来的性能瓶颈。
  2. 需要多个进程共享同一个数据源的场景,比如IPC(进程间通信),使用文件映射可以让多个进程共享同一个数据源,避免了复制数据和进程间通信的开销。
  3. 实现内存映射文件(Memory-Mapped Files),可以将一个文件映射到内存中,通过读写内存的方式来读写文件数据。内存映射文件可以实现对文件的共享访问,使得多个进程可以共享同一个文件数据。

我们以前操作文件,都是将文件从磁盘当中先读入内存当中,然后在内存当中对文件的内容进行操作,操作完成之后再将文件内容从内存写回磁盘当中,这样的操作方式的效率无疑十分低下。

因此Windows当中提供了一种文件映射内存的方式操作文件,也就是建立虚拟内存和磁盘文件的映射,在这里这个磁盘文件我们就相当于当成是物理内存来用,从虚拟内存的角度来看,磁盘文件和物理内存本质就是一个东西,只不过物理内存的读写速度更快,仅此而已。

5、文件映射常用API:

CreateFileMapping创建一个Mapping对象
OpenFileMapping打开一个Mapping对象
MapViewOfFile将maping对象的文件映射到内存中
UnmapViewOfFile取消文件映射
FlushViewOfFile刷新缓存区,将映射在内存中的文件写回到硬盘中

6、下面我们来梳理一下:

正常操作文件:

CreateFile–》文件句柄—》通过文件句柄将文件内容读到虚拟内存,修改内容–》重写写入到文件。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

😝朋友们如果有需要的话,可以联系领取~

1️⃣零基础入门
① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

image

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

2️⃣视频配套工具&国内外网安书籍、文档
① 工具

② 视频

image1

③ 书籍

image2

资源较为敏感,未展示全面,需要的最下面获取

在这里插入图片描述在这里插入图片描述

② 简历模板

在这里插入图片描述

因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

ic_center)

② 简历模板

在这里插入图片描述

因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-jdrkRAar-1712728487067)]

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值