Package ghidra.app.util.opinion
Class MachoProgramBuilder
java.lang.Object
ghidra.app.util.opinion.MachoProgramBuilder
- Direct Known Subclasses:
DyldCacheProgramBuilder
,MachoPrelinkProgramBuilder
Builds up a Mach-O
Program
by parsing the Mach-O headers.-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final String
protected FileBytes
protected Listing
protected MessageLog
protected MachHeader
protected Memory
protected TaskMonitor
protected Program
protected ByteProvider
protected boolean
protected AddressSpace
-
Constructor Summary
ConstructorsModifierConstructorDescriptionprotected
MachoProgramBuilder
(Program program, ByteProvider provider, FileBytes fileBytes, boolean shouldAddChainedFixupsRelocations, MessageLog log, TaskMonitor monitor) Creates a newMachoProgramBuilder
based on the given information. -
Method Summary
Modifier and TypeMethodDescriptionprotected void
build()
static void
buildProgram
(Program program, ByteProvider provider, FileBytes fileBytes, boolean addChainedFixupsRelocations, MessageLog log, TaskMonitor monitor) Builds up a Mach-OProgram
.protected void
Fixes up the Program Tree to better visualize the memory blocks that were split into sectionsprotected void
markupChainedFixups
(List<Address> chainedFixups) Markup the givenList
of chained fixups by creating pointers at their locations, if possibleprotected void
markupHeaders
(MachHeader header, Address headerAddr) protected void
protected void
Fixes up any chained fixups.protected void
processDyldInfo
(boolean doClassic) protected void
Logs encrypted block rangesprotected void
Attempts to discover and set the entry point.protected boolean
processExports
(MachHeader header) protected void
Processes the external relocations from allDynamicSymbolTableCommand
s.protected void
The indirect symbols need to be applied across the IMPORT segment.protected void
protected void
Processes the local relocations from allDynamicSymbolTableCommand
s.protected void
processMemoryBlocks
(MachHeader header, String source, boolean processSections, boolean allowZeroAddr) Creates memory blocks for the given header.protected void
protected void
See crt.c from opensource.apple.comprotected void
Processes the section relocations from allSection
s.protected void
processSymbolTables
(MachHeader header, boolean processExports) protected void
protected void
ProcessesLoadCommand
s that we haven't implemented yet.protected void
protected void
Sets the image baseprotected void
protected Address
setupHeaderAddr
(Collection<SegmentCommand> segments) Sets up theMachHeader
in memory and returns its address.
-
Field Details
-
BLOCK_SOURCE_NAME
- See Also:
-
machoHeader
-
program
-
provider
-
fileBytes
-
shouldAddChainedFixupsRelocations
protected boolean shouldAddChainedFixupsRelocations -
log
-
monitor
-
memory
-
listing
-
space
-
-
Constructor Details
-
MachoProgramBuilder
protected MachoProgramBuilder(Program program, ByteProvider provider, FileBytes fileBytes, boolean shouldAddChainedFixupsRelocations, MessageLog log, TaskMonitor monitor) Creates a newMachoProgramBuilder
based on the given information.- Parameters:
program
- TheProgram
to build up.provider
- TheByteProvider
that contains the Mach-O's bytes.fileBytes
- Where the Mach-O's bytes came from.shouldAddChainedFixupsRelocations
- True if relocations should be added for chained fixups; otherwise, false.log
- The log.monitor
- A cancelable task monitor.
-
-
Method Details
-
buildProgram
public static void buildProgram(Program program, ByteProvider provider, FileBytes fileBytes, boolean addChainedFixupsRelocations, MessageLog log, TaskMonitor monitor) throws Exception Builds up a Mach-OProgram
.- Parameters:
program
- TheProgram
to build up.provider
- TheByteProvider
that contains the Mach-O's bytes.fileBytes
- Where the Mach-O's bytes came from.addChainedFixupsRelocations
- True if relocations should be added for chained fixups; otherwise, false.log
- The log.monitor
- A cancelable task monitor.- Throws:
Exception
- if a problem occurs.
-
build
- Throws:
Exception
-
setImageBase
Sets the image base- Throws:
Exception
- if there was a problem setting the image base
-
processEncryption
Logs encrypted block ranges- Throws:
Exception
- if there was a problem detecting the encrypted block ranges
-
processEntryPoint
Attempts to discover and set the entry point.- Throws:
Exception
- If there was a problem discovering or setting the entry point.
-
processMemoryBlocks
protected void processMemoryBlocks(MachHeader header, String source, boolean processSections, boolean allowZeroAddr) throws Exception Creates memory blocks for the given header.- Parameters:
header
- The Mach-O header to process for memory block creation.source
- A name that represents where the memory blocks came from.processSections
- True to split segments into their sections.allowZeroAddr
- True if memory blocks at address 0 should be processed; otherwise, false.- Throws:
Exception
- If there was a problem processing the memory blocks.
-
fixupProgramTree
Fixes up the Program Tree to better visualize the memory blocks that were split into sections- Throws:
Exception
- if there was a problem fixing up the Program Tree
-
processUnsupportedLoadCommands
ProcessesLoadCommand
s that we haven't implemented yet.- Throws:
CancelledException
- if the operation was cancelled.
-
processExports
- Throws:
Exception
-
processSymbolTables
- Throws:
Exception
-
processIndirectSymbols
The indirect symbols need to be applied across the IMPORT segment. The individual section do not really matter except the number of bytes between each symbol varies based on section.- Throws:
Exception
- if there is a problem
-
setRelocatableProperty
protected void setRelocatableProperty() -
processLibraries
protected void processLibraries() -
processProgramDescription
protected void processProgramDescription() -
renameObjMsgSendRtpSymbol
-
processUndefinedSymbols
- Throws:
Exception
-
processAbsoluteSymbols
- Throws:
Exception
-
processDyldInfo
protected void processDyldInfo(boolean doClassic) -
markupHeaders
- Throws:
Exception
-
setupHeaderAddr
protected Address setupHeaderAddr(Collection<SegmentCommand> segments) throws AddressOverflowException Sets up theMachHeader
in memory and returns its address. If the header was not intended to reside in memory (like for Mach-O object files}, then this method will create an area in the "OTHER" address space for the header to live in.- Parameters:
segments
- ACollection
ofMach-O segments
- Returns:
- The
Address
ofMachHeader
in memory - Throws:
AddressOverflowException
- if the address lies outside the address space
-
markupSections
- Throws:
Exception
-
processProgramVars
protected void processProgramVars()See crt.c from opensource.apple.com -
processSectionRelocations
Processes the section relocations from allSection
s.- Throws:
CancelledException
- if the operation was cancelled.
-
processExternalRelocations
Processes the external relocations from allDynamicSymbolTableCommand
s.- Throws:
CancelledException
- if the operation was cancelled.
-
processLocalRelocations
Processes the local relocations from allDynamicSymbolTableCommand
s.- Throws:
CancelledException
- if the operation was cancelled.
-
processChainedFixups
Fixes up any chained fixups. Relies on the __thread_starts section being present.- Returns:
- A list of addresses where chained fixups were performed.
- Throws:
Exception
- if there was a problem reading/writing memory.
-
markupChainedFixups
Markup the givenList
of chained fixups by creating pointers at their locations, if possible- Parameters:
chainedFixups
- TheList
of chained fixups to markup- Throws:
CancelledException
- if the operation was cancelled
-