从 .rdata 部分删除 IMAGE_DEBUG_DIRECTORY

问题描述 投票:0回答:2

如何从 PE 的

.rdata
部分删除 IMAGE_DEBUG_DIRECTORY 数据?

我正在使用 MS Visual Studio 2015。我确实检查了项目属性的几乎所有编译选项。但 IMAGE_DEBUG_DIRECTORY 数据仍然存在于我的输出可执行文件中...

c++ visual-c++ portable-executable
2个回答
9
投票

您可以通过设置未记录的链接器选项来完成此操作

/EMITPOGOPHASEINFO
。因此,转到链接器命令行并在其他选项中插入此字符串 (
/EMITPOGOPHASEINFO
)。此选项抑制 pe 中的 pgo(Profile-Guided Optimizations)部分

另请阅读:Pogo 又名 PGO 又名配置文件引导优化演练:使用配置文件引导优化

当然,您不能生成调试信息 - 使用

/DEBUG
链接器选项 - 因此请确保链接器命令行中没有
/DEBUG
选项。或者使用
/DEBUG:NONE /EMITPOGOPHASEINFO
组合 - 在这种情况下不得在 pe 文件中使用
IMAGE_DEBUG_DIRECTORY


-1
投票

从 Visual Studio 2022 版本 17.3 开始,此解决方法不再有效,因为它会生成损坏的可执行文件(

IMAGE_RESOURCE_DIRECTORY
条目无效,Windows 资源管理器和资源操作工具都无法找到
.rsrc
部分,即使它仍然存在于文件中) .

解决方法是使用 Explorer Suite 中的 CFF Exlporer。尽管声称它是版本 III,但它实际上是版本 VIII,只有独立的 CFF Explorer 比套件中捆绑的版本旧。

安装套件后,删除

IMAGE_DEBUG_DIRECTORY
非常简单。

  • 右键单击可执行文件,从上下文菜单中选择使用 CFF Explorer 打开

  • 单击左侧窗格中的数据目录

  • 右键单击调试目录 RVA,然后选择删除调试目录

  • 单击“文件”,然后单击“另存为...”并以新名称保存

重要提示: 确保在替换原始可执行文件之前彻底测试新的可执行文件。


所有这些与

/EMITPOGOPHASEINFO

IMAGE_RESOURCE_DIRECTORY
 等无关,但对于新的 
IMAGE_LOAD_CONFIG_DIRECTORY.VolatileMetadataPointer
 和另一个未记录的链接器选项 - 
/emitvolatilemetadata[:no]
还看
\VC\Tools\MSVC\<version>\crt\src\vcruntime\loadcfg.c
对于 
_CRT_ENABLE_VOLATILE_METADATA
__volatile_metadata

/emitvolatilemetadata

(默认情况下)链接器生成 
__volatile_metadata
 符号 ( 
<linker-defined>
 ) 并将其放入 
.rdata$voltmd 部分。但链接假设 .rdata 已经存在。如果这是真的(通常是的,真的)一切都好。但如果 .rdata 中没有其他符号(__volatile_metadata
 是单个符号)链接器会忘记增量节计数。 
NumberOfSections
 值变得错误(实际节数为 -1)。结果,PE 中的最后一部分“丢失”(它存在,但由于错误的 
NumberOfSections
 值而不可见)。

如果我们设置

/emitvolatilemetadata:no

 选项 - 在这种情况下一切都可以。 
__volatile_metadata
 现在变成了 
0000000000000000 <absolute>
(不在 
.rdata 部分)

/EMITPOGOPHASEINFO

与此处有何关联?如果没有此选项,
.rdata中会存在其他一些符号,因此错误会被隐藏。与 PE 中的任何其他常量数据(例如字符串)错误是隐藏的

© www.soinside.com 2019 - 2024. All rights reserved.