重启后 MS Windows 系统库有哪些变化?

逆向工程 视窗 dll
2021-06-23 06:51:00

我正在运行安装了所有更新的 64 位 MS Windows 7。约1周或2周前,我已经注意到,每当我重新启动操作系统,虚拟内存页面(无论过程),对应的系统库,例如ntdll.dllkernel32.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 的代码中代表什么?

2个回答

问题 1:是什么导致这些字节发生变化?

这些似乎是基于 DLL 的重定位表应用的标准重定位修正

子问题 1.1:是某种保护机制吗?

不。

子问题 1.2:它是最近推出的吗?

不。

子问题 1.3:可以禁用吗?

不容易,不。

问题 2:这些变化的字节在 DLL 的代码中代表什么?

地址。

您看到的是修改后的偏移量以反映更改的基地址。如果图像基础发生变化,任何与基础无关的东西(无论是全局变量还是调用或其他)都需要进行调整。

PE 文件可以有一个重定位表。可以,因为在标准的 .exe 文件中通常没有它,因为在 ASLR(模块的随机基址)出现之前它是没有必要的。

对于 DLL,基地址可能会更改,因为它取决于已加载的其他文件,因此它们几乎总是有一个基重定位表,上面写着“如果基地址与 XYZ 不同,请将增量添加到以下位置”。

如果您对基重定位表的外观感到好奇,我建议您查看以下内容: