根据this ELF规范:ELF对象文件包含各种sections,其中一个是symbol table section .symtab
,其中包含所有符号(文件,函数,对象)的信息等等)。
ELF包含符号表中每个符号的名称,属性标志,类型,值和绑定等信息。
文件,函数或对象(数组,变量,字符串)等对象的名称实际上暴露了代码的内部信息。这样,任何人都可以分析ELF(使用strings
,objdump
或readelf
工具)并查看此信息,并了解应该保密的代码内部事物。
为了便于阅读和维护,我们编写了开发人员可以理解的代码。因此,我们需要继续使用正确的文件名和变量名等。我们不能使用code obfuscation来掩盖它们,因为它会使维护变得困难。
问题(编辑):我们有什么方法可以隐藏或删除符号"名称"从可执行ELF的符号表,以便没有人可以获得代码的洞察力,可执行文件仍在运行?
答案 0 :(得分:4)
有没有办法可以隐藏或隐藏ELF符号表中的符号名称,这样就没有人能够深入了解代码是如何开发的(没有代码混淆)?
取决于您向最终用户发送的ELF文件的种。
如果您要发送完全链接的ELF可执行文件,则运行strip a.out
将完全删除符号表(但不动态符号,必须保留为显而易见的原因)。
如果您要发送ELF共享库,则需要使用-fvisibility=hidden
或链接器版本脚本仔细控制其公开的API。如果您这样做,strip
将再次删除除公共API之外的所有内容。
如果您要发送可重定位的ELF对象(或归档库),那么无法对其符号表执行任何操作(再次出于显而易见的原因:符号表用于执行最终链路)。
最后,您的问题似乎取决于误解:
我们不能使用代码混淆来掩盖它们,因为它会使维护变得困难。
应用代码混淆的常用方法是在制作最终送货产品之前 (即与您使用strip
的完全相同的点,或任何其他隐藏的方法)实施细节)。在那时应用代码混淆 将使得完全中的结果难以与隐藏实现细节的任何其他方法相同。
值得注意的是,您不(通常)将混淆应用于开发和维护下的代码(即您的开发版本仍未被混淆)。
答案 1 :(得分:0)
是的,有可能。您可以使用strip
删除静态库符号,也可以通过自己加载库而不是让操作系统自动执行此操作来删除动态库符号。