ZBLOG

代码: 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.mod...

根据您的要求,我已经修改了代码,并添加了输出结果以三元组格式输出,并保存为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.listing.*;
import ghidra.program.model.symbol.*;
import ghidra.program.model.data.DataType;

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(); // 获取函数名称

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

            StringBuilder outputResultBuilder = new StringBuilder();

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

                String resultString =
                        functionName + ", hasVariable, " + variable.getName() + ";\n" +
                        variable.getName() + ", VariableType, " + variable.getDataType().getName() + ";\n";
                outputResultBuilder.append(resultString);

                functionObject.add("Variable", variableObject);
            }

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

                String resultString =
                        functionName + ", hasParameters, " + parameter.getName() + ";\n" +
                        parameter.getName() + ", ParametersType, " + parameter.getDataType().getName() + ";\n";
                outputResultBuilder.append(resultString);

                functionObject.add("Parameter", parameterObject);
            }

            // 获取函数调用关系
            for (Function caller : function.getCallingFunctions(monitor)) {
                String resultString = functionName + ", Call, " + caller.getName() + ";\n";
                outputResultBuilder.append(resultString);
            }

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

            // 输出结果到控制台
            println(outputResultBuilder.toString());
        }

        // 将函数数组添加到根对象
        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();
        }
    }
}

此代码会输出结果到控制台,并将结果保存为JSON文件。请确保您已创建名为”output”的目录来存储输出文件。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?