我们可以在 ELF executable 目标文件的符号 table 中 hide/obscure 符号名称吗?

Can we hide/obscure symbol names in the symbol table of ELF executable object file?

根据this ELF specification: ELF object file contains various sections and one of them is symbol table section .symtab,其中包含所有符号(文件、函数、对象等)的信息。

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

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

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

问题(已编辑): 有什么方法可以从 execu[=31] 的符号 table 中隐藏或删除符号 "names" =] ELF 以便没有人可以看到代码并且 executable 仍然可以运行?

Is there any way by which we can hide or obscure symbol names in the symbol table of ELF so that no one can get the insight of how code is developed (without code obfuscation)?

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

如果您要发布完全linked ELF executable,运行 strip a.out 将完全删除符号 table(但 不是动态符号,由于显而易见的原因必须保留)。

如果您要发布 ELF 共享库,则需要使用 -fvisibility=hidden 或 linker 版本脚本仔细控制其公开的 API。如果你这样做,strip 将再次删除除你的 public API.

之外的所有内容

如果您要传送 relocatable ELF 对象(或存档库),那么您不能对其符号做任何事情table (再次出于明显的原因:符号 table 用于执行最终的 link)。

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

We cannot obscure them using code obfuscation as it will make it difficult to maintain.

应用代码混淆的通常方法是 只是 在您制作最终运输产品之前(即在您使用 strip 或任何其他会隐藏实现细节的方法)。在那个点应用代码混淆会使结果难以完全维护,就像任何其他隐藏实现细节的方法一样。

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

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