内存管理3 Win32汇编语言056

内存管理3

 

让编程改变世界

Change the world by program


 

可丢弃的内存块

  分配可移动内存块的时候需要使用 GMEM_MOVEABLE 标志,如果同时配合使用 GMEM_DI SCARDABLE 标志的话,这样生成的内存块是可丢弃的内存块。 表示当Windows急需内存使用的时候,可以将它从物理内存中丢弃,可丢弃的内存块首先必须是可移动的内存块。  

函数调用如下:

invoke GlobalAlloc, GHND or GMEM_DISCARDABLE, dwBytes .if eax

mov hMemory, eax

.endif   当用GlobalLock锁定内存的时候如果返回NULL指针,表示内存已经被Windows丢弃了。 当然其中的数据也丢失了,程序需要重新生成数据。 另外需要注意的是当内存块被丢弃的时候,内存句柄还是有效的,如果程序还要使用这个句柄,那么可以对它使用GlobalReAlloc函数来重新分配内存。   当可丢弃内存块的锁定计数为0时,程序也可以使用GlobalDiscard函数主动将它丢弃,这和Windows将它丢弃的效果是一样的:

invoke GlobalDiscard, hMemory

 

使用内存函数时有两个地方需要特别注意

 

第一个需要注意的地方是:

  NULL指针的检测——GlobalAlloc函数和GlobalLock函数都可以返回内存指针,在使用指针前一定要检测它的有效性。 如果使用了函数执行失败而返回的NULL指针来访问数据,会导致程序越权访问不该访问的地方,从而被Windows毫不留情地终止掉。 这就是例子代码中总是有个if语句来判断eax是否为NULL的原因。  

第二个需要注意的地方是:

  注意访问越界问题,越界操作也会引起越权访问,千万不要到超出内存块长度的地方去访问。 例如,使用lstrcpy之类的函数处理字符串之前,先用lstrlen检测字符串长度是一个好习惯。 补充:lstrcpy函数事实上是很多溢出漏洞的根源,该函数作用是复制一个字符串到缓冲区。

LPTSTR lstrcpy(LPTSTR lpString1, LPCTSTR lpString2);

 

一些不安全因素

  在微软产品的安全漏洞中,有很大一部分是由于不正确的使用C动态库(C Runtime Library)?的函数,特别是有关字符串处理的函数导致的。 证据请看下表: [caption id="attachment_477" align="aligncenter" width="300"] 微软产品的安全漏洞[/caption]   在这里小甲鱼列出其中的一部分特别尤其不安分的因素,以便大家日后编程对那些”有威胁性”的API函数有所警惕,要么使用安全函数替代,要么自行进行必要的检查等。 有关完整的危险API的禁用列表,可以参见:http://msdn.microsoft.com/en-us/library/bb288454.aspx [caption id="attachment_478" align="aligncenter" width="300"] 危险API的禁用列表[/caption]  

StrSafe函数和SafeCTR函数

  下边通过一些栗子给大家介绍一下这两种函数如何替代不安全的API函数,有兴趣的朋友可以听听哈~   使用StrSafe(资料下载 使用SafeCRT(资料下载   另外纯C语言也有好多函数编程的时候需要你多留点心眼儿:C语言中不安全的函数以及解决方案 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/BdsUAwrTHwBnT7JS44d']视频下载[/Downlink]
原文地址:https://www.cnblogs.com/LoveFishC/p/3847181.html