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:
s.getName(true)- Inclui o namespace pai na saída (você notará que, para símbolos globais, isso não tem efeito)s.getParentSymbol().getName(), nome do paiSymbol, que será o namespaceSymbolque contémss.getParentNamespace()- retorna oNamespaceobjeto pai
Mais detalhes na documentação da API .
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas