Class AbstractGraphReorganizer<InsnType extends ILocatedInstruction>
java.lang.Object
com.pnfsoftware.jeb.core.units.code.android.controlflow.AbstractGraphReorganizer<InsnType>
Facility for CFG graph nodes reordering and graph address shifting.
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected abstract boolean
canFallthrough
(InsnType insn) Determine if the provided instruction is a flow breaker that falls-through (or may, if it's a conditional branch) into the first instruction of the next block.protected abstract InsnType
createNop
(long insnOffset, int insnSize) protected abstract InsnType
createTrampoline
(long insnOffset, long tempTarget) Retrieve a map holding the old offsets to their corresponding new offsets, in the reorganized CFG.Retrieve a CFG reorganized byreorder(int[])
.protected abstract boolean
hasTargets
(InsnType insn) Determine whether the instruction has targets that may be updated.reorder
(int[] newOrder) void
shift
(int shsize) Shift the CFG 'downward', ie, all addresses.protected abstract InsnType
updateInstructionOffset
(InsnType insn, long insnOffset) Update or copy the provided instruction and set its offset.protected abstract void
updateTargets
(InsnType insn, Map<Long, Long> map) protected abstract void
updateTrampolineTarget
(InsnType insn, long target)
-
Constructor Details
-
AbstractGraphReorganizer
-
-
Method Details
-
reorder
- Parameters:
newOrder
- an array of 0-based indices from 0 to n-1; providing [0, 1, ..., n-1] does nothing- Returns:
- a reordered CFG; null if the provided order was the original order
-
shift
public void shift(int shsize) Shift the CFG 'downward', ie, all addresses. This method works in-place; no new CFG is created (unlikereorder(int[])
).- Parameters:
shsize
- a strictly positive value; else the method will throw
-
getReorganizedCfg
Retrieve a CFG reorganized byreorder(int[])
.- Returns:
-
getConversionMap
Retrieve a map holding the old offsets to their corresponding new offsets, in the reorganized CFG.- Returns:
-
canFallthrough
Determine if the provided instruction is a flow breaker that falls-through (or may, if it's a conditional branch) into the first instruction of the next block.- Parameters:
insn
-- Returns:
-
updateInstructionOffset
Update or copy the provided instruction and set its offset. It is up to the implementation to decide whether instructions should be copied (consequence: the original CFG may be fully preserved, at the cost of speed and resources) or reused.- Parameters:
insn
- original instructioninsnOffset
- new offset- Returns:
- the provided instruction (updated), or a new (copy) of the instruction with the provided offset
-
createTrampoline
- Parameters:
insnOffset
-tempTarget
-- Returns:
-
createNop
- Parameters:
insnOffset
-insnSize
-- Returns:
-
updateTrampolineTarget
- Parameters:
insn
- must be a trampoline instructiontarget
-
-
hasTargets
Determine whether the instruction has targets that may be updated.- Parameters:
insn
-- Returns:
-
updateTargets
- Parameters:
insn
-map
-
-