如何从 PE 的
.rdata
部分删除 IMAGE_DEBUG_DIRECTORY 数据?
我正在使用 MS Visual Studio 2015。我确实检查了项目属性的几乎所有编译选项。但 IMAGE_DEBUG_DIRECTORY 数据仍然存在于我的输出可执行文件中...
您可以通过设置未记录的链接器选项来完成此操作
/EMITPOGOPHASEINFO
。因此,转到链接器命令行并在其他选项中插入此字符串 (/EMITPOGOPHASEINFO
)。此选项抑制 pe 中的 pgo(Profile-Guided Optimizations)部分
另请阅读:Pogo 又名 PGO 又名配置文件引导优化 和 演练:使用配置文件引导优化
/DEBUG
链接器选项 - 因此请确保链接器命令行中没有 /DEBUG
选项。或者使用 /DEBUG:NONE /EMITPOGOPHASEINFO
组合 - 在这种情况下不得在 pe 文件中使用 IMAGE_DEBUG_DIRECTORY
从 Visual Studio 2022 版本 17.3 开始,此解决方法不再有效,因为它会生成损坏的可执行文件(
IMAGE_RESOURCE_DIRECTORY
条目无效,Windows 资源管理器和资源操作工具都无法找到 .rsrc
部分,即使它仍然存在于文件中) .
解决方法是使用 Explorer Suite 中的 CFF Exlporer。尽管声称它是版本 III,但它实际上是版本 VIII,只有独立的 CFF Explorer 比套件中捆绑的版本旧。
安装套件后,删除
IMAGE_DEBUG_DIRECTORY
非常简单。
右键单击可执行文件,从上下文菜单中选择使用 CFF Explorer 打开
重要提示: 确保在替换原始可执行文件之前彻底测试新的可执行文件。
/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 中的任何其他常量数据(例如字符串)错误是隐藏的