xp下用户程序空间分配(8):MEM_MAPPED

在去除前面的那些东西之后,我们的内存块里面还有一堆MEM_MAPPED的内容,就像这样的块:

MSDN里面这样解释MEM_MAPPED这种类型:

Indicates that the memory pages within the region are mapped into the view of a section.

很自然地我们想用GetMappedFileName来看看映射到这些 内存区域的文件名,于是发现了下面几个块的确是做了文件映射:

那么其它东西是哪里来的?

使用GetLastError取错误信息:“error: 000003ee : 文件所在 的卷已被外部改变,因此打开的文件不再有效。”,诡异得很!一怒之下使用UnmapViewOfFile将 这些内存块给Unmap了,不幸的是程序就这样挂掉了!

写段代码查询一下当前打开的句柄,看看有没 有file mapping的内容:

void enum_handles(HANDLE hProcess)
{
// 枚举已经打 开的句柄,取其名称
HMODULE hNtDll = NULL; // nt.dll句柄
ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;
NTQUERYOBJECT NtQueryObject = NULL;
SYSTEM_HANDLE_INFORMATION *hInfo = NULL;
int nNumHandle = 0, i;      // 句柄数 量
NTSTATUS Status;
ULONG nSize, nCount;
char cBuffer[0x40000], cInfoBuffer [0x1000];
OBJECT_ALL_INFORMATION *pInfo;
OBJECT_NAME_INFORMATION* pName;
DWORD nId = GetProcessId(hProcess);

// 取导出函数
hNtDll = GetModuleHandle( "ntdll.dll" );
ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( hNtDll, "ZwQuerySystemInformation" );
NtQueryObject = ( NTQUERYOBJECT )GetProcAddress( hNtDll, "NtQueryObject" );

// 查询句柄信息
Status = ZwQuerySystemInformation (SystemHandleInformation,
cBuffer,
0x40000,
&nSize);

if (NT_SUCCESS(Status))
{
nNumHandle = *(PULONG)cBuffer;
hInfo = (SYSTEM_HANDLE_INFORMATION*)(cBuffer + 4);
nCount = 0;
for(i = 0; i < nNumHandle; i++)
{
if(hInfo[i].ProcessId != nId) continue;
Status = NtQueryObject(hInfo[i].Handle, ObjectAllInformation, cInfoBuffer, 0x1000, &nSize);
if(NT_SUCCESS(Status))
{
pInfo = (OBJECT_ALL_INFORMATION*)cInfoBuffer;
nCount++;
……………………….
}
}
}
}

时间: 2024-12-23 19:57:12

xp下用户程序空间分配(8):MEM_MAPPED的相关文章

xp下用户程序空间分配(2):栈

每个线程都有自己的栈空间,这个空间大小是在CreateThread时指定的,而主线程的栈则是由xp在创 建进程时指定的,在vs2008下设置一个断点,中断程序的执行,可以看到主线程ESP的值为0x00124914, 这个指针落在下面这个区域: 这块空间的上限是0x0013 0000,这个值与我们读出来的NT_TIB结构体里面的StackBase的值是一致的 ,也就是说主线程的栈空间从0x0013 0000开始往下增长.但是在NT_TIB里面的StackLimit值却只有 0x00000 a000

xp下用户程序空间分配(9):还剩下什么?

在去除前面的部分后,看看内存里还剩下什么: 基址 分配基址 分配保护 大小 状态 保护 类型 00010000 00010000 00000004 PAGE_READWRITE 00002000 00001000 MEM_COMMIT 00000004 PAGE_READWRITE 00020000 MEM_PRIVATE 7ffdd000 7ffdd000 00000004 PAGE_READWRITE 00001000 00001000 MEM_COMMIT 00000004 PAGE_RE

xp下用户程序空间分配(1):大致框架

<windows核心编程>告诉我们,对于每个应用程序的4G虚拟空间可以分为4个大块: 0x0000 0000 ~ 0x0000 ffff:空指针赋值分区 0x0001 0000 ~ 0x7ffe ffff:用户模式分区 0x7fff 0000 ~ 0x7fff ffff:64K禁入分区 0x8000 0000 ~ 0xffff ffff:内核模式分区 但是再要具体点就需要自己研究了. 咱就来看看一个应用程序是怎么使用这4G的空间的 .先写段代码查询一下这4G空间中内存块的大致分类: SYSTE

xp下用户程序空间分配(7):Heap

我们都知道在程序里可以使用malloc在堆上分配内存,显然windows应该为这个Heap分配一块空间的 ,我们在主程序里用malloc分配一小块内存,看看指针指向哪里: char* p = (char*)malloc (10); 得到一个指针:0x00b267b0 在内存块里面找,很容易就发现了目标: 从这里可以发现malloc采用的算法并不会在一开始就分配一块很大的内存,如果我们接着用: p = (char*)malloc(0x10000); 分配一块64K的内存,这时可以发现又多了一块内存

xp下用户程序空间分配(6):加载用户DLL

在本项目里使用了自行编译的一个DLL-cywin.dll,这个DLL占用的内存块出奇的多: 同样把文件里的内容dump出来进行比较.

xp下用户程序空间分配(5):加载系统DLL

ntdll.dll是加载的第一个系统DLL,它的模块信息: 名称 基址 大小 入口点 E:\WINDOWS\system32\ntdll.dll 7c920000 00093000 7c932c28 对应的内存块: 和exe略微有所区别,还是用dumpbin把它的文件内容导出来进行比较. 1.1 文件头 DLL和EXE文 件一样都是PE格式,因此它们的文件头的结构是一样的,看看从ntdll.dll中dump出来的信息: 14C machine (x86) 4 number of sections

xp下用户程序空间分配(4):加载主程序

这个是主程序,它的模块信息: 名称 基址 大小 入口点 f:\embed\etools\Debug\bin\bash.exe 00400000 0006f000 0045bb30 对应的内存块: 这些块的类型都是MEM_IMAGE,且分配时的保护标志都是PAGE_EXECUTE_WRITECOPY,MSDN这样解释这 个标志位: Enables execute, read, and write access to the committed region of image file code p

xp下用户程序空间分配(3):加载文件

一个程序要想执行,总是要加载到内存里面的,为此我们使用下面的代码查询所有模块的信息,再找 到它们在内存里面的对应位置: HANDLE hProcess; HMODULE hModule[0x70]; TCHAR strFileName [MAX_PATH]; DWORD cbNeeded; MODULEINFO modinfo; hProcess = GetCurrentProcess(); if(EnumProcessModules(hProcess, hModule, sizeof(HMOD

Win XP下全新安装Apache2,PHP5,MYSQL5

apache|mysql|php5 看PHP,MYSQL,都出了新版本,想尝尝鲜,就试着安装了一下,然后把安装过程记了下来,希望能对学习PHP的新手有些帮助,斑竹可以考虑精一下了 Windows XP下全新安装Apache2,PHP5,MYSQL5,Zend的简单过程 一.下载地址: Apache2.0.50 :http://httpd.apache.org/download.cgi PHP5.0.2 :http://cn2.php.net/get/php-5.0.2-Win32.zip/fro