ghidra 脚本:如何区分函数和全局符号

逆向工程 吉德拉
2021-06-22 19:40:33

我有以下程序:

int b2[4];
int foo()
{
  static int b2[10];
  b2[5] = 4;
}
int main()
{
  static int b2[10];
  int b[5];
  b[0] = 1;
  b2[9] = 4;
  int *ptr = b;
  int c = *(ptr + 10);
  foo();
  return 0;
}

我想区分函数 foo、main 和 global 中定义的不同 b2 数组。我可以使用以下方法收集所有符号:

symbols = set(currentProgram.getSymbolTable().getAllSymbols(True))
    for s in symbols:
        print(s.getName())

但是,没有办法区分静态(在函数命名空间中)和全局符号。

Ghidra GUI 向我展示了类似的东西:b2.1913 <- main , b2.1917 <- foo, b2 <- global。

因此,我可以使用 GUI 轻松区分这些符号。

在此先感谢您的帮助。

1个回答

Symbol对象有几种不同的方法可以解决这个问题。这里有几个选项。

symbols = set(currentProgram.getSymbolTable().getAllSymbols(True))
for s in symbols:
    if s.getName() == "b2":
        print(s.getName(), s.getName(True), s.getParentSymbol().getName(), s.getParentNamespace())

输出:

GetSymbolType.py> Running...
(u'b2', u'b2', u'global', Global)
(u'b2', u'foo()::b2', u'foo()', foo())
(u'b2', u'main::b2', u'main', main)

解释:

  1. s.getName(true) - 在输出中包含父命名空间(您会注意到,对于全局符号,这不起作用)
  2. s.getParentSymbol().getName(), 父级的名称Symbol,这将是Symbol包含的命名空间s
  3. s.getParentNamespace()- 返回父Namespace对象

API 文档中的更多详细信息