4

我知道由于共享库不知道动态加载器将它们放置在哪里,它们必须依靠 GOT 来解析对全局数据的所有引用。例如,一个共享库有一个名为 的全局变量globe,访问该变量的可能方法是这样的mov eax,DWORD PTR [ecx-0x10],假设它ecx包含 GOT 的地址和 is 的偏移globe0x10。现在,假设进程 A 使用此共享库,紧随其后的是进程 B。我知道共享库的代码可以在进程之间共享,但数据不能,因为每个进程都可能根据其执行情况更改数据。因此,每个进程都会得到它自己的 GOT,这意味着,多亏了虚拟内存,地址ecx + 0x10将指向完全两个不同的 GOT,具体取决于运行该代码的进程。0x10但是然后说其中一个进程在其 GOT中的偏移量处加载具有不同全局数据成员的第二个共享库。如果两个库都在同一个虚拟地址,那么使用这两个库的进程如何访问每个库的全局数据?

4

1 回答 1

0

但是然后说其中一个进程在其 GOT 中的偏移量 0x10 处加载了具有不同全局数据成员的第二个共享库。如果两个库都在同一个虚拟地址,那么使用这两个库的进程如何访问每个库的全局数据?

答案分为三个部分:

  1. 每个库如何访问自己的全局变量?
  2. 每个库如何访问其他库的全局变量?
  3. 主要可执行文件如何从任一库访问全局变量?

理解这一点的最好方法是编译两个普通库和一个主二进制文件,然后检查各个GOT部分并观察它们何时以及以何种方式发生变化。

你的困惑的根源似乎是假设只有一个GOT。情况并非如此:每个库都有自己的.got部分,编译器和运行时加载器会将其排列为ecx指向正确的.got.

对于主可执行文件,答案是“复制重定位”。

这是一篇关于这个主题的好文章

于 2019-02-27T04:27:36.597 回答