package binsec
Install
Dune Dependency
Authors
-
AAdel Djoudi
-
BBenjamin Farinier
-
CChakib Foulani
-
DDorian Lesbre
-
FFrédéric Recoules
-
GGuillaume Girol
-
JJosselin Feist
-
LLesly-Ann Daniel
-
MManh-Dung Nguyen
-
MMathéo Vergnolle
-
MMathilde Ollivier
-
MMatthieu Lemerre
-
OOlivier Nicole
-
RRichard Bonichon
-
RRobin David
-
SSébastien Bardin
-
SSoline Ducousso
-
TTa Thanh Dinh
-
YYaëlle Vinçont
Maintainers
Sources
sha256=5e1d0f26a567df4abcbeb964b454cf8b2c8484194ff2d9639bdeb94d63edcb3b
sha512=a638c665407fde9aadbd57a7b9f84260db8f03c0cbf65722732d43dfc93122d801e31977e0ba7cd249b340262caf216bca746a3520d0e01d487a5baf6a6c77e6
doc/binsec/Binsec/Ghidra_cfg/index.html
Module Binsec.Ghidra_cfg
type kind =
| Fallthrough
(*The instruction jumps to its immediate follower.
*)| Branch
(*The instruction branchs to another one.
*)| Call
(*The instruction calls a function.
*)| Return of Virtual_address.t
(*The instruction returns to the caller.
*)| Presumed
(*The instruction calls a function that may not return properly. Its immediate follower is taken as successor.
*)
include Graph.Sig.I
with type V.t = Virtual_address.t
and type E.t = Virtual_address.t * kind * Virtual_address.t
An imperative graph is a graph.
include Graph.Sig.G
with type V.t = Virtual_address.t
with type E.t = Virtual_address.t * kind * Virtual_address.t
Graph structure
module V : Graph.Sig.VERTEX with type t = Virtual_address.t
Vertices have type V.t
and are labeled with type V.label
(note that an implementation may identify the vertex with its label)
type vertex = V.t
module E :
Graph.Sig.EDGE
with type vertex = vertex
with type t = Virtual_address.t * kind * Virtual_address.t
Edges have type E.t
and are labeled with type E.label
. src
(resp. dst
) returns the origin (resp. the destination) of a given edge.
type edge = E.t
Size functions
val is_empty : t -> bool
val nb_vertex : t -> int
val nb_edges : t -> int
Degree of a vertex
Membership functions
find_edge g v1 v2
returns the edge from v1
to v2
if it exists. Unspecified behaviour if g
has several edges from v1
to v2
.
find_all_edges g v1 v2
returns all the edges from v1
to v2
.
Successors and predecessors
You should better use iterators on successors/predecessors (see Section "Vertex iterators").
Labeled edges going from/to a vertex
Graph iterators
Iter on all edges of a graph. Edge label is ignored.
Fold on all edges of a graph. Edge label is ignored.
Map on all vertices of a graph.
The current implementation requires the supplied function to be injective. Said otherwise, map_vertex
cannot be used to contract a graph by mapping several vertices to the same vertex. To contract a graph, use instead create
, add_vertex
, and add_edge
.
Vertex iterators
Each iterator iterator f v g
iters f
to the successors/predecessors of v
in the graph g
and raises Invalid_argument
if v
is not in g
. It is the same for functions fold_*
which use an additional accumulator.
<b>Time complexity for ocamlgraph implementations:</b> operations on successors are in O(1) amortized for imperative graphs and in O(ln(|V|)) for persistent graphs while operations on predecessors are in O(max(|V|,|E|)) for imperative graphs and in O(max(|V|,|E|)*ln|V|) for persistent graphs.
iter/fold on all successors/predecessors of a vertex.
iter/fold on all edges going from/to a vertex.
val create : ?size:int -> unit -> t
create ()
returns an empty graph. Optionally, a size can be given, which should be on the order of the expected number of vertices that will be in the graph (for hash tables-based implementations). The graph grows as needed, so size
is just an initial guess.
val clear : t -> unit
Remove all vertices and edges from the given graph.
copy g
returns a copy of g
. Vertices and edges (and eventually marks, see module Mark
) are duplicated.
add_vertex g v
adds the vertex v
to the graph g
. Do nothing if v
is already in g
.
remove g v
removes the vertex v
from the graph g
(and all the edges going from v
in g
). Do nothing if v
is not in g
.
<b>Time complexity for ocamlgraph implementations:</b> O(|V|*ln(D)) for unlabeled graphs and O(|V|*D) for labeled graphs. D is the maximal degree of the graph.
add_edge g v1 v2
adds an edge from the vertex v1
to the vertex v2
in the graph g
. Add also v1
(resp. v2
) in g
if v1
(resp. v2
) is not in g
. Do nothing if this edge is already in g
.
add_edge_e g e
adds the edge e
in the graph g
. Add also E.src e
(resp. E.dst e
) in g
if E.src e
(resp. E.dst e
) is not in g
. Do nothing if e
is already in g
.
remove_edge g v1 v2
removes the edge going from v1
to v2
from the graph g
. If the graph is labelled, all the edges going from v1
to v2
are removed from g
. Do nothing if this edge is not in g
.
val parse_cache : path:string -> t * string Virtual_address.Htbl.t
parse_cache ~path
build a new graph from the saved textual output of a previously Ghidra run.
val run_ghidra :
?temp_dir:string ->
?cache:string ->
runner:string ->
string ->
t * string Virtual_address.Htbl.t
run_ghidra ?cache ~runner binary
run Ghidra disassembly on the binary file and extract its control flow graph.
val import : unit -> t * string Virtual_address.Htbl.t
import ()
calls run_ghidra
or parse_cache
on the executatble file (Kernel_options.ExecFile
) according to the global options Ghidra_options.Runner
and Ghidra_options.Cache
.