package gamecubeloader.apploader; import java.io.IOException; import ghidra.app.util.bin.BinaryReader; import ghidra.util.Msg; public final class ApploaderHeader { public static final int HEADER_SIZE = 32; private String revision; private long entryPoint; private int size; private int trailerSize; private long fileSize; public ApploaderHeader(BinaryReader reader) { this.readHeader(reader); } private void readHeader(BinaryReader reader) { try { fileSize = reader.length(); reader.setPointerIndex(0); revision = reader.readNextAsciiString(16); entryPoint = reader.readNextUnsignedInt(); size = reader.readNextInt(); trailerSize = reader.readNextInt(); } catch(IOException e) { Msg.error(this, "Failed to read Apploader header!"); } } public boolean IsValid() { if (size == 0) return false; if (entryPoint - 0x81200000L < ApploaderHeader.HEADER_SIZE) return false; if (entryPoint - 0x81200000L >= fileSize) return false; if (size + trailerSize + ApploaderHeader.HEADER_SIZE > fileSize) return false; return true; } public String GetRevision() { return revision; } public long GetEntryPoint() { return entryPoint; } public int GetSize() { return size; } public int GetTrailerSize() { return trailerSize; } }