这是修改后的代码,并将结果保存为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助手提供,问题来源于学员提问