首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ghidra:如何使用ghidra python api获取静态变量?

ghidra:如何使用ghidra python api获取静态变量?
EN

Stack Overflow用户
提问于 2019-08-01 08:23:39
回答 1查看 1.7K关注 0票数 1

我有一个下面的c代码(来自基准测试):

代码语言:javascript
复制
int main(int argc, char *argv[])
{
  static   char buf[10] = "";


  /*  OK  */
  buf[9] = 'A';


  return 0;
}

我使用ghidra api从二进制文件中获取一些信息(使用标志-g预编译)。我想要获取函数中定义的变量(或全局变量)。

代码语言:javascript
复制
function.getStackFrame().getStackVariables()

给出了在函数中定义的变量,但它没有检测到buf,因为它被定义为static。从ghidra gui中,我可以看到变量是在名称空间下的"main“中定义的。

有没有办法获得这些类型的变量(或者一般的全局变量)?

EN

回答 1

Stack Overflow用户

发布于 2020-06-08 11:45:04

如果使用gcc编译,则在函数中定义的静态变量(例如,在本例中为变量buf )将表示为全局变量,该变量以相同的名称开头,以编译器分配的数字后缀结束。这样的变量将在Ghidra中分配给"global“名称空间,而不是函数的名称空间。

在Ghidra中,每个默认的全局变量名都以变量的地址结尾。每个默认的局部变量名都以"local_“开头,以变量的堆栈偏移量结束。

我只使用了Java API。但是Ghidra类的层次结构应该是相同的,无论您使用的是Java还是Python。下面是一个示例Java脚本,它将列出当前程序中的所有非默认全局变量和局部变量:

代码语言:javascript
复制
// Lists non-default global and local variables in the current program.
//@category Example

import ghidra.app.script.GhidraScript;
import ghidra.program.database.ProgramDB;
import ghidra.program.database.symbol.NamespaceManager;
import ghidra.program.database.symbol.SymbolManager;
import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.Variable;
import ghidra.program.model.symbol.Symbol;
import ghidra.program.model.symbol.SymbolType;

public class ListVariables extends GhidraScript {

   @Override
   public void run() throws Exception {

      // List globals
      SymbolManager smgr = (SymbolManager)currentProgram.getSymbolTable();
      NamespaceManager nmgr = 
         ((ProgramDB)currentProgram).getNamespaceManager();
      for (Symbol sym : smgr.getSymbols(nmgr.getGlobalNamespace())) {
         if (monitor.isCancelled()) return;
         if (sym.getSymbolType() == SymbolType.LABEL) {
            String sname = sym.getName();
            if (!sname.endsWith(sym.getAddress().toString())) {
               printf("global : %s\n", sname);
            }
         }
      }

      //List local variables
      for (Function func :
           currentProgram.getFunctionManager().getFunctions(true)) {
         for (Variable var : func.getLocalVariables()) {
            if (monitor.isCancelled()) return;
            String vname = var.getName();
            if (!vname.startsWith("local_")) {
               printf("%s : %s\n", func.getName(), vname);
            }
         }
      }
   }
}

该脚本将其输出写入Ghidra控制台窗口。双击Ghidra控制台窗口中的函数或变量名会将列表跳转到相应的函数/变量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57300384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档