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去哪了?
是不是我分析的有问题?疑惑中。