ZBLOG

修改代码,输出结果如下,并保存为JSON文件 (_init,hasVariable,变量名;\n) (_init,ReturnType,int;\n) (_init,hasParameters,ctx;\n) (ctx,ParametersType,EVP_PKEY_CTX *;\n) (_init,Call,_init;\n) 代码: import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.g...

这是修改后的代码,并将结果保存为JSON文件:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import ghidra.app.script.GhidraScript;
import ghidra.program.model.address.Address;
import ghidra.program.model.data.DataType;
import ghidra.program.model.listing.*;
import ghidra.program.model.symbol.*;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;

public class FunctionAll extends GhidraScript {

    @Override
    public void run() throws Exception {
        // 创建JSON对象
        JsonObject root = new JsonObject();
        JsonArray functionsArray = new JsonArray();

        // 获取当前程序的函数列表
        FunctionManager functionManager = currentProgram.getFunctionManager();

        // 获取函数管理器中的所有函数
        Iterator<Function> functionIterator = functionManager.getFunctions(true);

        // 遍历所有全局函数
        while (functionIterator.hasNext()) {
            Function function = functionIterator.next();
            JsonObject functionObject = new JsonObject();
            Symbol primarySymbol = function.getSymbol(); // 获取函数的主要符号
            String functionName = primarySymbol.getName(); // 获取函数名称
            Address functionAddress = primarySymbol.getAddress(); // 获取函数入口地址

            // 添加函数基本信息
            functionObject.addProperty("FunctionName", functionName);
            functionObject.addProperty("EntryPoint", functionAddress.toString());

            // 添加_init、hasVariable和变量名信息
            Variable[] variables = getVariables(function);
            if (variables != null) {
                for (Variable variable : variables) {
                    JsonObject variableObject = new JsonObject();
                    variableObject.addProperty("_init", "hasVariable");
                    variableObject.addProperty("变量名", variable.getName());
                    variablesArray.add(variableObject);
                }
            }

            // 添加_init、ReturnType和int信息
            DataType returnType = function.getReturnType();
            if (returnType != null) {
                JsonObject returnTypeObject = new JsonObject();
                returnTypeObject.addProperty("_init", "ReturnType");
                returnTypeObject.addProperty("int", returnType.getName());
                variablesArray.add(returnTypeObject);
            }

            // 添加_init、hasParameters和ctx信息
            Parameter[] parameters = function.getParameters();
            if (parameters != null) {
                for (Parameter parameter : parameters) {
                    JsonObject parameterObject = new JsonObject();
                    parameterObject.addProperty("_init", "hasParameters");
                    parameterObject.addProperty("ctx", parameter.getDataType().getName());
                    variablesArray.add(parameterObject);
                }
            }

            // 获取函数返回类型
            DataType returnType = function.getReturnType();
            if (returnType != null) {
                functionObject.addProperty("ReturnType", returnType.getName());
            }

             // 获取函数参数
             JsonArray parametersArray = new JsonArray();
             for (Parameter parameter : function.getParameters()) {
                 JsonObject parameterObject = new JsonObject();
                 parameterObject.addProperty("ParameterName", parameter.getName());
                 parameterObject.addProperty("ParameterType", parameter.getDataType().getName());
                 parametersArray.add(parameterObject);
             }
             functionObject.add("Parameters", parametersArray);

             // 获取函数局部变量
             JsonArray variablesArray = new JsonArray();
             for (Variable variable : function.getLocalVariables()) {
                 JsonObject variableObject = new JsonObject();
                 variableObject.addProperty("VariableName", variable.getName());
                 variableObject.addProperty("VariableType", variable.getDataType().getName());
                 variablesArray.add(variableObject);
             }
             functionObject.add("Variables", variablesArray);

             // 获取函数调用关系
             JsonArray callerArray = new JsonArray();
             for (Function caller : function.getCallingFunctions(monitor)) {
                 callerArray.add(caller.getName());
             }
             functionObject.add("Callers", callerArray);

             // 将函数信息添加到数组中
             functionsArray.add(functionObject);
         }

         // 将函数数组添加到根对象
         root.add("Functions", functionsArray);

         // 使用Gson库将JSON对象转换为字符串
         Gson gson = new GsonBuilder().setPrettyPrinting().create();
         String json = gson.toJson(root);

         // 定义输出文件路径
         String outputFileName = currentProgram.getName() + "_All.json";
         String outputFilePath = "output/" + outputFileName;

         // 将JSON字符串写入文件
         try (FileWriter writer = new FileWriter(outputFilePath)) {
             writer.write(json);
             println("函数信息已保存到: " + outputFilePath);
         } catch (IOException e) {
             e.printStackTrace();
        }
    }

    // 获取函数的局部变量,包括参数和其他局部变量
    private Variable[] getVariables(Function function) {
        if (function.hasNoReturn()) {
            return null;
        }
        Variable[] variables = new Variable[function.getParameterCount() + function.getLocalVariableCount()];
        int i = 0;
        
        for (Parameter parameter : function.getParameters()) {
            variables[i] = parameter;
            i++;
        }
        
        for (Variable variable : function.getLocalVariables()) {
            variables[i] = variable;
            i++;
        }

        return variables;
    }
}

请确保你已经创建了一个名为”output”的文件夹,代码会将结果保存为当前程序名_All.json格式的JSON文件在该文件夹下。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=13982

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?