在我的代码中,我有一个特殊的部分和一些数据:
#pragma section("dead",read,discard)
__declspec(allocate("dead"))
static const char dead_str[] = "DEAD";
doSomething(dead_str);
该部分可能会或可能不会加载该程序,但仍然是二进制图像的一部分。我想要做的是将其从图像中完全删除,以确保不会加载,因此无法在二进制文件中找到它。基本上,我想:
strings myprogram.exe | grep DEAD
没有命中。当我尝试引用字符串时,我对程序崩溃很好。
在GNU中,我会这样做:
objcopy --remove-section=dead myprogram.exe
和Cygwin的objcopy
实际上是这样做的,但会破坏可执行文件,因此无法再加载。来自MSVC的editbin.exe
只能更改该部分的标志,但它会保留在图像中。链接器优化不会删除dead_str
,因为它在doSomething()
中被引用。
是否有某种方式(理想情况下是链接器标志)我可以从PE / COFF文件中删除整个部分?
答案 0 :(得分:0)
我也在寻找一个链接器设置,但似乎这对MSVC来说根本不可能。 您可以做的是编写自己的工具来从PE文件中删除部分,或者使用CFF Explorer。