Toggle Light / Dark / Auto color theme
Toggle table of contents sidebar
angr.knowledge_plugins.propagations.propagation_model 源代码
from __future__ import annotations
from typing import Any
from collections import defaultdict
import claripy
import ailment
from angr.serializable import Serializable
from angr.knowledge_plugins.functions.function import Function
from .states import PropagatorVEXState , PropagatorState
[文档]
class PropagationModel ( Serializable ):
"""
This class stores the propagation result that comes out of Propagator.
"""
__slots__ = (
"_function" ,
"_initial_state" ,
"block_initial_reg_values" ,
"equivalence" ,
"graph_visitor" ,
"input_states" ,
"key" ,
"node_iterations" ,
"replacements" ,
"states" ,
)
[文档]
def __init__ (
self ,
prop_key : tuple ,
node_iterations : defaultdict [ Any , int ] | None = None ,
states : dict | None = None ,
block_initial_reg_values : dict | None = None ,
replacements : defaultdict [ Any , dict ] | None = None ,
equivalence : set | None = None ,
function : Function | None = None ,
input_states : dict | None = None ,
):
self . key = prop_key
self . node_iterations = node_iterations if node_iterations is not None else defaultdict ( int )
self . input_states = input_states if input_states is not None else {}
self . states = states if states is not None else {}
self . block_initial_reg_values = block_initial_reg_values if block_initial_reg_values is not None else {}
self . replacements = replacements
self . equivalence = equivalence if equivalence is not None else set ()
self . graph_visitor = None
self . _initial_state = None
self . _function = function
[文档]
def downsize ( self ):
self . node_iterations = None
self . block_initial_reg_values = None
self . states = None
self . input_states = None
self . graph_visitor = None
[文档]
def block_beginning_state ( self , block_addr ) -> PropagatorState :
if self . _function is None :
raise NotImplementedError
node = self . _function . get_node ( block_addr )
preds = [ self . states [ pnode . addr ] for pnode in self . _function . graph . predecessors ( node )]
if not preds :
if isinstance ( node , ailment . Block ):
raise NotImplementedError
state = PropagatorVEXState . initial_state ( self . _function . project , func_addr = self . _function . addr )
state . store_register ( state . arch . ip_offset , state . arch . bytes , claripy . BVV ( block_addr , state . arch . bits ))
else :
state , _ = preds [ 0 ] . merge ( * preds [ 1 :])
return state