From 5d80deb9aeba0ef1d9ca07c4b866b48e8d805375 Mon Sep 17 00:00:00 2001 From: emteere <47253321+emteere@users.noreply.github.com> Date: Wed, 9 Oct 2019 17:48:46 -0400 Subject: [PATCH] GT-3221_emteere implemented extra pointer chaining --- .../util/opinion/DyldCacheProgramBuilder.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/DyldCacheProgramBuilder.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/DyldCacheProgramBuilder.java index c7961a34c1..63c54f387b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/DyldCacheProgramBuilder.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/DyldCacheProgramBuilder.java @@ -268,6 +268,7 @@ public class DyldCacheProgramBuilder extends MachoProgramBuilder { long valueAdd = slideInfo2.getValueAdd(); short[] pageEntries = slideInfo2.getPageStartsEntries(); + short[] extraEntries = slideInfo2.getPageExtrasEntries(); monitor.setMessage("Fixing chained data page pointers..."); @@ -284,15 +285,20 @@ public class DyldCacheProgramBuilder extends MachoProgramBuilder { continue; } if (pageEntry == DYLD_CACHE_SLIDE_PAGE_ATTR_EXTRA ) { - continue; // TODO: handle extras + // go into extras and process list of chain entries for the same page + int extraIndex = (pageEntry & CHAIN_OFFSET_MASK); + do { + pageEntry = ((int) extraEntries[extraIndex]) & 0xffff; + long pageOffset = (pageEntry & CHAIN_OFFSET_MASK) * BYTES_PER_CHAIN_OFFSET; + + fixedAddresses.addAll(processPointerChain(page, pageOffset, deltaMask, deltaShift, valueAdd)); + extraIndex++; + } while ((pageEntry & DYLD_CACHE_SLIDE_PAGE_ATTR_EXTRA) == 0); } else { long pageOffset = (pageEntry & CHAIN_OFFSET_MASK) * BYTES_PER_CHAIN_OFFSET; - Address chainHead = memory.getProgram().getImageBase(); - chainHead = chainHead.getNewAddress(page); - - fixedAddresses.addAll(processPointerChain(chainHead, pageOffset, deltaMask, deltaShift, valueAdd)); + fixedAddresses.addAll(processPointerChain(page, pageOffset, deltaMask, deltaShift, valueAdd)); } } @@ -314,8 +320,11 @@ public class DyldCacheProgramBuilder extends MachoProgramBuilder { * @throws MemoryAccessException * @throws CancelledException */ - private List
processPointerChain(Address chainStart, long nextOff, long deltaMask, long deltaShift, long valueAdd) + private List
processPointerChain(long page, long nextOff, long deltaMask, long deltaShift, long valueAdd) throws MemoryAccessException, CancelledException { + Address chainStart = memory.getProgram().getImageBase(); + chainStart = chainStart.getNewAddress(page); + List
fixedAddresses = new ArrayList<>(); byte origBytes[] = new byte[8];