ControlFlowGraph

Struct ControlFlowGraph 

Source
pub struct ControlFlowGraph {
    pub graph: DiGraph<BasicBlock, EdgeType>,
    pub loops: Vec<LoopInfo>,
    pub dominators: Option<Dominators<NodeIndex>>,
    /* private fields */
}
Expand description

Control Flow Graph with proper basic block analysis

Fields§

§graph: DiGraph<BasicBlock, EdgeType>§loops: Vec<LoopInfo>

Detected loops in the CFG

§dominators: Option<Dominators<NodeIndex>>

Dominator tree information

Implementations§

Source§

impl ControlFlowGraph

Source

pub fn new() -> Self

Source

pub fn build_cfg(analysis: &BinaryAnalysis) -> Result<Self, String>

Build CFG from binary analysis with Capstone disassembly

Source

pub fn init_capstone(&self, architecture: &str) -> Result<Capstone, String>

Source

pub fn build_basic_blocks_from_symbols( &mut self, analysis: &BinaryAnalysis, _cs: &Capstone, ) -> Result<(), String>

Source

pub fn build_basic_blocks_from_binary( &mut self, analysis: &BinaryAnalysis, cs: &Capstone, binary_data: &[u8], ) -> Result<(), String>

Source

pub fn extract_code_sections_by_format( &self, analysis: &BinaryAnalysis, binary_data: &[u8], entry_point: u64, ) -> Result<Vec<CodeSection>, String>

Source

pub fn extract_elf_entry_point(&self, binary_data: &[u8]) -> Result<u64, String>

Source

pub fn extract_elf_code_sections( &self, binary_data: &[u8], ) -> Result<Vec<CodeSection>, String>

Source

pub fn get_elf_string_table( &self, binary_data: &[u8], shoff: u64, shentsize: u16, shstrndx: u16, is_64bit: bool, is_little_endian: bool, ) -> Option<Vec<u8>>

Source

pub fn get_string_from_table( &self, string_table: &[u8], offset: usize, ) -> Option<String>

Source

pub fn extract_pe_entry_point(&self, binary_data: &[u8]) -> Result<u64, String>

Source

pub fn extract_pe_code_sections( &self, binary_data: &[u8], ) -> Result<Vec<CodeSection>, String>

Source

pub fn extract_intel_hex_entry_point( &self, binary_data: &[u8], ) -> Result<u64, String>

Source

pub fn extract_intel_hex_code_sections( &self, binary_data: &[u8], entry_point: u64, ) -> Result<Vec<CodeSection>, String>

Source

pub fn extract_srec_entry_point( &self, binary_data: &[u8], ) -> Result<u64, String>

Source

pub fn extract_srec_code_sections( &self, binary_data: &[u8], entry_point: u64, ) -> Result<Vec<CodeSection>, String>

Source

pub fn extract_arm_cortex_m_entry_point( &self, binary_data: &[u8], ) -> Result<u64, String>

Source

pub fn extract_raw_firmware_entry_point( &self, analysis: &BinaryAnalysis, _binary_data: &[u8], ) -> Result<u64, String>

Source

pub fn extract_raw_firmware_code_sections( &self, binary_data: &[u8], entry_point: u64, ) -> Result<Vec<CodeSection>, String>

Source

pub fn disassemble_code_section( &mut self, cs: &Capstone, binary_data: &[u8], section: &CodeSection, entry_point: u64, ) -> Result<(), String>

Source

pub fn build_basic_blocks_from_instructions( &mut self, instructions: &Instructions<'_>, entry_point: u64, ) -> Result<(), String>

Source

pub fn get_block_end_address(&self, block: &BasicBlock) -> u64

Source

pub fn build_control_flow_edges(&mut self) -> Result<(), String>

Source

pub fn find_block_at_address(&self, address: u64) -> Option<NodeIndex>

Source

pub fn is_function_entry_heuristic( &self, addr: u64, instructions: &[Instruction], ) -> bool

Source

pub fn is_block_boundary_instruction(&self, insn: &Insn<'_>) -> bool

Source

pub fn is_branch_instruction(&self, insn: &Insn<'_>) -> bool

Source

pub fn is_call_instruction(&self, insn: &Insn<'_>) -> bool

Source

pub fn is_return_instruction(&self, insn: &Insn<'_>) -> bool

Source

pub fn get_branch_target(&self, insn: &Insn<'_>) -> Option<u64>

Source

pub fn is_conditional_block(&self, instructions: &[Instruction]) -> bool

Source

pub fn is_call_block(&self, instructions: &[Instruction]) -> bool

Source

pub fn extract_condition(&self, instructions: &[Instruction]) -> String

Source

pub fn extract_call_target(&self, instructions: &[Instruction]) -> String

Source

pub fn create_placeholder_instructions( &self, start_addr: u64, function_name: &str, ) -> Vec<Instruction>

Source

pub fn detect_loops(&mut self)

Source

pub fn build_dominators(&mut self)

Source

pub fn get_block_address(&self, block: &BasicBlock) -> Option<u64>

Source

pub fn get_block_address_by_node(&self, node_idx: NodeIndex) -> Option<u64>

Source

pub fn analyze_call_graph(&self, analysis: &BinaryAnalysis) -> CallGraphAnalysis

Analyze call graph relationships

Source

pub fn get_loop_headers(&self) -> Vec<u64>

Get basic blocks that are loop headers

Source

pub fn is_in_loop(&self, address: u64) -> bool

Check if an address is in a loop

Source

pub fn get_dominators(&self, node: NodeIndex) -> Option<Vec<NodeIndex>>

Get dominator information for a block

Trait Implementations§

Source§

impl Debug for ControlFlowGraph

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,