From f71001ca405c382d6a43d282836a24a6ecdcd4f3 Mon Sep 17 00:00:00 2001 From: Mike Hunhoff Date: Mon, 18 Mar 2024 16:32:44 -0600 Subject: [PATCH] Extend Ghidra exporter to include data references --- .../security/binexport/BinExport2Builder.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/java/src/main/java/com/google/security/binexport/BinExport2Builder.java b/java/src/main/java/com/google/security/binexport/BinExport2Builder.java index 2692507f..f7c327b6 100644 --- a/java/src/main/java/com/google/security/binexport/BinExport2Builder.java +++ b/java/src/main/java/com/google/security/binexport/BinExport2Builder.java @@ -89,6 +89,10 @@ public BinExport2Builder setPrependNamespace(boolean isPrepended) { return this; } + private Address getAddressFromLong(long offset) { + return program.getAddressFactory().getDefaultAddressSpace().getAddress(offset); + } + private long getMappedAddress(Address address) { return address.getOffset() - addressOffset; } @@ -407,6 +411,26 @@ private void buildCallGraph() throws CancelledException { } } + private void buildDataReferences(Map instructionIndices) { + monitor.setMessage("Exporting data references"); + monitor.setMaximum(instructionIndices.size()); + + int i = 0; + for (Map.Entry insnIndex : instructionIndices.entrySet()) { + monitor.setProgress(i++); + + Address addr = getAddressFromLong(insnIndex.getKey()); + for (Reference ref : program.getReferenceManager().getReferencesFrom(addr)) { + if (ref.isMemoryReference() && ref.getReferenceType().isData()) { + builder + .addDataReferenceBuilder() + .setInstructionIndex(insnIndex.getValue()) + .setAddress(ref.getToAddress().getOffset()); + } + } + } + } + private void buildSections() { monitor.setMessage("Exporting sections"); monitor.setIndeterminate(false); @@ -532,7 +556,7 @@ public BinExport2 build(TaskMonitor taskMonitor) throws CancelledException { // TODO(cblichmann): Implement these: // buildComments() // buildStrings(); - // buildDataReferences() + buildDataReferences(instructionIndices); monitor.setMessage("Exporting flow graphs"); buildFlowGraphs(basicBlockIndices); monitor.setMessage("Exporting call graph");