【问题标题】:ghidra: how to get static variables using ghidra python api?ghidra:如何使用 ghidra python api 获取静态变量?
【发布时间】:2019-12-09 12:59:26
【问题描述】:

我有以下 c 代码(来自基准测试):

int main(int argc, char *argv[])
{
  static   char buf[10] = "";


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


  return 0;
}

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

function.getStackFrame().getStackVariables()

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

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

【问题讨论】:

    标签: x86-64 reverse-engineering ghidra


    【解决方案1】:

    如果您使用gcc 编译,则在函数中定义的静态变量(例如,在您的情况下为变量buf)表示为以相同名称开头并以编译器分配的结尾的全局变量数字后缀。这样的变量将在 Ghidra 内分配给“全局”命名空间,而不是函数的命名空间。

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

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

    // 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 控制台窗口中双击一个函数或变量名将列表跳转到相应的函数/变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-16
      • 2020-10-04
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2020-11-26
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多