【问题标题】:Can we hide/obscure symbol names in the symbol table of ELF executable object file?我们可以在 ELF 可执行目标文件的符号表中隐藏/隐藏符号名称吗?
【发布时间】:2016-08-19 11:07:09
【问题描述】:

根据this ELF 规范:ELF 对象文件包含各种sections,其中之一是symbol table section .symtab,其中包含所有符号(文件、函数、对象等)的信息。

ELF 包含符号表中每个符号的名称、属性标志、类型、值和绑定等信息。

文件、函数或对象(数组、变量、字符串)等对象的名称实际上暴露了代码的内部信息。这样,任何人都可以分析 ELF(使用 stringsobjdumpreadelf 工具)并查看此信息并了解代码内部应该保密的内容。

为了可读性和可维护性,我们编写了开发人员可以理解的代码。因此,我们需要继续使用正确的文件名和变量名等。我们不能使用code obfuscation 来掩盖它们,因为这会使其难以维护。

问题(已编辑): 有什么方法可以隐藏或删除可执行 ELF 的符号表中的符号“名称”,这样就没有人可以了解代码和可执行文件还在营业吗?

【问题讨论】:

  • 晦涩的符号表是什么意思?一旦elf文件是具有完全解析符号的完全可执行文件,符号表(虽然不是动态的)就没有用了,我不确定你所说的“混淆”是什么意思 - 使其免受RE和代码分析并保持代码完全可执行?
  • @DrPrItay 是的,隐藏或删除这些符号的“名称”(文本字符串)并使其仍然可执行。是否可以去掉符号的名称?

标签: unix elf object-files symbol-table


【解决方案1】:

有没有什么方法可以隐藏或隐藏 ELF 符号表中的符号名称,从而使任何人都无法了解代码是如何开发的(无需代码混淆)?

取决于您发送给最终用户的 ELF 文件的种类

如果您要发布完全链接的 ELF 可执行文件,运行 strip a.out 将完全删除符号表(但不是动态符号,出于显而易见的原因必须保留)。

如果您要发布 ELF 共享库,则需要使用 -fvisibility=hidden 或链接器版本脚本仔细控制其公开的 API。如果您这样做了,strip 将再次删除除您的公共 API 之外的所有内容。

如果您正在运送一个可重定位的 ELF 对象(或存档库),那么您不能对其符号表做任何事情(同样原因很明显:符号表用于执行最终的链接)。

最后,您的问题似乎是基于误解

我们不能使用代码混淆来掩盖它们,因为它会使其难以维护。

应用代码混淆的通常方法是在您制作最终发货产品之前(即在您使用 strip 或任何其他隐藏实现细节的方法的完全相同的位置) )。应用代码混淆此时将使结果难以以与任何其他隐藏实现细节的方法相同的方式完全维护。

值得注意的是,您(通常)对正在开发和维护的代码应用混淆(即您的开发版本保持未混淆)。

【讨论】:

  • 'strip' 命令适用于可执行的 ELF,正如您所建议的那样。感谢您提供详细的答案和有见地的信息。
  • @ZeeshanMahmood,你所说的“脱衣舞作品”是什么意思?在strip 之后,nm 不显示符号,但是 readelf 仍然有很多信息。
  • @Demi-Lune 如果你问一个关于stripreadelf 的单独问题,我可以回答。很有可能,您正在通过动态符号表导出有问题的符号,nm -D显示此符号。
【解决方案2】:

是的,这是可能的。您可以使用strip 删除静态库符号,也可以通过自己加载库来删除动态库符号,而不是让操作系统自动执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2012-07-06
    • 2012-01-12
    相关资源
    最近更新 更多