如果我想重新定义我的DLL,我该怎么做呢?

时间:2009-02-12 08:39:43

标签: .net dll rebasing

这是this question的延续。

我正在测试是否重新定义.NET DLL,并且NGENning它们将在终端服务器的内存中为我提供更多的共享代码。

然而,我的计划似乎有一个缺陷,而且我似乎无法找到一种工作方法来找出一组有用的地址。

我认为我能做的事情如下:

  1. 建立和NGEN一切
  2. 启动程序,确保已加载所有DLL
  3. 使用LISTDLLS / R PROGRAMNAME获取正在运行的实例的当前正在使用的地址列表
  4. 使用已重新映射的DLL的地址作为这些dll的新基址
  5. UN-NGEN一切,然后从1
  6. 开始

    但是,这已经转变为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

    有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您可以使用DUMPBIN(在Visual Studio中)找到DLL首选加载地址和内存范围,并根据这些数字进行规划。

dumpbin / headers会给你:

 7DC90000 image base (7DC90000 to 7DD5FFFF)

如果按照首选加载地址进行规划,则应该没有问题。