10

我需要重新设置与我的程序一起安装的 DLL 文件组,因为它是一个 32 位程序,并且地址空间现在太碎片化了。还有一个问题是,由于与某些 DLL 的基地址冲突,整个 DLL 在冷启动时被请求分页到 RAM 中,以便加载程序可以重新设置它们的基址。一些 DLL 是我们编译的;其他人来自第 3 方。

我想要做的是有一个工具 rebase 给定的一组 DLL,以便这组 DLL 占用一个连续的内存块。然后,该工具将在安装程序编译之前运行,并且重新定位的 DLL 将安装在应用程序的私有目录中。

据我了解,Windows SDK 中包含的 REBASE.EXE 工具正是这样做的。给它一些 DLL,它会重新定义它们。

不幸的是... Windows 8 Consumer Preview 的 Windows 软件开发工具包 (SDK)说:

工具许多过时或不推荐使用的工具已从 Windows SDK 中删除。以下工具已被删除:

<snip> ReBase.exe

现在怎么办?我不想开始使用显然已经过时并且将在下一版本的 Windows 中消失的工具。假设我没看错,使用 ReBase.exe 的替代品是什么?我想限制自己使用 Windows SDK 和/或 Visual Studio 附带的工具,而不是引入 3rd-party 工具和/或编写我自己的 rebase 代码。

或者,我是否以错误的方式处理整个问题?

4

3 回答 3

11

editbin.exe带有 VS2010 并具有 /REBASE 选项。

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>editbin
Microsoft (R) COFF/PE Editor Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

usage: EDITBIN [options] [files]

   options:

      /ALLOWBIND[:NO]
      /ALLOWISOLATION[:NO]
      /BIND[:PATH=path]
      /DYNAMICBASE[:NO]
      /ERRORREPORT:{NONE|PROMPT|QUEUE|SEND}
      /HEAP:reserve[,commit]
      /LARGEADDRESSAWARE[:NO]
      /NOLOGO
      /NXCOMPAT[:NO]
      /REBASE[:[BASE=address][,BASEFILE][,DOWN]]
      /RELEASE
      /SECTION:name[=newname][,[[!]{CDEIKOMPRSUW}][A{1248PTSX}]]
      /STACK:reserve[,commit]
      /SUBSYSTEM:{BOOT_APPLICATION|CONSOLE|EFI_APPLICATION|
                  EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER|
                  NATIVE|POSIX|WINDOWS|WINDOWSCE}[,#[.##]]
      /SWAPRUN:{[!]CD|[!]NET}
      /TSAWARE[:NO]
      /VERSION:#[.#]

正如马克指出的那样,您需要关闭 ASLR,您可以使用/DYNAMICBASE:no

于 2012-04-11T22:01:14.823 回答
3

不推荐使用 Rebase.exe 的原因是它不像以前那样有用。从 Windows Vista 开始,Microsoft 实现了地址空间布局随机化,每次加载它们时都会移动系统 DLL,并且还可以选择移动用户 DLL。

如果你指望变基来生成一个大的连续地址空间,你会失望的。

于 2012-04-11T22:00:19.283 回答
3

更不用说对一组文件使用“REBASE.EXE -b 0x58000000 -e 0x10000 -c coffbase.txt *.dll”,只是为了生成COFFBASE文件。
换句话说,不是因为您现在打算实际重新设置文件的基址,而是因为您想要一个准确的 COFFBASE.TXT,
以便每次构建它们时/已经/使用特定且不冲突的基地址构建它们。

于 2012-10-18T21:23:11.070 回答