From 258f8ad44e95faabe74f6461e7d4dc4dafbb011d Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Fri, 4 Aug 2023 15:02:37 -0400 Subject: [PATCH] GP-0 revised PseudoDisassembler.setTargetContextForDisassembly method for improved reuse --- .../ConstantPropagationContextEvaluator.java | 4 +- .../disassembler/AddressTableAnalyzer.java | 2 +- .../core/disassembler/EntryPointAnalyzer.java | 2 +- .../app/util/demangler/DemangledFunction.java | 2 +- .../app/cmd/data/EHDataTypeUtilities.java | 3 +- .../ghidra/app/util/PseudoDisassembler.java | 58 +++++++++++-------- 6 files changed, 40 insertions(+), 31 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/ConstantPropagationContextEvaluator.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/ConstantPropagationContextEvaluator.java index 750d7f49ee..04a1f96cd3 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/ConstantPropagationContextEvaluator.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/ConstantPropagationContextEvaluator.java @@ -15,8 +15,8 @@ */ package ghidra.app.plugin.core.analysis; -import ghidra.app.cmd.function.*; import ghidra.app.cmd.disassemble.DisassembleCommand; +import ghidra.app.cmd.function.*; import ghidra.app.services.AnalysisPriority; import ghidra.app.util.PseudoDisassembler; import ghidra.program.model.address.*; @@ -387,7 +387,7 @@ public class ConstantPropagationContextEvaluator extends ContextEvaluatorAdapter } } else { // if nothing defined here, disassemble - address = PseudoDisassembler.setTargeContextForDisassembly(program, address); + address = PseudoDisassembler.setTargetContextForDisassembly(program, address); DisassembleCommand cmd = new DisassembleCommand(address, null, true); cmd.applyTo(program, monitor); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/AddressTableAnalyzer.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/AddressTableAnalyzer.java index 2d0d79a94e..1647641938 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/AddressTableAnalyzer.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/AddressTableAnalyzer.java @@ -200,7 +200,7 @@ public class AddressTableAnalyzer extends AbstractAnalyzer { for (Address addr : validCodeList) { // set target context correctly. Target address will get // aligned in DisassembleCmd - PseudoDisassembler.setTargeContextForDisassembly(program, addr); + PseudoDisassembler.setTargetContextForDisassembly(program, addr); // even though they are valid code, don't do them if // there is already code there. diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/EntryPointAnalyzer.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/EntryPointAnalyzer.java index 517ae33bdd..50ca949668 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/EntryPointAnalyzer.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/EntryPointAnalyzer.java @@ -352,7 +352,7 @@ public class EntryPointAnalyzer extends AbstractAnalyzer { if (value instanceof Address) { Address codeLoc = (Address) value; if (codeLoc.getOffset() != 0) { - PseudoDisassembler.setTargeContextForDisassembly(program, codeLoc); + PseudoDisassembler.setTargetContextForDisassembly(program, codeLoc); // align if necessary int instructionAlignment = program.getLanguage().getInstructionAlignment(); if (codeLoc.getOffset() % instructionAlignment != 0) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunction.java index b8af2e89c2..ca0838979f 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/demangler/DemangledFunction.java @@ -387,7 +387,7 @@ public class DemangledFunction extends DemangledObject { // the function to the correct address. if (address.isMemoryAddress()) { - address = PseudoDisassembler.setTargeContextForDisassembly(program, address); + address = PseudoDisassembler.setTargetContextForDisassembly(program, address); } if (!passesPreconditions(program, address)) { diff --git a/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/EHDataTypeUtilities.java b/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/EHDataTypeUtilities.java index 8cd322ddd0..f14a8d2e1c 100644 --- a/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/EHDataTypeUtilities.java +++ b/Ghidra/Features/MicrosoftCodeAnalyzer/src/main/java/ghidra/app/cmd/data/EHDataTypeUtilities.java @@ -328,7 +328,8 @@ public class EHDataTypeUtilities { PseudoDisassembler.getNormalizedDisassemblyAddress(program, functionAddress); Instruction inst = listing.getInstructionAt(normalizedFunctionAddress); if (inst == null) { - functionAddress = PseudoDisassembler.setTargeContextForDisassembly(program, functionAddress); + functionAddress = + PseudoDisassembler.setTargetContextForDisassembly(program, functionAddress); DisassembleCommand cmd = new DisassembleCommand(functionAddress, null, true); if (!cmd.applyTo(program) || cmd.getDisassembledAddressSet().isEmpty()) { Msg.error(EHDataTypeUtilities.class, "Failed to disassemble at " + functionAddress); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/util/PseudoDisassembler.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/util/PseudoDisassembler.java index d58731f31e..424f94ed33 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/util/PseudoDisassembler.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/util/PseudoDisassembler.java @@ -424,9 +424,8 @@ public class PseudoDisassembler { AddressSet body = new AddressSet(); AddressSet instrStarts = new AddressSet(); - if (hasLowBitCodeModeInAddrValues(program)) { - entryPoint = setTargeContextForDisassembly(procContext, entryPoint); - } + entryPoint = setTargetContextForDisassembly(procContext, entryPoint); + Address target = entryPoint; ArrayList
targetList = new ArrayList<>(); // list of valid targets @@ -662,9 +661,8 @@ public class PseudoDisassembler { AddressSet instrStarts = new AddressSet(); AddressSetView execSet = memory.getExecuteSet(); - if (hasLowBitCodeModeInAddrValues(program)) { - entryPoint = setTargeContextForDisassembly(procContext, entryPoint); - } + entryPoint = setTargetContextForDisassembly(procContext, entryPoint); + Address target = entryPoint; ArrayList
targetList = new ArrayList<>(); // list of valid targets @@ -1078,25 +1076,29 @@ public class PseudoDisassembler { * @param addr the raw address * @return the correct address to disassemble at if it needs to be aligned */ - public static Address setTargeContextForDisassembly(Program program, Address addr) { + public static Address setTargetContextForDisassembly(Program program, Address addr) { if (!addr.isMemoryAddress()) { Msg.error(PseudoDisassembler.class, "Invalid attempt to adjust disassembler context at " + addr.toString(true)); return addr; } + + long offset = addr.getOffset(); + if ((offset & 1) == 0) { + return addr; + } + Register lowBitCodeMode = program.getRegister(LOW_BIT_CODE_MODE_REGISTER_NAME); if (lowBitCodeMode == null) { return addr; } - long offset = addr.getOffset(); - if ((offset & 1) == 1) { - addr = addr.getNewAddress(addr.getOffset() & ~0x1); - try { - program.getProgramContext().setValue(lowBitCodeMode, addr, addr, BigInteger.ONE); - } - catch (ContextChangeException e) { - // shouldn't happen - } + + addr = addr.getNewAddress(addr.getOffset() & ~0x1); + try { + program.getProgramContext().setValue(lowBitCodeMode, addr, addr, BigInteger.ONE); + } + catch (ContextChangeException e) { + // shouldn't happen } return addr; } @@ -1111,23 +1113,29 @@ public class PseudoDisassembler { * @return the correct disassembly location if the address needed to be adjusted. */ - public Address setTargeContextForDisassembly(PseudoDisassemblerContext procContext, + public static Address setTargetContextForDisassembly(DisassemblerContext procContext, Address addr) { if (!addr.isMemoryAddress()) { - Msg.error(this, + Msg.error(PseudoDisassembler.class, "Invalid attempt to adjust disassembler context at " + addr.toString(true)); return addr; } - Register lowBitCodeMode = program.getRegister(LOW_BIT_CODE_MODE_REGISTER_NAME); + + long offset = addr.getOffset(); + if ((offset & 1) == 0) { + return addr; + } + + Register lowBitCodeMode = procContext.getRegister(LOW_BIT_CODE_MODE_REGISTER_NAME); if (lowBitCodeMode == null) { return addr; } - long offset = addr.getOffset(); - if ((offset & 1) == 1) { - addr = addr.getNewAddress(addr.getOffset() & ~0x1); - procContext.setValue(lowBitCodeMode, addr, BigInteger.ONE); - } - return addr.getNewAddress(addr.getOffset() & ~0x1); + + // Set context and revise addr (clear lsb of offset) + addr = addr.getNewAddress(addr.getOffset() & ~0x1); + RegisterValue val = new RegisterValue(lowBitCodeMode, BigInteger.ONE); + procContext.setFutureRegisterValue(addr, val); + return addr; } }