Skip to content

Commit

Permalink
Upgrade to Ghidra 10.3
Browse files Browse the repository at this point in the history
  • Loading branch information
TSRBerry committed May 21, 2023
1 parent 19ca180 commit 021fb21
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 53 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ configurations {

dependencies {
api fileTree(dir: ghidraInstallDir + '/Ghidra/Processors', include: "**/*.jar")
implementation 'commons-primitives:commons-primitives:1.0'
localDeps group: 'org.lz4', name: 'lz4-java', version: '1.5.1'
api configurations.localDeps
}
Expand Down
Empty file modified gradlew
100644 → 100755
Empty file.
20 changes: 8 additions & 12 deletions src/main/java/adubbz/nx/analyzer/ipc/IPCEmulator.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,6 @@
*/
package adubbz.nx.analyzer.ipc;

import java.nio.ByteBuffer;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;

import org.apache.commons.compress.utils.Lists;

import adubbz.nx.util.ByteUtil;
import ghidra.app.plugin.processors.sleigh.SleighLanguage;
import ghidra.app.util.bin.BinaryReader;
Expand All @@ -21,10 +14,7 @@
import ghidra.pcode.emulate.BreakTableCallBack;
import ghidra.pcode.emulate.Emulate;
import ghidra.pcode.error.LowlevelError;
import ghidra.pcode.memstate.MemoryBank;
import ghidra.pcode.memstate.MemoryFaultHandler;
import ghidra.pcode.memstate.MemoryPageBank;
import ghidra.pcode.memstate.MemoryState;
import ghidra.pcode.memstate.*;
import ghidra.pcode.utils.Utils;
import ghidra.program.database.ProgramDB;
import ghidra.program.database.code.CodeManager;
Expand All @@ -42,6 +32,12 @@
import ghidra.util.exception.CancelledException;
import ghidra.util.task.TaskMonitor;
import ghidra.util.task.TaskMonitorAdapter;
import org.apache.commons.compress.utils.Lists;

import java.nio.ByteBuffer;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class IPCEmulator
{
Expand Down Expand Up @@ -121,7 +117,7 @@ public boolean unknownAddress(Address address, boolean write)
};

this.sLang = (SleighLanguage)this.program.getLanguage();
this.state = new MemoryState(this.sLang);
this.state = new DefaultMemoryState(this.sLang);

// Create banks for ram and registers and add them to our state
this.ramBank = new MemoryPageBank(this.sLang.getAddressFactory().getDefaultAddressSpace(), false, 4096, faultHandler);
Expand Down
21 changes: 9 additions & 12 deletions src/main/java/adubbz/nx/loader/SwitchLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import ghidra.app.util.opinion.BinaryLoader;
import ghidra.app.util.opinion.LoadSpec;
import ghidra.app.util.opinion.LoaderTier;
import ghidra.framework.model.DomainFolder;
import ghidra.framework.model.Project;
import ghidra.framework.store.LockException;
import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressOutOfBoundsException;
Expand All @@ -38,6 +38,7 @@
import ghidra.program.model.lang.LanguageCompilerSpecPair;
import ghidra.program.model.lang.LanguageID;
import ghidra.program.model.listing.Program;
import ghidra.app.util.opinion.Loaded;
import ghidra.util.Msg;
import ghidra.util.exception.CancelledException;
import ghidra.util.task.TaskMonitor;
Expand Down Expand Up @@ -99,10 +100,7 @@ else if (magic_0x10.equals("KIP1"))
}

@Override
protected List<LoadedProgram> loadProgram(ByteProvider provider, String programName,
DomainFolder programFolder, LoadSpec loadSpec, List<Option> options, MessageLog log,
Object consumer, TaskMonitor monitor)
throws IOException, CancelledException
protected List<Loaded<Program>> loadProgram(ByteProvider provider, String programName, Project project, String programFolderPath, LoadSpec loadSpec, List<Option> options, MessageLog log, Object consumer, TaskMonitor monitor) throws IOException, CancelledException
{
LanguageCompilerSpecPair pair = loadSpec.getLanguageCompilerSpec();
Language importerLanguage = getLanguageService().getLanguage(pair.languageID);
Expand All @@ -112,26 +110,27 @@ protected List<LoadedProgram> loadProgram(ByteProvider provider, String programN
Program prog = createProgram(provider, programName, baseAddr, getName(), importerLanguage, importerCompilerSpec, consumer);
boolean success = false;

List<Loaded<Program>> results;

try
{
success = this.loadInto(provider, loadSpec, options, log, prog, monitor);
this.loadInto(provider, loadSpec, options, log, prog, monitor);
success = true;
results = List.of(new Loaded<>(prog, programName, programFolderPath));
}
finally
{
if (!success)
{
prog.release(consumer);
prog = null;
}
}

List<LoadedProgram> results = new ArrayList<>();
if (prog != null) results.add(new LoadedProgram(prog, programFolder));
return results;
}

@Override
protected boolean loadProgramInto(ByteProvider provider, LoadSpec loadSpec, List<Option> options,
protected void loadProgramInto(ByteProvider provider, LoadSpec loadSpec, List<Option> options,
MessageLog messageLog, Program program, TaskMonitor monitor)
throws IOException
{
Expand Down Expand Up @@ -169,8 +168,6 @@ protected boolean loadProgramInto(ByteProvider provider, LoadSpec loadSpec, List
// KIP1s always start with a branch instruction at the start of their text
loader.createEntryFunction("entry", program.getImageBase().getOffset(), monitor);
}

return true;
}

@Override
Expand Down
54 changes: 25 additions & 29 deletions src/main/java/adubbz/nx/loader/common/NXProgramBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,14 @@
*/
package adubbz.nx.loader.common;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.common.collect.ImmutableList;
import com.google.common.primitives.Longs;

import adubbz.nx.common.NXRelocation;
import adubbz.nx.loader.nxo.NXOAdapter;
import adubbz.nx.loader.nxo.NXO;
import adubbz.nx.loader.nxo.NXOAdapter;
import adubbz.nx.loader.nxo.NXOSection;
import adubbz.nx.loader.nxo.NXOSectionType;
import adubbz.nx.util.UIUtil;
import com.google.common.collect.ImmutableList;
import com.google.common.primitives.Longs;
import ghidra.app.cmd.label.SetLabelPrimaryCmd;
import ghidra.app.util.MemoryBlockUtils;
import ghidra.app.util.bin.BinaryReader;
Expand All @@ -32,33 +25,28 @@
import ghidra.app.util.bin.format.elf.relocation.AARCH64_ElfRelocationConstants;
import ghidra.app.util.bin.format.elf.relocation.ARM_ElfRelocationConstants;
import ghidra.app.util.importer.MessageLog;
import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressOutOfBoundsException;
import ghidra.program.model.address.AddressOverflowException;
import ghidra.program.model.address.AddressSet;
import ghidra.program.model.address.AddressSpace;
import ghidra.program.model.address.*;
import ghidra.program.model.data.PointerDataType;
import ghidra.program.model.data.TerminatedStringDataType;
import ghidra.program.model.listing.Data;
import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.FunctionManager;
import ghidra.program.model.listing.Library;
import ghidra.program.model.listing.Program;
import ghidra.program.model.listing.*;
import ghidra.program.model.mem.MemoryAccessException;
import ghidra.program.model.mem.MemoryBlock;
import ghidra.program.model.symbol.ExternalLocation;
import ghidra.program.model.symbol.ExternalManager;
import ghidra.program.model.symbol.Namespace;
import ghidra.program.model.symbol.SourceType;
import ghidra.program.model.symbol.Symbol;
import ghidra.program.model.symbol.SymbolTable;
import ghidra.program.model.reloc.Relocation;
import ghidra.program.model.symbol.*;
import ghidra.program.model.util.CodeUnitInsertionException;
import ghidra.util.Msg;
import ghidra.util.exception.DuplicateNameException;
import ghidra.util.exception.InvalidInputException;
import ghidra.util.exception.NotFoundException;
import ghidra.util.task.TaskMonitor;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class NXProgramBuilder
{
protected ByteProvider fileByteProvider;
Expand Down Expand Up @@ -366,8 +354,9 @@ else if (reloc.r_type == AARCH64_ElfRelocationConstants.R_AARCH64_RELATIVE)
{
symbolName = reloc.sym.getNameAsString();
}

program.getRelocationTable().add(target, (int)reloc.r_type, new long[] { reloc.r_sym }, Longs.toByteArray(originalValue), symbolName);

// Status APPLIED: "Relocation was applied successfully and resulted in the modification of memory bytes."
program.getRelocationTable().add(target, Relocation.Status.APPLIED,(int)reloc.r_type, new long[] { reloc.r_sym }, Longs.toByteArray(originalValue), symbolName);
}
}

Expand Down Expand Up @@ -419,7 +408,14 @@ protected void setupImports(TaskMonitor monitor)
if (elfSymbol.getSectionHeaderIndex() == ElfSectionHeaderConstants.SHN_UNDEF && symName != null && !symName.isEmpty())
{
Address address = this.aSpace.getAddress(externalBlockAddrOffset);
elfSymbol.setValue(externalBlockAddrOffset); // Fix the value to be non-zero, instead pointing to our fake EXTERNAL block
try {
Field elfSymbolValue = elfSymbol.getClass().getDeclaredField("st_value");
elfSymbolValue.setAccessible(true);
// Fix the value to be non-zero, instead pointing to our fake EXTERNAL block
elfSymbolValue.set(elfSymbol, externalBlockAddrOffset);
} catch (NoSuchFieldException | IllegalAccessException e) {
Msg.error(this, "Couldn't find or set st_value field in ElfSymbol.", e);
}
this.evaluateElfSymbol(elfSymbol, address, true);
externalBlockAddrOffset += undefEntrySize;
}
Expand Down

0 comments on commit 021fb21

Please sign in to comment.