【发布时间】:2009-02-12 08:39:42
【问题描述】:
这是this question的延续。
我正在测试是否对 .NET DLL 进行变基,NGENning 是否会在终端服务器的内存中为我提供更多共享代码。
但是,我的计划似乎有一个缺陷,就是我似乎无法找到一种工作方法来找出一组工作地址。
我认为我可以做的如下:
- 只需构建和 NGEN 一切
- 启动程序,确保所有 DLL 都已加载
- 使用LISTDLLS /R PROGRAMNAME 获取正在运行的实例的当前使用地址列表
- 使用重新映射的那些 DLL 的地址作为这些 dll 的新基地址
- UN-NGEN 一切,从 1 点开始
然而,这已经变成了Schrödinger 练习,因为重新定位某些 DLL 的行为显然会改变加载顺序或操作系统重新定位其他 DLL 的方式。
例如,假设在初始运行后,我有一个列表,说明 DLL A、B 和 C 需要位于地址 1000、2000 和 3000。没有提及 DLL D、E 和 F,它们是也是同一系统的一部分。大概这些是在它们当前的基地址加载的,否则我会假设 LISTDLLS 会告诉我这一点。
所以我改变了A、B、C的地址,重复一切,现在DLL C、D和E已经被重新定位。 A和B现在都好了,E和F现在搬家了,C还在洗牌。
我意识到这个练习有点徒劳,因为不管我在我的机器上发现了什么,在目标终端服务器上使用和注入的 DLL 可能会干扰这张图片,但我想如果我至少可以确保一些 DLL 可能位于它们规定的基地址,那么同一程序的多个实例之间的共享代码量就会增加。只是说,只是为了没有必要“提醒”我:)
由于我们所有 DLL 的原始基地址是默认值,这意味着每个 DLL(可能除了第一个加载的)都被重新定位,从而映射到页面文件,我认为上面会有一个潜在的收益0.
有什么建议吗?
【问题讨论】:
-
您指的不是海森堡,而是薛定谔(即哥本哈根解释)。不确定性描述了系统中如何存在一组有限的已知信息,哥本哈根是关于交互行为如何改变状态(非常松散)。 “变基”折叠代码波:)
-
Linux 等 ELF 系统上的预链接首先扫描系统上的每个共享库和二进制文件,然后计算最佳布局。有没有办法在 Windows 上做到这一点?