假设我正在编写一些C++程序,我不希望该程序如何工作的二进制泄漏信息。我知道我们可能会从二进制文件中删除符号,但是类名仍然可以通过RTTI信息存储和检索。那我怎么才能避免呢?如果我需要禁用RTTI,哪些C++功能将不再可用?
发布于 2014-04-26 00:01:40
禁用RTTI时所丢失的内容取决于编译器(和编译器版本)。
gcc 4.5,你可以读到:
- for禁止生成每个具有虚拟函数的类的信息,供C++运行时类型标识功能(dynamic_cast‘和type’)使用。如果您不使用该语言的这些部分,则可以使用此标志节省一些空间。注意,异常处理使用相同的信息,但它将根据需要生成它。`dynamic_cast的运算符仍然可以用于不需要运行时类型信息的强制转换,即转换为无效*或明确的基类。
用于2013:
如果编译器无法静态解析代码中的对象类型,请使用/GR。当代码使用/GR运算符或typeid时,通常需要dynamic_cast选项。但是,/GR会增加图像的.rdata部分的大小。如果您的代码不使用dynamic_cast或typeid,/GR-可能会生成一个较小的映像。
因此,实际上,在这些情况下,它只禁用dynamic_cast和typeid。
但是,如果目标是隐藏有关可执行文件的行为和一些信息,我不认为strip和禁用RTTI是最好的解决方案。这可能是一个好的开始,但要有真正的二进制保护,您必须看到封隔器/可执行保护/混淆工具(compression)。
https://stackoverflow.com/questions/23304820
复制相似问题