【问题标题】:Remove C++ class names from binary dll file从二进制 dll 文件中删除 C++ 类名
【发布时间】:2013-01-29 22:46:07
【问题描述】:

我在 Visual Studio 2010 下有一个 C++ 项目,它编译成 dll。我在我的项目中定义了几个专用于实现的私有类,例如CMyClass。此类不是从 dll 或任何接口函数导出的。但是,当我检查生成的 dll 文件时,其中存储了一个字符串“CMyClass”。这是一个发布版本,我不希望这个字符串出现在 dll 文件中。此 dll 已交付给客户,我希望将我在项目中使用的所有名称从 dll 文件中删除,因此没有人可以简单地了解我们在 dll 中使用的算法。

我使用发布配置。在项目属性中,链接器选项卡下的“生成调试信息”选项被关闭,C/C++选项卡下的“调试信息格式”设置为“程序数据库(/Zi)”。我尝试为“调试信息格式”设置空字符串,但没有成功。

在 dll 中找到的字符串看起来像 .?AVCMyClass@@,并且位于 dll 文件的最后。它是 dll 文件中唯一出现的“CMyClass”字符串。但是,我几乎所有的内部类都显示了这个字符串。

如何摆脱这些提及?

更新

请注意,我不想混淆源代码本身。提供的链接无关紧要。我只是看不出为什么类名存储在 dll 文件中。我总是可以在构建之前重命名我的类,但这不是很直接的解决方案。

更新2

我不同意社区关闭这个问题,因为这不是重复的。 Tyler Gill 在 cmets 中给出了答案。感谢他,也为别人感到羞耻。

【问题讨论】:

  • "我不希望这个字符串出现在 dll 文件中" 你认为类名被隐藏的确切原因是什么。编译 C++ 代码本身就足够令人困惑!
  • @Ram 因为类的名称对应于我们用来解决问题的算法的名称。我们不希望任何人知道我们使用什么算法。
  • 您正在编译的文件是否启用了 RTTI?它创建存储类型信息的对象并将它们添加到二进制文件中,它具有的属性之一是类型的名称。除此之外,似乎混淆是您想要的方式。如果编译器将类名放入二进制文件中,那么它这样做是有原因的。但是您应该能够使用混淆工具为您重命名内部类。
  • @TylerGill 您的猜测实际上是一个答案。如果我使用 /GR- 开关禁用 RTTI,则名称不再出现在 dll 文件中。见msdn.microsoft.com/en-us/library/we6hfdy0(v=vs.100).aspx如果你愿意,你可以发布一个答案,我会投票+接受它:)

标签: c++ visual-studio-2010 dll linker obfuscation


【解决方案1】:

由于我从评论中的猜测似乎是正确的,因此我将其重新发布为答案。

类名的字符串是为已编译的二进制文件启用 RTTI(运行时类型信息)的结果。启用 RTTI 后,编译器会创建对象,这些对象存储有关编译到二进制文件中的类型的信息,其中一个属性是类型的名称。

请注意,dynamic_casttypeid 的某些用途需要 RTTI,因此禁用会导致您失去 C++ 的这些功能。

要在 Visual Studio 中禁用 RTTI,请使用 /GR- 开关(请参阅 http://msdn.microsoft.com/en-us/library/we6hfdy0(v=vs.100).aspx,如 Mikhail 发布的那样。)

要在 GCC 中禁用它,请使用 -fno-rtti 开关。

【讨论】:

  • 做了同样的事情,它只对部分类名有效。对于其他人来说,RTTI 还不够。显然,当使用带有虚函数的“std::bind”时——即使禁用了 RTTI,类名也可能出现在二进制文件中。根本不要使用 std::bind (或相关函数)
【解决方案2】:

正如 cmets 中提到的Tyler Gill,由于CMyClass 实际上继承了IMyClass 并且是多态的,因此该字符串由编译器留下,因为RTTI。我的问题可以通过disabling RTTI/GR- 开关轻松解决。谢谢。

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 2014-11-26
    • 2012-06-11
    • 2012-01-18
    • 1970-01-01
    • 2011-09-20
    • 2020-06-21
    • 2023-04-04
    相关资源
    最近更新 更多