0

我有基于基于 linux 的嵌入式应用程序的项目。在这里,我有一个 ELF 文件,我想确保 OpenGrok 索引仅使用作为 ELF 文件一部分的符号,不包括项目文件的所有非相关/非编译部分。这可以通过 OpenGrok 索引实现吗?如果是这样,生成此索引的命令是什么。目前我使用以下命令为整个源生成索引.. java
-Djava.util.logging.config.file=/opengrok/etc/logging.properties
-jar /opengrok/dist/lib/opengrok.jar
-c / usr/local/bin/ctags
-s /opengrok/src -d /opengrok/data -H -P -S -G
-W /opengrok/etc/configuration.xml -U http://localhost:8080/source

4

2 回答 2

0

如果您希望仅包含/忽略特定文件(在本例中为 ELF)。您可以使用以下选项:

-I (--include) - Only files matching this pattern will be examined. Pattern supports wildcards (example: -I '*.java' -I '*.c'). Option may be repeated.
  

-i (--ignore) - Ignore matching files (prefixed with 'f:' or no prefix) or directories (prefixed with 'd:'). Pattern supports wildcards (example: -i '*.so' -i d:'test*'). Option may be repeated.
于 2021-04-26T01:51:10.757 回答
0

我不清楚项目文件的非相关/非编译部分或非链接/编译符号的确切含义,因此我将描述 ELF 文件分析在 OpenGrok 中的工作原理,您可以决定这是否适用于您的用例或如果提交新问题是有序的。

ELF 分析器经过以下 ELF 部分:

  • .debug_str
  • .comment
  • .data
  • .data1
  • .rodata
  • .rodata1

加上sh_type等于 的所有部分SHT_STRTAB。后者包含由空字节分隔的字符串。分析器从这些部分的内容中提取所有可打印字符串(使用不可打印字符作为分隔符)并将它们与空格字符连接起来。因此,所有这些部分的所有可打印字符串都会累积成单个字符串,并由插入的空格有效地标记。这些标记然后存储在索引中,因此变得可搜索。

使用这种方法,索引不仅包含程序中定义的符号,还包含程序引用的外部符号的名称(例如从动态库调用的函数),以及一些全局变量的内容(如果它们包含可打印的字符串) .

此外,当 ELF 二进制文件被剥离时,该.symtab部分将被删除,并且程序中定义的符号名称会丢失给索引器。

现在,可以以更智能的方式遍历 ELF 部分并排除外部引用(例如对动态库函数的调用),但这会阻碍最初的想法,即有一种方法来执行安全漏洞分析 - 如果它是知道哪个函数有问题,就可以搜索所有调用该函数的二进制文件,从而对安全影响有所了解。或者,可以将提取的标记拆分为引用和定义。

于 2021-05-13T19:50:21.547 回答