2016-05-31 74 views
1

节在我的代码,我在这一个特殊的部分和一些数据:MSVC删除二进制

#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

我也在寻找一个链接器设置,但是看起来这对于MSVC来说是完全不可能的。 你可以做的是编写你自己的工具去除PE文件中的部分,或者使用CFF资源管理器。