From f97406c92e0f1d1e05e564f4b6abb94aab5cfbc6 Mon Sep 17 00:00:00 2001 From: RipleyTom Date: Sun, 25 Jan 2026 01:22:36 +0100 Subject: [PATCH] Handle possible exceptions on createData --- ghidra_scripts/AnalyzePs3Binary.java | 16 ++++++++-------- ghidra_scripts/Ps3ElfUtils.java | 10 +++++++++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/ghidra_scripts/AnalyzePs3Binary.java b/ghidra_scripts/AnalyzePs3Binary.java index ebd4e30..3bbc41d 100644 --- a/ghidra_scripts/AnalyzePs3Binary.java +++ b/ghidra_scripts/AnalyzePs3Binary.java @@ -69,10 +69,10 @@ private void handleExec() throws Exception { final Address firstTocBaseAddr = opdAddress.add(4); utils.applyDataForce(Pointer32DataType.dataType, "tocPtr", opdAddress); - createData(firstTocBaseAddr, Pointer32DataType.dataType); + utils.createDataSafe(Pointer32DataType.dataType, firstTocBaseAddr); final Address elfEntryPtrAddr = currentAddress.getNewAddress(elfEntryPtr); - createData(elfEntryPtrAddr, Pointer32DataType.dataType); + utils.createDataSafe(Pointer32DataType.dataType, elfEntryPtrAddr); final Address elfEntry = (Address) getDataAt(elfEntryPtrAddr).getValue(); addFunction(elfEntry, "_start"); @@ -397,8 +397,8 @@ private void createImportStubs(Address start_addr, int stub_count) throws Except String libname = "NONAME"; if(namePtr != 0) { final Address namePtr_ = currentAddress.getNewAddress(namePtr); - removeDataAt(namePtr_);// TODO check for string - createData(namePtr_, StringDataType.dataType); + // TODO: check for string + utils.applyDataForce(StringDataType.dataType, "", namePtr_); libname = (String) getDataAt(namePtr_).getValue(); } printf("Import:"); @@ -572,9 +572,9 @@ private void createExportEnts(Address start_addr, int exportCount) throws Except String libname = "NONAME"; if(namePtr != 0) { final Address namePtr_ = currentAddress.getNewAddress(namePtr); - removeDataAt(namePtr_);//TODO check for string - createData(namePtr_, StringDataType.dataType); - libname = (String) getDataAt(namePtr_).getValue();// + // TODO: check for string + utils.applyDataForce(StringDataType.dataType, "", namePtr_); + libname = (String) getDataAt(namePtr_).getValue(); } printf("Export:"); printf("Library name: %s\n", libname); @@ -627,7 +627,7 @@ private void createExportEnts(Address start_addr, int exportCount) throws Except final Address ptrptr = currentAddress.getNewAddress(addrArray.getComponent(j).getInt(0)); if(getDataAt(ptrptr) == null) { //Mark as pointer if not already - createData(ptrptr, Pointer32DataType.dataType); + utils.createDataSafe(Pointer32DataType.dataType, ptrptr); } final Address funcAddress = currentAddress.getNewAddress(getDataAt(ptrptr).getInt(0)); final Function functionAt = getFunctionAt(funcAddress); diff --git a/ghidra_scripts/Ps3ElfUtils.java b/ghidra_scripts/Ps3ElfUtils.java index a9e6702..ed9a189 100644 --- a/ghidra_scripts/Ps3ElfUtils.java +++ b/ghidra_scripts/Ps3ElfUtils.java @@ -148,13 +148,21 @@ public void applyStructArray(StructureDataType struct, int amount, Address addre } public void applyDataForce(DataType data, String name, Address address) throws Exception { - script.clearListing(address, address.add((data.getLength())-1)); + script.clearListing(address, address.add(Math.max(0, data.getLength()-1))); script.createData(address, data); if (!name.isEmpty()) { script.createLabel(address, name, true); } } + public void createDataSafe(DataType data, Address address) { + try { + script.createData(address, data); + } catch (Exception e) { + script.println("Warning: Could not create data at " + address + ": " + e.getMessage()); + } + } + public static String getExtensionInstallDataPath(String extensionName) { final List ps3GhidraScripts; try {