diff --git a/Ghidra/Features/Base/data/noReturnFunctionConstraints.xml b/Ghidra/Features/Base/data/noReturnFunctionConstraints.xml index 46ae503640..d47b3c0f7b 100644 --- a/Ghidra/Features/Base/data/noReturnFunctionConstraints.xml +++ b/Ghidra/Features/Base/data/noReturnFunctionConstraints.xml @@ -5,6 +5,9 @@ MachOFunctionsThatDoNotReturn + + MachOFunctionsThatDoNotReturn + PEFunctionsThatDoNotReturn diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheHeader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheHeader.java index b8dee59278..a8f9463940 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheHeader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheHeader.java @@ -274,6 +274,29 @@ public class DyldCacheHeader implements StructConverter { public DyldCacheLocalSymbolsInfo getLocalSymbolsInfo() { return localSymbolsInfo; } + + /** + * Gets the {@link DyldCacheSlideInfoCommon}. + * + * @return the {@link DyldCacheSlideInfoCommon}. Common, or particular version + */ + public DyldCacheSlideInfoCommon getSlideInfo() { + return slideInfo; + } + + /** + * @return slideInfoOffset + */ + public long getSlideInfoOffset() { + return slideInfoOffset; + } + + /** + * @return slideInfoSize + */ + public long getSlideInfoSize() { + return slideInfoSize; + } /** * Gets the {@link List} of branch pool address. Requires header to have been parsed. diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheSlideInfo1.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheSlideInfo1.java index a515267df1..646e1c7706 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheSlideInfo1.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheSlideInfo1.java @@ -27,7 +27,6 @@ import ghidra.util.exception.DuplicateNameException; * * @see launch-cache/dyld_cache_format.h */ -@SuppressWarnings("unused") public class DyldCacheSlideInfo1 extends DyldCacheSlideInfoCommon { private int toc_offset; @@ -36,6 +35,26 @@ public class DyldCacheSlideInfo1 extends DyldCacheSlideInfoCommon { private int entries_count; private int entries_size; + public int getTocOffset() { + return toc_offset; + } + + public int getTocCount() { + return toc_count; + } + + public int getEntriesOffset() { + return entries_offset; + } + + public int getEntriesCount() { + return entries_count; + } + + public int getEntriesSize() { + return entries_size; + } + /** * Create a new {@link DyldCacheSlideInfo1}. * diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheSlideInfo2.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheSlideInfo2.java index 8afea2c870..ca094eb076 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheSlideInfo2.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheSlideInfo2.java @@ -27,7 +27,6 @@ import ghidra.util.exception.DuplicateNameException; * * @see launch-cache/dyld_cache_format.h */ -@SuppressWarnings("unused") public class DyldCacheSlideInfo2 extends DyldCacheSlideInfoCommon { private int page_size; @@ -37,7 +36,45 @@ public class DyldCacheSlideInfo2 extends DyldCacheSlideInfoCommon { private int page_extras_count; private long delta_mask; private long value_add; + private short page_starts_entries[]; + private short page_extras_entries[]; + public long getPageSize() { + return ((long)page_size) & 0xffffffff; + } + + public long getPageStartsOffset() { + return ((long) page_starts_offset) & 0xffffffff; + } + + public long getPageStartsCount() { + return ((long) page_starts_count) & 0xffffffff; + } + + public long getPageExtrasOffset() { + return ((long) page_extras_offset) & 0xffffffff; + } + + public long getPageExtrasCount() { + return ((long) page_extras_count) & 0xffffffff; + } + + public long getDeltaMask() { + return delta_mask; + } + + public long getValueAdd() { + return value_add; + } + + public short[] getPageStartsEntries() { + return page_starts_entries; + } + + public short[] getPageExtrasEntries() { + return page_extras_entries; + } + /** * Create a new {@link DyldCacheSlideInfo2}. * @@ -53,6 +90,8 @@ public class DyldCacheSlideInfo2 extends DyldCacheSlideInfoCommon { page_extras_count = reader.readNextInt(); delta_mask = reader.readNextLong(); value_add = reader.readNextLong(); + page_starts_entries = reader.readNextShortArray(page_starts_count); + page_extras_entries = reader.readNextShortArray(page_extras_count); } @Override diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheSlideInfo3.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheSlideInfo3.java index 2d68804a31..2d98ba0a59 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheSlideInfo3.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/macho/dyld/DyldCacheSlideInfo3.java @@ -27,7 +27,6 @@ import ghidra.util.exception.DuplicateNameException; * * @see launch-cache/dyld_cache_format.h */ -@SuppressWarnings("unused") public class DyldCacheSlideInfo3 extends DyldCacheSlideInfoCommon { private int page_size; @@ -35,6 +34,22 @@ public class DyldCacheSlideInfo3 extends DyldCacheSlideInfoCommon { private long auth_value_add; private short page_starts[]; + public int getPageSize() { + return page_size; + } + + public int getPageStartsCount() { + return page_starts_count; + } + + public long getAuthValueAdd() { + return auth_value_add; + } + + public short[] getPageStarts() { + return page_starts; + } + /** * Create a new {@link DyldCacheSlideInfo3}. * diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/DyldCacheLoader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/DyldCacheLoader.java index a57a44bc5e..c773b1cc3a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/DyldCacheLoader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/DyldCacheLoader.java @@ -20,6 +20,7 @@ import java.util.*; import ghidra.app.util.MemoryBlockUtils; import ghidra.app.util.Option; +import ghidra.app.util.OptionUtils; import ghidra.app.util.bin.BinaryReader; import ghidra.app.util.bin.ByteProvider; import ghidra.app.util.bin.format.macho.dyld.DyldArchitecture; @@ -47,8 +48,14 @@ public class DyldCacheLoader extends AbstractLibrarySupportLoader { static final String CREATE_DYLIB_SECTIONS_OPTION_NAME = "Create DYLIB section memory blocks"; /** Default value for loader option to create memory blocks for DYLIB sections */ - static final boolean CREATE_DYLIB_SECTIONS_OPTION_DEFAULT = true; + static final boolean CREATE_DYLIB_SECTIONS_OPTION_DEFAULT = false; + /** Loader option to add relocation entries for each fixed chain pointer */ + static final String ADD_RELOCATION_ENTRIES_OPTION_NAME = "Add relocation entries for fixed chain pointers"; + + /** Default value for loader option add relocation entries */ + static final boolean ADD_RELOCATION_ENTRIES_OPTION_DEFAULT = false; + @Override public Collection findSupportedLoadSpecs(ByteProvider provider) throws IOException { List loadSpecs = new ArrayList<>(); @@ -84,7 +91,8 @@ public class DyldCacheLoader extends AbstractLibrarySupportLoader { try { DyldCacheProgramBuilder.buildProgram(program, provider, MemoryBlockUtils.createFileBytes(program, provider, monitor), - shouldProcessSymbols(options), shouldCreateDylibSections(options), log, monitor); + shouldProcessSymbols(options), shouldCreateDylibSections(options), + shouldAddRelocationEntries(options), log, monitor); } catch (CancelledException e) { return; @@ -105,34 +113,25 @@ public class DyldCacheLoader extends AbstractLibrarySupportLoader { list.add( new Option(CREATE_DYLIB_SECTIONS_OPTION_NAME, CREATE_DYLIB_SECTIONS_OPTION_DEFAULT, Boolean.class, Loader.COMMAND_LINE_ARG_PREFIX + "-createDylibSections")); + list.add( + new Option(ADD_RELOCATION_ENTRIES_OPTION_NAME, ADD_RELOCATION_ENTRIES_OPTION_DEFAULT, + Boolean.class, Loader.COMMAND_LINE_ARG_PREFIX + "-addRelocationEntries")); } return list; } private boolean shouldProcessSymbols(List