sots-re/ghidra/scripts/FixPlayer.java

37 lines
2.2 KiB
Java

import ghidra.app.script.GhidraScript;
import ghidra.program.model.address.*;
import ghidra.program.model.listing.*;
import ghidra.program.model.symbol.*;
import ghidra.program.model.data.*;
import ghidra.program.model.lang.*;
import ghidra.app.decompiler.*;
import java.util.*;
import java.io.*;
// ServerPlayer::Read/Write had no parameters: create this (ECX) = ServerPlayer_ser928*, stream (stack+4); verify decompile.
public class FixPlayer extends GhidraScript {
@Override
public void run() throws Exception {
DataTypeManager dtm = currentProgram.getDataTypeManager();
List<DataType> l = new ArrayList<DataType>(); dtm.findDataTypes("Game::ServerPlayer_ser928", l);
DataType view = l.get(0);
List<DataType> l2 = new ArrayList<DataType>(); dtm.findDataTypes("Stream", l2); DataType stream = null; for (DataType d : l2) if (d.getCategoryPath().getPath().equals("/Mars")) stream = d;
Register ecx = currentProgram.getRegister("ECX");
PrintWriter log = new PrintWriter(new FileWriter("/tmp/spine/fixplayer.log"));
for (long a : new long[]{0x008563e0L, 0x008804d0L}) {
Function f = getFunctionAt(toAddr(a));
List<Variable> ps = new ArrayList<Variable>();
ps.add(new ParameterImpl("this", new PointerDataType(view), ecx, currentProgram));
ps.add(new ParameterImpl("stream", new PointerDataType(stream == null ? VoidDataType.dataType : stream), 4, currentProgram));
f.setCustomVariableStorage(true);
f.replaceParameters(ps, Function.FunctionUpdateType.CUSTOM_STORAGE, true, SourceType.USER_DEFINED);
log.println(f.getName(true) + " params=" + f.getParameterCount() + " " + f.getPrototypeString(false, false));
}
DecompInterface decomp = new DecompInterface(); decomp.openProgram(currentProgram);
Function f = getFunctionAt(toAddr(0x008563e0L));
DecompileResults res = decomp.decompileFunction(f, 240, monitor);
PrintWriter w = new PrintWriter(new FileWriter("/tmp/spine/verify_ServerPlayer_Write.c"));
w.println(res.getDecompiledFunction().getC()); w.close();
decomp.dispose(); log.close(); println("fixplayer done");
}
}