我正在运行安装了所有更新的 64 位 MS Windows 7。约1周或2周前,我已经注意到,每当我重新启动操作系统,虚拟内存页面(无论过程),对应的系统库,例如ntdll.dll
和kernel32.dll
略有不同。
我不是在谈论加载模块的基地址,因为我知道由于 ASLR 会发生变化。我说的是加载模块的实际内容,据我所知,它不受 Windows 上的 ASLR 实现的影响。
为了说明我的意思,让我向您展示以下屏幕截图,该屏幕截图比较ntdll.dll
了在一次操作系统重新启动之前(上半部分)和之后(下半部分)捕获的2 个二进制实例:
图片仅显示了一小部分,ntdll.dll
因此只有一些差异。然而,还有更多。这些 DLL 的大小不会改变,只会改变特定位置的一些字节。
我使用 Process Hacker 获得了在上图中进行比较的 2 个二进制实例,如下所示:
- 右键单击进程并选择属性
- 转到“内存”选项卡并向下滚动,直到找到多个名称为:ntdll.dll: Image (Commit) 的条目
- 双击这些条目之一(我选择了具有 856kB 的条目)
- 按Save...按钮将内容存储到 HDD 上的二进制文件中。
问题 1:是什么导致这些字节发生变化?
- 子问题 1.1:是某种保护机制吗?
- 子问题 1.2:它是最近推出的吗?
- 子问题 1.3:可以禁用吗?
问题 2:这些变化的字节在 DLL 的代码中代表什么?