网站大量收购闲置独家精品文档,联系QQ:2885784924

第十章内存管理部分1.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十章内存管理部分1

标 题: 【原创】windows下32位汇编语言学习笔记 第十章 内存管理部分 1 作 者: jasonnbfan 时 间: 2009-05-19,21:25:54 链 接: /showthread.php?t=89301 windows下32位汇编语言学习笔记?第十章?内存管理部分 前面5?6?7?8?9章都是介绍windows界面设计有关的内容,这些内容大概看一下就可以,等需要用的时候再回过头来查。一次性记住的可能性不大。这些章节也没有什么难度,自己看看就可以。 我所关心的还是windows系统相关知识,说道界面设置,对RC资源再熟悉做界面还是Delphi,C++builder比较快速。 本章介绍了很多windows下关于内存管理的函数,书上有句话说的很好,不要去深究这些函数分配的内存具体放在内存寻址空间的什么地方,只需要知道什么时候该用什么类型的内存管理函数就可以。 Global标准内存管理 GlobalAlloc函数使用GMEM_MOVEABLE参数返回的是个内存句柄,内容是一个地址,这个地址才是可以使用的内存块。比如: PVOID?lpMem?=??GlobalAlloc(GHND,?1000); 现在lpMem指向的内容是一个地址,必须通过GlobalLock(lpMem)函数返回这个指针才能使用。 实际上GMEM_MOVEABLE参数和GMEM_FIXED区别就是前者必须要经过GlobalLock才能使用,后者则通过返回的指针直接使用。 关于什么时候可移动,我没法测,不知道windows在什么情况下去移动这块内存。 GlobalAlloc分配内存是紧凑的,就是说分配的多个内存空间可以放在一个内存页面里,只要能放的下。 Heap堆内存管理 Heap内存管理非配基本上和Global的用法相当,一般的用法都是GetProcessHeap得到进程默认堆,然后HeapAlloc分配。 虚拟内存管理 有一点必须知道,VirtualAlloc,所分配的空间都是页对齐的,分配1字节的内存空间也会占用4096字节的一个内存页,再次使用VirtualAlloc分配内存会从新的一页开始。 每个虚拟内存页面有三种状态:Free:自由状态,Commit:提交状态,Reserve:保留状态。 八种保护属性: PAGE_NOACCESS,PAGE_READONLY,PAGE_READWRITE,PAGE_EXECUTE,PAGE_EXECUTE_READ,PAGE_EXECUTE_READWRITE,PAGE_EXECUTE_WRITECOPY,PAGE_WRITECOPY 这八种属性在第一章的笔记里有介绍。 虚拟内存页面还有4种类型 Free:空闲,没有提交也没有使用的。Private:私有,该区域的虚拟地址和系统页文件关联。Image:映像,改区域的虚拟内存地址和exe文件或dll文件关联。 Mapped:映射,改区域的内存和其他硬盘上的文件关联。 这些页面的属性,类型,状态,就是80386保护模式下,windows系统管理虚拟内存的机制。 虚拟内存管理函数中提供了几个可以操作其他进程虚拟地址的函数。 LPVOID?VirtualAllocEx(HANDLE?hProess,LPVOID?lpAddress,SIZE_T?dwSize,DWORD?flProtect) 这个函数可以在别的进程空间保留或者提交一块内存。比如DLL的远程注入就是使用这个函数在目标进程开辟一块虚拟内存空间,将要注入的dll名通过WriteProcessMemory函数写进目标进程的虚拟内存空间,然后再通过CreateRemoteThread函数运行LoadLibraryA加载写入的dll文件,LoadLibraryA函数位于kernel32.dll中,由于每个进程运行都会加载这个dll,所以LoadLibraryA函数在不同进程中的地址是一样的,可以直接再目标进程使用。 比如下面的例子: //?向目标进程地址空间写入DLL名称 DWORD?dwSize,?dwWritten; dwSize?=?lstrlenA(?lpszDll?)?+?1; LPVOID?lpBuf?=?VirtualAllocEx(?hProcess,?NULL,?dwSize,?MEM_COMMIT,?PAGE_READWRITE?); if?(?NULL?==?lpBuf?) { ?????CloseHandle(?hProcess?); ????//?失败处理 } if?(?WriteProcessMemory(?hProcess,?lpBuf,?(LPVOID)lpszDll,?dwSize,?dwWritten?)?) { ????//?要写入字节

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档