【发布时间】:2014-09-18 18:29:17
【问题描述】:
我有一个 Linux 应用程序,它在运行时加载非常小的(一些小功能)共享库。由于各种重要原因™,我需要将共享库加载到某个虚拟内存范围中。但是,dlopen() 没有提供任何方法(我可以看到)告诉它或提示它将加载的内容放在哪里。
有没有办法告诉dlopen() 应该把它加载的库放在哪里?
dlopen() 是否有其他替代方案可以提供该功能?
【问题讨论】:
-
我不这么认为,如果有的话,将对用户模式应用程序产生巨大的安全影响。假设有这样一个函数,你将如何调用库中特定内存位置的函数?
-
你应该解释你想要这个的原因。真正的动机和总体目标是什么?看起来像XY problem。而且我没有看到任何替代方案(除了自己重新实现 dlopen )。顺便说一句,在 Linux 上,您可以在同一个进程中打开数十万个共享对象。
-
@ElliottFrisch “巨大的安全隐患”是什么(假设设计是理智的,检查了调用者尚未使用地址空间)?
mmap允许调用者指定所需的地址,这不会造成任何灾难。 Windows 允许共享库指定自己的首选基地址(不保证),而不会产生“大量安全隐患”(Windows 偏好在每个进程中将所有 DLL 加载到相同地址,但这样操作系统可以保存内存,而不是因为 DLL 可以有首选的图像库)。 -
如果攻击者可以覆盖你的记忆,他们就已经赢了。在特定地址加载库不会产生任何重大影响。是的,它使事情变得一点更容易,但我不会称之为“大规模”。我会为允许内存覆盖的问题保留该标签。
-
好吧,如果真正的问题是,例如隐藏现有库或覆盖现有函数 - 除了在现有代码之上加载库之外,还有其他方法可以做到这一点。