首页
社区
课程
招聘
[旧帖] [原创邀请码]windows下的三组内存管理函数 0.00雪花
2010-2-25 16:38 1102

[旧帖] [原创邀请码]windows下的三组内存管理函数 0.00雪花

2010-2-25 16:38
1102
分成三部分:
1 标准内存操作函数
2 堆内存操作函数
3 虚拟内存操作函数

在讲这个话题之前,先介绍下 windows下堆的概念,在一个进程被创建之后,系统会为该进程安排4G的虚拟地址空间,低2G是用户地址空间,高2G是系统地址空间。

低 2G中的地址空间,一般都会映射了本身exe可执行文件,还有依赖的一些dll动态连接库文件,还有就是空指针赋值区,还有PEB,TEB等等,详细资料可以去查阅《windows核心编程》。在进程初始化时,这些IMAGE映像,还有TEB,PEB等等,所占的地址空间一般都不大,也就几兆到几十兆把,剩下的1.9个多G的地址空间,我们可以申请使用。

每个进程的高2G的地址空间是系统地址空间,这里保存了注入内核对象,系统驱动等等资源,这里是我们无法修改的。

然后说说win_nt下堆的概念,winnt的进程有默认堆和私有堆,默认堆就是剩下的那1.9个多G的地址空间,私有堆呢,就是自己创建的堆,其实私有堆也属于默认堆的一部分,你可以使用第一种方法在默认堆上申请很多内存区域供自己使用,也可以自己创建私有堆,然后在这个私有堆里面申请内存区域来使用。

1 标准内存操作函数

其实是为了兼容win16而遗留下来的一组函数,这些函数申请的内存区域,都是从默认堆分配的。
函数有:
GlobalAlloc, LocalAlloc
GlobalFree, LocalFree
GlobalReAlloc, LocalReAlloc
GlobalLock, LocalLock
GlobalUnlock, LocalUnlock
GlobalDiscard, LocalDiscard
GlobalFlags, LocalFlags
GlobalHandle, LocalHandle
GlobalSize, LocalSize

不要看有一组Global 一组Local,其实他们都是从自己的地址空间申请内存区域的,win16下Global那组函数可以从全局内存地址空间申请,winnt里面已经没有这个全局地址空间的概念了,地址空间都是独立的。

2 堆内存操作函数

刚刚说了标准内存操作函数,其实那些都是为了兼容win16而保留的,已经不被ms大叔推荐使用了,而且那些函数内部也是调用的这里介绍的堆内存操作函数。

相比标准内存操作函数,堆内存操作函数,可以自行创建自己的堆,然后在自己的堆里面申请很多内存区域来使用,也可以从默认堆里面申请内存区域使用。

函数有:
HeapCreate   为进程创建一个堆,返回一个堆句柄
GetProcessHeap 获取当前进程中的一个堆
HeapAlloc   从指定堆上分配内存块
HeapReAlloc     重新分配内存,改变已经分配好的堆内存块大小
GetSystemInfo 获取系统信息
HeapSize     获取指定堆大小,以字节为单位返回堆大小信息
HeapFree   释放HeapAlloc和HeapReAlloc所分配的内存
HeapDestroy   销毁由HeapCreate创建的堆

这个GetProcessHeap就可以获取默认堆的堆句柄,然后使用HeapAlloc,把默认堆的堆句柄传进去,就可以在默认堆上申请内存区域使用啦。

3 虚拟内存操作函数

就是我们熟悉的VirtualXxxxx 这组函数了 这些函数可以申请地址空间 可以为申请的地址空间提交物理存储器。

虚拟内存管理API函数
VirtualAlloc "保留"或"提交"内存页面,将"空闲的"内存页面变为"保留的"或"已经提交的",保留的改为已提交的
VirtualAllocEx 类似VirtualAlloc功能,不过可以为其他进程分配内存
VirtualFree   将内存状态从"已经提交的"变为"保留的"
VirtualFreeEx 释放VirtualAllocEx分配的内存,功能,使用方法和VirtualFree类似
VirtualProtect 改变指定虚拟内存分页的保护属性

上面介绍的都是winnt的内存管理的API,我们用汇编写程序的话,要使用内存的话,就要依靠这些API了。

但是那些用C/C++写程序的人不一定会用这些API来管理内存,用C写程序的人呀,他们用malloc free,用C++的人,他们用new delete。

其实他们用的这些c或c++函数,在winnt平台上,就是对 HeapAlloc 的封装,当然linux平台上的c库,是对linux的内存管理api的封装啦。

当然,还有一些其他的函数,比如
VirtualAllocEx 可以在其他进程申请内存
VirtualProtect 更改内存区域的属性
WriteProcessMemory 可以向其他进程申请的内存写入数据

我们干坏事的时候不就经常用这三个API吗,注入其他进程 -。-

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回