什么是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代码。
或者,我以错误的方式接近整个问题?
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
EDITBIN/REBASE选项很好地诀窍。而且MSDN显示它在Visual Studio 11中有EDITBIN的文档,所以我没有看到它们很快就将其删除。这很明显,他们为什么会弃用和从Windows 8 SDK中删除REBASE.EXE:它重复了EDITBIN的功能!我不确定为什么其他人会认为需要rebase是完全过时的 - - 事实并非如此。太糟糕了许多rebasing教程在线仍然指REBASE.EXE ... – 2012-04-12 00:32:00
太糟糕editbin不会生成详细的输出,如rebase.exe – deltanine 2013-09-18 00:43:06
Rebase.exe被弃用的原因是它不像以前那样有用。从Windows Vista开始,Microsoft实施了Address Space Layout Randomization,每次加载系统DLL时都会移动系统DLL,并且还可以选择用户DLL。
如果你想重新生成一个大的连续地址空间,你会感到失望。
我们的一些客户使用Windows XP,它没有ASLR。编译后的DLL不支持ASLR,因此即使在Vista/7等ASLR操作系统上也不会加载ASLR。 (我不会篡改系统DLL,它们确实存在于合理的连续空间中 - 即使在使用ASLR的Windows 7上也是如此)。 – 2012-04-11 22:03:08
@James:如果您的目标是Windows XP,一个传统/不赞成使用的操作系统,那么使用Windows SDK中的旧版/弃用工具非常合适。这就是大卫在对这个问题的评论中想要告诉你的。 – 2012-04-11 23:13:46
此评论已过时,但对于未来的访问者,@AdrianMcCarthy不正确。连续的DLL不保证连续加载。 – 2017-01-18 15:46:35
更不用说使用“REBASE.EXE -b 0x58000000 -e 0x10000的-c关闭ASLR,你可以做coffbase.txt * .dll“对一组文件进行简单地生成COFFBASE文件。
换句话说,不是因为你打算现在实际重新绑定你的文件,而是因为你想要一个精确的COFFBASE.TXT,
,这样它们每次都会/已经/将被建立一个特定且不冲突的基地址建成。
您可以继续使用rebase。它仍然有效,它不会停止工作。 – 2012-04-11 21:54:08
@DavidHeffernan:根据该自述文件,我们开始使用Windows 8 SDK时它将停止工作 - 因为它不会在那里,对吗? – 2012-04-11 21:58:50
此外,我还没有找到msdn.microsoft.com上REBASE.EXE的文档。任何链接? – 2012-04-11 22:01:33