【问题标题】:What's the replacement for REBASE.EXE?REBASE.EXE 的替代品是什么?
【发布时间】:2012-04-24 06:18:37
【问题描述】:

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

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

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

不幸的是...Windows Software Development Kit (SDK) for Windows 8 Consumer Preview 说:

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

ReBase.exe

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

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

【问题讨论】:

  • 你可以继续使用rebase。它仍然有效,并且不会停止工作。
  • @DavidHeffernan:根据那个自述文件,我们开始使用 Windows 8 SDK 的那一刻,它就会停止工作——因为它不会在那里,对吗?
  • 另外,我无法在 msdn.microsoft.com 上找到 REBASE.EXE 的文档。有链接吗?
  • 你已经有了 rebase.exe。您可以在 Windows 8 上运行的 DLL 上使用它。
  • 太糟糕了,没有像 REBASE.EXE 这样的详细输出

标签: windows visual-c++ dll rebase winapi


【解决方案1】:

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:#[.#]

正如 Mark 指出的那样,您需要关闭 ASLR,您可以使用 /DYNAMICBASE:no 来完成此操作

【讨论】:

  • EDITBIN /REBASE 选项可以很好地解决问题。 MSDN 显示它在 Visual Studio 11 中有 EDITBIN 的文档,所以我看他们不会很快删除它。很明显他们为什么要从 Windows 8 SDK 中弃用和删除 REBASE.EXE:它复制了 EDITBIN 的功能!我不确定为什么其他人认为 rebase 的需要已经完全过时了...... - 它不是。可惜网上很多rebase教程还是参考REBASE.EXE...
  • 太糟糕了 editbin 不会像 rebase.exe 那样生成详细的输出
【解决方案2】:

不推荐使用 Rebase.exe 的原因是它不像以前那样有用。从 Windows Vista 开始,Microsoft 实现了 Address Space Layout Randomization,它在您每次加载系统 DLL 时移动它们,并且还可以选择移动用户 DLL。

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

【讨论】:

  • 我们的一些客户使用没有 ASLR 的 Windows XP。编译后的 DLL 也不支持 ASLR,因此即使在 Vista/7 等 ASLR 操作系统上,它们也不会使用 ASLR 加载。 (我没有篡改系统 DLL,它们确实位于合理连续的空间中 - 即使在带有 ASLR 的 Windows 7 上也是如此)。
  • @James:如果您的目标是 Windows XP,一个旧版/已弃用的操作系统,那么使用 Windows SDK 中的旧版/已弃用工具非常有意义。这就是大卫试图在问题的 cmets 中告诉你的。
  • 这条评论很老了,但对于未来的访客,@AdrianMcCarthy 是不正确的。不保证连续加载基于连续的 DLL。
  • @MikeCaron 我刚刚看到blog entry by Raymond Chen 就是这么说的,这就是促使您发表评论的原因吗?
  • @MikeCaron:是的,我刚刚也看到了 Raymond Chen 最近的帖子。我将删除我的旧评论,以免混淆任何人。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2019-02-22
    • 2011-05-07
    • 2019-12-03
    • 2010-09-17
    • 2012-03-27
    • 2012-09-30
    • 2010-10-20
    • 2014-03-12
    • 1970-01-01
    相关资源
    最近更新 更多