这是this question的延续。
我正在测试是否重新定义.NET DLL,并且NGENning它们将在终端服务器的内存中为我提供更多的共享代码。
然而,我的计划似乎有一个缺陷,而且我似乎无法找到一种工作方法来找出一组有用的地址。
我认为我能做的事情如下:
但是,这已经转变为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
有什么建议吗?
答案 0 :(得分:1)
您可以使用DUMPBIN(在Visual Studio中)找到DLL首选加载地址和内存范围,并根据这些数字进行规划。
dumpbin / headers会给你:
7DC90000 image base (7DC90000 to 7DD5FFFF)
如果按照首选加载地址进行规划,则应该没有问题。