diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/mem/Memory.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/mem/Memory.java index 3853cbda04..65bcee3784 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/mem/Memory.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/mem/Memory.java @@ -17,8 +17,7 @@ package ghidra.program.model.mem; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import ghidra.framework.store.LockException; import ghidra.program.database.mem.*; @@ -847,4 +846,29 @@ public interface Memory extends AddressSetView { } return list; } + + /** + * Gets a list of addresses where the byte at the given offset + * from the given FileBytes was loaded into memory. + * @param offset the file offset in the given FileBytes of the byte that is to be + * located in memory + * @param fileBytes the FileBytesobject whose byte is to be located in memory + * @return a list of addresses that are associated with the given + * FileBytes and offset + */ + public default List
locateAddressesForFileBytesOffset(FileBytes fileBytes, long offset) { + List
list = new ArrayList<>(); + for (MemoryBlock memBlock : getBlocks()) { + for (MemoryBlockSourceInfo info : memBlock.getSourceInfos()) { + Optional blockFileBytes = info.getFileBytes(); + if (blockFileBytes.isPresent() && blockFileBytes.get().equals(fileBytes)) { + Address addr = info.locateAddressForFileOffset(offset); + if (addr != null) { + list.add(addr); + } + } + } + } + return list; + } } diff --git a/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/program/database/mem/MemBlockDBTest.java b/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/program/database/mem/MemBlockDBTest.java index 075e62afb4..810f5bdfb7 100644 --- a/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/program/database/mem/MemBlockDBTest.java +++ b/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/program/database/mem/MemBlockDBTest.java @@ -294,6 +294,25 @@ public class MemBlockDBTest extends AbstractGenericTest { catch (IndexOutOfBoundsException e) { // expected } + } + + @Test + public void testGetAddressForFileBytesAndOffset() throws Exception { + FileBytes fileBytes = createFileBytes(); + mem.createInitializedBlock("test1", addr(100), fileBytes, 10, 50, false); + mem.createInitializedBlock("test2", addr(200), fileBytes, 40, 50, false); + + List
addresses = mem.locateAddressesForFileBytesOffset(fileBytes, 0); + assertTrue(addresses.isEmpty()); + + addresses = mem.locateAddressesForFileBytesOffset(fileBytes, 10); + assertEquals(1, addresses.size()); + assertEquals(addr(100), addresses.get(0)); + + addresses = mem.locateAddressesForFileBytesOffset(fileBytes, 40); + assertEquals(2, addresses.size()); + assertTrue(addresses.contains(addr(130))); + assertTrue(addresses.contains(addr(200))); }