【问题标题】:How do I hide C++ RTTI symbols?如何隐藏 C++ RTTI 符号?
【发布时间】:2017-02-25 02:36:21
【问题描述】:

是否有一些简单/可重复的方法来打乱 RTTI 符号?

一些已经做过的事情:

  • 静态构建——显然,这很有帮助,因为库之间会内联,并且没有像动态库那样干净的界面。我们希望在任何情况下都这样做 b/c 库跨平台工作,这使得部署更加容易(只有一个胖库文件)

  • 使用“strip”——至少在 Linux 上(不确定是否有 Windows 等价物!)这将删除大部分漂浮在周围的符号

但是,如果我在库上运行“字符串”,我仍然可以看到人类可读的符号!经过一番调查,这似乎是由于 RTTI。所有现有的编译器似乎只使用函数/类/等。签名以在代码中生成 RTTI 比较值。这种有效的源代码泄漏到二进制文件中,让好奇的用户深入了解我们的秘密武器以及我们如何制作它。

注意:

  • 我们无法使用 -fno-rtti b/c 构建我们使用的静态链接库在内部使用 RTTI。我认为我正在寻找的是可以在编译后的可执行文件上工作的东西,而不是作为构建过程的一部分

  • 我已经尝试寻找可以做到这一点的商业产品 - 但没有人将其列在他们的功能列表中。许多产品似乎质量有问题或处于某种半废弃状态。大多数人似乎都专注于打乱代码并进行各种复杂的转换,这些转换会损害性能并且对我们来说并不是超级关键。

  • 手动打乱我们使用的所有库中的所有符号就可以了。但这似乎是可维护性的噩梦...

【问题讨论】:

    标签: c++ gcc linker clang obfuscation


    【解决方案1】:

    一个简单的解决方案是使用一大堆定义来构建您想要隐藏的每个名称。使用-DCFoo=a_1 -DCBar=a_2 编译,您的类CfooCBar 从RTTI 和其他符号表中消失。

    【讨论】:

    • 感谢您的建议。以某种自动化方式对所有剩余符号执行此操作似乎有点挑战。也许有人会有更简单的解决方案:)
    【解决方案2】:

    您可以尝试使用 C++ 混淆器。如果你谷歌很多弹出窗口。

    【讨论】:

    • 正如我在问题中所说:我试图找到可以做到这一点的商业产品 - 但没有人在他们的功能列表中列出它。许多产品似乎质量有问题或处于半废弃状态。大多数人似乎都专注于打乱代码并进行各种复杂的转换,这些转换会损害性能并且对我们来说并不是超级关键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2012-01-15
    • 2020-08-22
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2012-09-07
    相关资源
    最近更新 更多