读书人

DLL文件整个内存里只有一份?该怎么处

发布时间: 2012-02-13 17:20:26 作者: rapoo

DLL文件整个内存里只有一份??
对于DLL,书上是这么说的:

  “它们有助于节省内存。如果两个或多个应用程序使用同一个D L L,那么该D L L的页面只要放入R A M一次,所有的应用程序都可以共享它的各个页面。”
                         -摘自《windows核心编程》

  但是实际操作中,却有些疑问:
  我用APIHook时,必须针对每个我感兴趣的进程、对我感兴趣的API进行hook,而若果按照书中的说法,实际上我只需要对我感兴趣的API进行一次Hook就好了,跟进程无关。

  这么看起来,实际与书中的说法似乎有些矛盾。琢磨了半天,只想出一个可能性:copy-on-write机制(具体的机制《windows核心编程》里也有详细的说明)。

  So,自己动手写了个修改Ntdll.dll代码段的DLL,代码如下:
/*
  WriteCopy_Test.cpp
*/
#include <windows.h>

BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to the DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
)
{
if (DLL_PROCESS_ATTACH == fdwReason)
{
unsigned char ucBuf[1] = {0};
HMODULE hModule = GetModuleHandle( "ntdll.dll ");

typedef VOID (NTAPI *_DbgBreakPoint)(VOID);
_DbgBreakPoint DbgBreakPoint = (_DbgBreakPoint)GetProcAddress(hModule, "DbgBreakPoint ");
memcpy(&ucBuf, DbgBreakPoint, 1);
DWORD dwOldProtect = 0;
VirtualProtect(DbgBreakPoint, 1, PAGE_EXECUTE_READWRITE, &dwOldProtect);
memcpy(DbgBreakPoint, &ucBuf, 1);
}
  //为了省内存,避免干扰,干脆连DLL_PROCESS_DETACH部分的代码也省略了
}

  我机子上的NtDll.dll文件大小为578KB,启动了一个基本上什么事都不干的小程序,该程序初始占用内存442KB。
  将上面的WriteCopy_Test.dll注入该程序,发现内存占用达到1524KB。

  测试的结果让我很迷惑,测试前后内存占用相差约1MB,除去NtDLL.dll的代码体积和一些WriteCopy.dll、注入程序申请的少许内存(不到1KB),还有500K去哪了?
是不是我分析的有问题?疑惑中。

[解决办法]
MagicMoon,向你学习,我也埋头真正钻研一下,赶下时髦,平生头一次写Blog,我的实验报告:

http://blog.csdn.net/feimingbiao/archive/2007/08/10/1736371.aspx

我觉得可以定论了,你不满意我们再研究。

读书人网 >VC/MFC

热点推荐