From 92fb777c8471b84b9788762a255b20f79d82da8e Mon Sep 17 00:00:00 2001 From: Sam Lerner Date: Sun, 21 Jun 2020 20:12:07 -0400 Subject: [PATCH 1/2] Fixed EmulatorHelper.writeStackValue --- .../src/main/java/ghidra/app/emulator/EmulatorHelper.java | 4 ++-- .../java/ghidra/program/disassemble/Disassembler.java | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/emulator/EmulatorHelper.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/emulator/EmulatorHelper.java index e2cae89336..1a2731c21e 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/emulator/EmulatorHelper.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/emulator/EmulatorHelper.java @@ -288,10 +288,10 @@ public class EmulatorHelper implements MemoryFaultHandler, EmulatorConfiguration long offset = readRegister(stackPtrReg).longValue() + relativeOffset; byte[] bytes = new byte[size]; if (program.getMemory().isBigEndian()) { - BigEndianDataConverter.INSTANCE.getBytes(value, bytes); + BigEndianDataConverter.INSTANCE.getBytes(value, size, bytes, 0); } else { - LittleEndianDataConverter.INSTANCE.getBytes(value, bytes); + LittleEndianDataConverter.INSTANCE.getBytes(value, size, bytes, 0); } writeMemory(stackMemorySpace.getAddress(offset), bytes); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/Disassembler.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/Disassembler.java index a9f2e3853d..9286f7ebdb 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/Disassembler.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/Disassembler.java @@ -922,7 +922,13 @@ public class Disassembler implements DisassemblerConflictHandler { // TODO: An overall better caching of bytes for this block could be done instead // the previous buffering done here was not doing any buffering - MemBuffer instrMemBuffer = new DumbMemBufferImpl(blockMemBuffer.getMemory(), addr); + MemBuffer instrMemBuffer; + + try { + instrMemBuffer = new DumbMemBufferImpl(blockMemBuffer.getMemory(), addr); + } catch(UnsupportedOperationException e) { + instrMemBuffer = blockMemBuffer; + } adjustPreParseContext(instrMemBuffer); From a6a31863448ba5ad0108efabed90f6eef3ab0ab9 Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Thu, 16 Jul 2020 16:41:00 -0400 Subject: [PATCH 2/2] Cleanup of EmulatorHelper DataConverter usage --- .../ghidra/app/emulator/EmulatorHelper.java | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/emulator/EmulatorHelper.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/emulator/EmulatorHelper.java index 1a2731c21e..5ac4329e9b 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/emulator/EmulatorHelper.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/emulator/EmulatorHelper.java @@ -32,7 +32,8 @@ import ghidra.program.model.lang.*; import ghidra.program.model.listing.*; import ghidra.program.model.mem.MemoryBlock; import ghidra.program.model.mem.MemoryConflictException; -import ghidra.util.*; +import ghidra.util.DataConverter; +import ghidra.util.Msg; import ghidra.util.exception.CancelledException; import ghidra.util.exception.DuplicateNameException; import ghidra.util.task.TaskMonitor; @@ -50,6 +51,8 @@ public class EmulatorHelper implements MemoryFaultHandler, EmulatorConfiguration private MemoryFaultHandler faultHandler; + private DataConverter converter; + private BreakCallBack addressBreak = new BreakCallBack() { @Override public boolean addressCallback(Address addr) { @@ -66,6 +69,8 @@ public class EmulatorHelper implements MemoryFaultHandler, EmulatorConfiguration stackMemorySpace = program.getCompilerSpec().getStackBaseSpace(); emulator = new Emulator(this); + + converter = DataConverter.getInstance(program.getMemory().isBigEndian()); } public void dispose() { @@ -271,10 +276,7 @@ public class EmulatorHelper implements MemoryFaultHandler, EmulatorConfiguration throws Exception { long offset = readRegister(stackPtrReg).longValue() + relativeOffset; byte[] bytes = readMemory(stackMemorySpace.getAddress(offset), size); - if (program.getMemory().isBigEndian()) { - return BigEndianDataConverter.INSTANCE.getBigInteger(bytes, size, signed); - } - return LittleEndianDataConverter.INSTANCE.getBigInteger(bytes, size, signed); + return converter.getBigInteger(bytes, size, signed); } /** @@ -287,12 +289,7 @@ public class EmulatorHelper implements MemoryFaultHandler, EmulatorConfiguration public void writeStackValue(int relativeOffset, int size, long value) throws Exception { long offset = readRegister(stackPtrReg).longValue() + relativeOffset; byte[] bytes = new byte[size]; - if (program.getMemory().isBigEndian()) { - BigEndianDataConverter.INSTANCE.getBytes(value, size, bytes, 0); - } - else { - LittleEndianDataConverter.INSTANCE.getBytes(value, size, bytes, 0); - } + converter.getBytes(value, size, bytes, 0); writeMemory(stackMemorySpace.getAddress(offset), bytes); } @@ -306,13 +303,7 @@ public class EmulatorHelper implements MemoryFaultHandler, EmulatorConfiguration public void writeStackValue(int relativeOffset, int size, BigInteger value) throws Exception { // TODO: verify that sign byte is not added to size of bytes long offset = readRegister(stackPtrReg).longValue() + relativeOffset; - byte[] bytes; - if (program.getMemory().isBigEndian()) { - bytes = BigEndianDataConverter.INSTANCE.getBytes(value, size); - } - else { - bytes = LittleEndianDataConverter.INSTANCE.getBytes(value, size); - } + byte[] bytes = converter.getBytes(value, size); writeMemory(stackMemorySpace.getAddress(offset), bytes); }