什么是REBASE.EXE的替代品?

什么是REBASE.EXE的替代品?

问题描述:

我需要重新绑定与我的程序一起安装的DLL文件组,因为它是32位程序,而且地址空间现在太碎了。另外还有一个问题,即需要在整个冷启动时将页面分页到RAM中,以便由于与某些DLL的基地址冲突,加载程序可以重新绑定它们。有些DLL是我们编译的DLL;其他人来自第三方。什么是REBASE.EXE的替代品?

我想要做的是有一个工具重新绑定给定的一组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附带的工具,而不是引入第三方工具和/或编写自己的rebase代码。

或者,我以错误的方式接近整个问题?

+1

您可以继续使用rebase。它仍然有效,它不会停止工作。 – 2012-04-11 21:54:08

+0

@DavidHeffernan:根据该自述文件,我们开始使用Windows 8 SDK时它将停止工作 - 因为它不会在那里,对吗? – 2012-04-11 21:58:50

+1

此外,我还没有找到msdn.microsoft.com上REBASE.EXE的文档。任何链接? – 2012-04-11 22:01:33

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

正如马克指出,你会希望使用/DYNAMICBASE:no

+2

EDITBIN/REBASE选项很好地诀窍。而且MSDN显示它在Visual Studio 11中有EDITBIN的文档,所以我没有看到它们很快就将其删除。这很明显,他们为什么会弃用和从Windows 8 SDK中删除REBASE.EXE:它重复了EDITBIN的功能!我不确定为什么其他人会认为需要rebase是完全过时的 - - 事实并非如此。太糟糕了许多rebasing教程在线仍然指REBASE.EXE ... – 2012-04-12 00:32:00

+2

太糟糕editbin不会生成详细的输出,如rebase.exe – deltanine 2013-09-18 00:43:06

Rebase.exe被弃用的原因是它不像以前那样有用。从Windows Vista开始,Microsoft实施了Address Space Layout Randomization,每次加载系统DLL时都会移动系统DLL,并且还可以选择用户DLL。

如果你想重新生成一个大的连续地址空间,你会感到失望。

+1

我们的一些客户使用Windows XP,它没有ASLR。编译后的DLL不支持ASLR,因此即使在Vista/7等ASLR操作系统上也不会加载ASLR。 (我不会篡改系统DLL,它们确实存在于合理的连续空间中 - 即使在使用ASLR的Windows 7上也是如此)。 – 2012-04-11 22:03:08

+2

@James:如果您的目标是Windows XP,一个传统/不赞成使用的操作系统,那么使用Windows SDK中的旧版/弃用工具非常合适。这就是大卫在对这个问题的评论中想要告诉你的。 – 2012-04-11 23:13:46

+3

此评论已过时,但对于未来的访问者,@AdrianMcCarthy不正确。连续的DLL不保证连续加载。 – 2017-01-18 15:46:35

更不用说使用“REBASE.EXE -b 0x58000000 -e 0x10000的-c关闭ASLR,你可以做coffbase.txt * .dll“对一组文件进行简单地生成COFFBASE文件。
换句话说,不是因为你打算现在实际重新绑定你的文件,而是因为你想要一个精确的COFFBASE.TXT,
,这样它们每次都会/已经/将被建立一个特定且不冲突的基地址建成。