Script ghidra: como distinguir entre função e símbolo global

Sep 28 2020

Eu tenho o seguinte programa:

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;
}

Eu quero distinguir entre diferentes arrays b2 definidos nas funções foo, main e globalmente. Posso coletar todos os símbolos usando:

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

Porém, não há como distinguir entre símbolos estáticos (no namespace funcional) e globais.

A GUI do Ghidra me mostra algo como: b2.1913 <- principal, b2.1917 <- foo, b2 <- global.

Assim, posso distinguir facilmente entre esses símbolos usando GUI.

Agradecemos desde já pela sua ajuda.

Respostas

1 hairlessbear Sep 28 2020 at 04:25

O Symbolobjeto tem algumas maneiras diferentes de fazer isso. Aqui estão algumas opções.

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())

Resultado:

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)

Explicação:

  1. s.getName(true) - Inclui o namespace pai na saída (você notará que, para símbolos globais, isso não tem efeito)
  2. s.getParentSymbol().getName(), nome do pai Symbol, que será o namespace Symbolque contéms
  3. s.getParentNamespace()- retorna o Namespaceobjeto pai

Mais detalhes na documentação da API .