加载程序是否重写机器代码中的绝对地址?

Does the loader rewrite absolute addresses in machine code?

假设我有以下内容:

首选项。 0x40000 的图像基础和正在使用 ASLR 的事实。

如果我说翻译会像这样完成,我是否正确:

(OG)

0004232f 8b 45 00                     MOV          EAX,dword ptr [EBP]
00042332 a3 64 00 6C 00               MOV          [006C0064],EAX                                 
00042337 8b 45 04                     MOV          EAX,dword ptr [EBP + 0x4]

(After ASLR)

0066232f 8b 45 00                     MOV          EAX,dword ptr [EBP]
00662332 a3 64 20 72 00               MOV          [00722064],EAX                                 
00662337 8b 45 04                     MOV          EAX,dword ptr [EBP + 0x4]

还有什么我忽略的可以改变加载时的字节顺序吗?

在 32 位 Windows 中,所有 DLL 文件和许多(但不是全部)EXE 文件都有一个 so-called“基本重定位 Table” .

此 table 包含文件中包含的所有绝对地址的列表。

在您的示例中,有一个绝对地址 (0x006C0064) 存储在地址 0x00042333

table 将包含一个条目,说明在 0x00042333 处存储了一个绝对地址。

当executable文件或动态库加载到其他地址时,加载器确实会“重写”所有这些地址。

然而,“重写”是一个非常简单的操作:只需将一个固定值添加到所有这些地址即可。

请注意,这个概念与Linux和其他操作系统使用的概念完全不同。