package bap-std
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=63ada71fa4f602bd679174dc6bf780d54aeded40ad4ec20d256df15886e3d2d5
md5=b8b1aff8c6846f2213eafc54de07b304
doc/bap/Bap/Std/index.html
Module Bap.Std
Overview
Layered Architecture
The BAP library has the layered architecture consisting of four layers. Although the layers are not really observable from outside of the library, they make it easier to learn the library as they introduce new concepts sequentially. On top of these layers, the Project module is defined that consolidates all information about a target of analysis. The Project module may be viewed as an entry point to the library.
+-----------------------------------------------------+ | +--------+ +-----------------------------------+ | | | | | | | | | | | Foundation Library | | | | | | | | | | | +-----------------------------------+ | | | P | | | | | +-----------------------------------+ | | | R | | | | | | | | Memory Model | | | | O | | | | | | | +-----------------------------------+ | | | J | | | | | +-----------------------------------+ | | | E | | | | | | | | Disassembly | | | | C | | | | | | | +-----------------------------------+ | | | T | | | | | +-----------------------------------+ | | | | | | | | | | | Semantic Analysis | | | | | | | | | +--------+ +-----------------------------------+ | +-----------------------------------------------------+
The Foundation library defines BAP Instruction language data types, as well as other useful data structures, like Value, Trie, Vector, etc. The Memory model layer is responsible for loading and parsing binary objects and representing them in a computer memory. It also defines a few useful data structures that are used extensively by later layers, e.g., Table and Memmap. The next layer performs disassembly and lifting to BIL. Finally, the semantic analysis layer transforms a binary into an IR representation, that is suitable for writing analysis.
Plugin Architecture
The standard library tries to be as extensible as possible. We are aware, that there are not good solutions for some problems, so we don't want to force our way of doing things. In short, we're trying to provide mechanisms, not policies. We achieve this by employing the dependency injection principle. By inversing the dependency we allow the library to depend on a user code. For example, a user code can teach the library how to disassemble the binary or even how to reconstruct the CFG. In fact, the library by itself doesn't contain the disassembler or lifter, or any architecture specific code. Everything is injected later by corresponding plugins.
The library defines a fixed set of extension points. (Other libraries, that constitute the Platform and follow the same principle, can define their own extension points, so the following set is not complete):
- loader - add new file formats (see
Image.register_backendorProject.Input); - target - add new architecture (see
register_target); - disassembler - plug in a disassembler (see 'disasm.hpp' for c++ disassembler interface);
- attributes - extend the attribute type (
Value.Tag.register); - symbolizer - add names to functions (see
Symbolizer); - rooter - find function starts (see
Rooter); - brancher - resolve jump destinations (see
Brancher) - reconstructor - CFG reconstruction algorithm (see
Reconstructor); - analysis - write your own arbitrary analysis pass (see
Project.register_pass)
The Regular.Std library, that forms a foundation for the BAP Standard Library, also follows the dependency injection principle, so every data type that implements regular interface, can be dynamically extended with:
- pretty printing function;
- serialization subroutines;
- caching.
Writing the analysis
A common use case, is to write some analysis that will take the program in some representation and then either output result of analysis in a human or machine readable way, or transform the program, in a way that can be employed by other analysis. Following a naming convention of a more established community of compiler writers, we name such analysis a _pass_.
The library itself doesn't run any analysis, it part of the job of a frontend to run it. In particular, the bap frontend, will run the analyses based on a command line specification. See bap --help for more information.
We use Project data structure to represent a program and all associated knowledge that we were capable to infer. To learn how to use the project data structure continue to Working with project.
Foundation Library
At this layer we define (Binary Instruction language) and few other useful data structures:
- arch - describes computer architecture;
- size - word and register sizes;
- var - BIL variable;
- typ - BIL type system;
- exp - BIL expression sub-language;
- stmt - BIL statements;
- bitvector - a bitvector data structure to represent immediate data, used usually by their aliases
wordandaddr; - value - an extensible variant type;
- dict - an extensible record;
- vector - an array that can grow;
- Trie - prefix trees;
Most of the types implement the Regular interface. This interface is very similar to Core's Identifiable, and is supposed to represent a type that is as common as a built-in type. One should expect to find any function that is implemented for such types as int, string, char, etc. Namely, this interface includes:
- comparison functions: (
<, >, <= , >= , compare, between, ...); - each type defines a polymorphic
Mapwith keys of typet; - each type provides a
Setwith values of typet; - hashtable is exposed via
Tablemodule; - hashset is available under
Hash_setname - sexpable and binable interface;
to_string,str,pp,ppo,ppsfunctions for pretty-printing.
It is a convention, that for each type, there is a module with the same name that implements its interface. For example, type exp is a type abbreviation for Exp.t, and module Exp contains all functions and types related to type exp. For example, to create a hashtable of statements, just type:
let table = Exp.Table.create ()
If a type is a variant type (i.e., it defines constructors) then for each constructor named Name, there exists a corresponding function named name that will accept the same number of arguments as the arity of the constructor (also named a _functional constructor_). For example, a Bil.Int can be constructed with the Bil.int function that has type word -> exp. If a constructor has several arguments of the same type we usually disambiguate using labels, e.g., Bil.Load of (exp,exp,endian,size) has function Bil.load with type: mem:exp -> addr:exp -> endian -> size -> exp
Value
Universal values can be viewed as extensible variants on steroids. Not only they maybe extended, but they also can be serialized, compared with user-defined comparison function and even pretty printed.
Dict
Like value is an extensible sum type, dict can be viewed as an extensible product type. Dict is a sequence of values of type value, with tags used as field names. Of course, fields are unique.
Vector
Vector is an implementation of C++ STL like vectors with logarithmic push back.
Tries
The Foundation library also defines a prefix tree data structure that proves to be useful for binary analysis applications. Tries in BAP is a functor that derives a polymorphic trie data structure for a given Key.
For convenience we support instantiating tries for most of our data structures. For example, Word has several tries inside.
For the common string trie, there's Trie.String.
Memory model
This layer is responsible for the representation of binaries. It provides interfaces for the memory objects:
- mem - a contiguous array of bytes, indexed with absolute addresses;
- 'a table - a mapping from a memory regions to arbitrary data (no duplicates or intersections);
- a memmap - a mapping from memory region to arbitrary data with duplicates and intersections allowed, aka segment tree or interval map;
- image - represents a binary object with all its symbols, segments, sections and other meta information.
The Image module uses the plugin system to load binary objects. In order to add new loader, one should implement the Backend.t loader function and register it with the Image.register_backend function.
Disassembler
This layer defines the interfaces for disassemblers. Two interfaces are provided:
- Disasm - a regular interface that hides all complexities, but may not always be very flexible.
- Disasm_expert - an expert interface that provides access to a low-level representation. It is very flexible and fast, but harder to use.
To disassemble files or data with the regular interface, use one of the following functions:
Disasm.of_mem- to disassemble a region of memory;Disasm.of_image- to disassemble a loaded binary object;Disasm.of_file- to disassemble file.
All these functions perform disassembly by recursive descent, reconstruct the control flow graph, and perform lifting.
The result of disassembly is represented by the abstract value of type disasm. Two main data structures that are used to represent disassembled program are:
The following figure shows the relationship between basic data structures of the disassembled program.
+-----------------+ | +-------------+ | | | disasm | | | +-------------+ | | | | | | * | | +-------------+ | | | block | | | +-------------+ | | | | | | * | | +-------------+ | | | insn | | | +-------------+ | | | | | | * | | +-------------+ | | | stmt | | | +-------------+ | +-----------------+
A disassembled program is represented as a set of interconnected basic blocks, called a whole program control flow graph (CFG) and it is indeed represented as a graph Graphs.Cfg. See graphlib for more information on graphs.
Each block is a container to a sequence of machine instructions. It is guaranteed that there's at least one instruction in the block, thus the Block.leader and Block.terminator functions are total.
Each machine instruction is represented by its opcode, name and array of operands (these are machine and disassembler specific), a set of predicates (that approximates instruction semantics on a very high level), and a sequence of BIL statements that precisely define the semantics of the instruction.
The expert interface exposes low level interface that provides facilities for building custom implementations of disassemblers. The interface to the disassembler backend is exposed via the Disasm_expert.Basic module. New backends can be added by implementing the 'disasm.hpp' interface.
Modules of type CPU provide a high level abstraction of the machine CPU and allow one to reason about the instruction semantics independently from the target platform. The module type Target brings CPU and ABI together. To get an instance of this module, you can use the target_of_arch function. Architecture specific implementations of the Target interface may (and usually do) provide more information, see corresponding support libraries for ARM and x86 architectures.
Semantic Analysis
On the semantic level the disassembled program is lifted into the BAP Intermediate Representation (BIR). BIR is a semi-graphical representation of BIL (where BIL represents a program as Abstract Syntax Tree). The BIR provides mechanisms to express richer relationships between program terms and it also easier to use for most use cases, especially for data dependency analysis.
The program in IR is build of terms. In fact the program itself is also a term. There're only 7 kinds of terms:
- program - the program in whole;
- sub - subroutine;
- arg - subroutine argument;
- blk - basic block;
- def - definition of a variable;
- phi - phi-node in the SSA form;
- jmp - a transfer of control.
Unlike expressions and statements in BIL, IR's terms are concrete entities. Concrete entity is such entity that can change in time and space, as well as come in and out of existence. Contrary, abstract entity is eternal and unchangeable. Identity denotes the sameness of a concrete entity as it changes in time. Abstract entities don't have an identity since they are immutable. Program is built of concrete entities called terms. Terms have attributes that can change in time, without affecting the identity of a term. Attributes are abstract entities. In each particular point of space and time a term is represented by a snapshot of all its attributes, colloquially called value. Functions that change the value of a term in fact return a new value with different set of attributes. For example, def term has two attributes: left hand side (lhs), that associates definition with abstract variable, and right hand side (rhs) that associates def with an abstract expression. Suppose, that the definition was:
# let d_1 = Def.create x Bil.(var y + var z);;
val d_1 : Def.t = 00000001: x := y + zTo change the right hand side of a definition we use Def.with_rhs that returns the same definition but with different value:
# let d_2 = Def.with_rhs d_1 Bil.(int Word.b1);;
val d_2 : Def.t = 00000001: x := trued_1 and d_2 is different values
# Def.equal d_1 d_2;;
- : bool = falseof the same term
# Term.same d_1 d_2;;
- : bool = trueThe identity of this terms is denoted by the term identifier (tid). In the textual representation term identifiers are printed as ordinal numbers.
Terms, can contain other terms. But unlike BIL expressions or statements, this relation is not truly recursive, since the structure of program term is fixed: arg, phi, def, jmp are leaf terms; sub can only contain arg's or blk's; blk consists of phi, def and jmp sequences of terms, as pictured in the figure below. Although, the term structure is closed to changes, you still can extend particular term with attributes, using set_attr and get_attr functions of the Term module. This functions are using extensible variant type to encode attributes.
+--------------------------------------------------------+ | +-------------------+ | | | program | | | +---------+---------+ | | |* | | +---------+---------+ | | | sub | | | +---------+---------+ | | | | | +-----------------+---------------+ | | |* |* | | +-----+-------+ +-------+-------+ | | | arg | | blk | | | +-------------+ +-------+-------+ | | | | | +---------------+--------------+ | | |* |* | * | | +-----+-----+ +-----+-----+ +----+-----+ | | | phi | | def | | jmp | | | +-----------+ +-----------+ +----------+ | +--------------------------------------------------------+
Working with project
There're two general approaches to obtain a value of type project:
- create it manually using
Project.createfunction; - write a plugin to the
bapfrontend.
Although the first approach is simplistic and gives you a full control, we still recommend to use the latter.
To write a program analysis plugin (or pass in short) you need to implement a function with one of the following interfaces:
project -> projectand register it with register_pass;project -> unitand register it with register_pass';
Once loaded from the bap frontend (see bap --help) this function will be invoked with a value of type project that provides access to all information gathered from the input source. If the registered function returns a non unit type, then it can functionally update the project state, e.g., add annotations, discover new symbols, transform program representation, etc.
Example
The following plugin prints all sections in a file:
open Core_kernel
open Bap.Std
open Format
let print_sections p =
Project.memory p |> Memmap.to_sequence |> Seq.iter ~f:(fun (mem,x) ->
Option.iter (Value.get Image.section x) ~f:(fun name ->
printf "Section: %s@.%a@." name Memory.pp mem))
let () = Project.register_pass' print_sectionsNote: this functionality is provided by the print plugin.
Passing information between passes
To pass data from one pass to another in a type safe manner, we use universal values. Values can be attached to a particular memory region, IR terms, or put into the storage dictionary. For the first case we use the memmap data structure. It is an interval tree containing all the memory regions that are used during analysis. For the storage we use Dict data structure. Also, each program term, has its own dictionary.
Memory annotations
By default the memory is annotated with the following attributes:
- section -- for regions of memory that had a particular name in the original binary. For example, in ELF, sections have names that annotate a corresponding memory region. If project was created from memory object, then the overall memory will be marked as a
"bap.user"section.
- segment -- if the binary data was loaded from a binary format that contains segments, then the corresponding memory regions are be marked. Segments provide access to permission information.
BAP API
module Integer : sig ... endAbstract integral type.
module Seq : module type of Regular.Std.Seq with type 'a t = 'a Base.Sequence.tLazy sequence
type 'a seq = 'a Seq.ttype abbreviation for 'a Sequence.t
val bin_size_seq :
'a Core_kernel.Bin_prot.Size.sizer ->
'a seq Core_kernel.Bin_prot.Size.sizerval bin_write_seq :
'a Core_kernel.Bin_prot.Write.writer ->
'a seq Core_kernel.Bin_prot.Write.writerval bin_writer_seq :
'a Core_kernel.Bin_prot.Type_class.writer ->
'a seq Core_kernel.Bin_prot.Type_class.writerval bin_read_seq :
'a Core_kernel.Bin_prot.Read.reader ->
'a seq Core_kernel.Bin_prot.Read.readerval __bin_read_seq__ :
'a Core_kernel.Bin_prot.Read.reader ->
(int -> 'a seq) Core_kernel.Bin_prot.Read.readerval bin_reader_seq :
'a Core_kernel.Bin_prot.Type_class.reader ->
'a seq Core_kernel.Bin_prot.Type_class.readerval bin_seq :
'a Core_kernel.Bin_prot.Type_class.t ->
'a seq Core_kernel.Bin_prot.Type_class.tval sexp_of_seq :
('a -> Ppx_sexp_conv_lib.Sexp.t) ->
'a seq ->
Ppx_sexp_conv_lib.Sexp.tval seq_of_sexp :
(Ppx_sexp_conv_lib.Sexp.t -> 'a) ->
Ppx_sexp_conv_lib.Sexp.t ->
'a seqmodule Trie : sig ... endConstructs a trie
module Interval_tree : sig ... endBalanced Interval Tree.
val bin_size_value : value Core_kernel.Bin_prot.Size.sizerval bin_write_value : value Core_kernel.Bin_prot.Write.writerval bin_writer_value : value Core_kernel.Bin_prot.Type_class.writerval bin_read_value : value Core_kernel.Bin_prot.Read.readerval __bin_read_value__ : (int -> value) Core_kernel.Bin_prot.Read.readerval bin_reader_value : value Core_kernel.Bin_prot.Type_class.readerval bin_value : value Core_kernel.Bin_prot.Type_class.tval sexp_of_value : value -> Ppx_sexp_conv_lib.Sexp.tval value_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> valueval bin_size_dict : dict Core_kernel.Bin_prot.Size.sizerval bin_write_dict : dict Core_kernel.Bin_prot.Write.writerval bin_writer_dict : dict Core_kernel.Bin_prot.Type_class.writerval bin_read_dict : dict Core_kernel.Bin_prot.Read.readerval __bin_read_dict__ : (int -> dict) Core_kernel.Bin_prot.Read.readerval bin_reader_dict : dict Core_kernel.Bin_prot.Type_class.readerval bin_dict : dict Core_kernel.Bin_prot.Type_class.tval sexp_of_dict : dict -> Ppx_sexp_conv_lib.Sexp.tval dict_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> dictval bin_size_word : word Core_kernel.Bin_prot.Size.sizerval bin_write_word : word Core_kernel.Bin_prot.Write.writerval bin_writer_word : word Core_kernel.Bin_prot.Type_class.writerval bin_read_word : word Core_kernel.Bin_prot.Read.readerval __bin_read_word__ : (int -> word) Core_kernel.Bin_prot.Read.readerval bin_reader_word : word Core_kernel.Bin_prot.Type_class.readerval bin_word : word Core_kernel.Bin_prot.Type_class.tval sexp_of_word : word -> Ppx_sexp_conv_lib.Sexp.tval word_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> wordtype addr = wordA synonym for word, that should be used for words that are addresses
val bin_size_addr : addr Core_kernel.Bin_prot.Size.sizerval bin_write_addr : addr Core_kernel.Bin_prot.Write.writerval bin_writer_addr : addr Core_kernel.Bin_prot.Type_class.writerval bin_read_addr : addr Core_kernel.Bin_prot.Read.readerval __bin_read_addr__ : (int -> addr) Core_kernel.Bin_prot.Read.readerval bin_reader_addr : addr Core_kernel.Bin_prot.Type_class.readerval bin_addr : addr Core_kernel.Bin_prot.Type_class.tval sexp_of_addr : addr -> Ppx_sexp_conv_lib.Sexp.tval addr_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> addrmodule Size : sig ... endType safe operand and register sizes.
type size = Size.tsize of operand
val bin_size_size : size Core_kernel.Bin_prot.Size.sizerval bin_write_size : size Core_kernel.Bin_prot.Write.writerval bin_writer_size : size Core_kernel.Bin_prot.Type_class.writerval bin_read_size : size Core_kernel.Bin_prot.Read.readerval __bin_read_size__ : (int -> size) Core_kernel.Bin_prot.Read.readerval bin_reader_size : size Core_kernel.Bin_prot.Type_class.readerval bin_size : size Core_kernel.Bin_prot.Type_class.tval sexp_of_size : size -> Ppx_sexp_conv_lib.Sexp.tval size_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> sizetype addr_size = [ `r32 | `r64 ] Size.psize of address
val bin_size_addr_size : addr_size Core_kernel.Bin_prot.Size.sizerval bin_write_addr_size : addr_size Core_kernel.Bin_prot.Write.writerval bin_writer_addr_size : addr_size Core_kernel.Bin_prot.Type_class.writerval bin_read_addr_size : addr_size Core_kernel.Bin_prot.Read.readerval __bin_read_addr_size__ :
(int -> addr_size) Core_kernel.Bin_prot.Read.readerval bin_reader_addr_size : addr_size Core_kernel.Bin_prot.Type_class.readerval bin_addr_size : addr_size Core_kernel.Bin_prot.Type_class.tval sexp_of_addr_size : addr_size -> Ppx_sexp_conv_lib.Sexp.tval addr_size_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> addr_sizemodule Bitvector : sig ... endBitvector -- an integer with modular arithmentics.
Expose endian constructors to Bap.Std namespace
val sexp_of_endian : endian -> Ppx_sexp_conv_lib.Sexp.tval endian_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> endianval bin_size_endian : endian Core_kernel.Bin_prot.Size.sizerval bin_write_endian : endian Core_kernel.Bin_prot.Write.writerval bin_writer_endian : endian Core_kernel.Bin_prot.Type_class.writerval bin_read_endian : endian Core_kernel.Bin_prot.Read.readerval __bin_read_endian__ : (int -> endian) Core_kernel.Bin_prot.Read.readerval bin_reader_endian : endian Core_kernel.Bin_prot.Type_class.readerval bin_endian : endian Core_kernel.Bin_prot.Type_class.tmodule Word :
module type of Bitvector
with type t = word
and type endian = endian
and type comparator_witness = Bitvector.comparator_witnessShortcut for bitvectors that represent words
module Addr : sig ... endShortcut for bitvectors that represent addresses
module Bil : sig ... endMain BIL module.
type typ = Bil.typval bin_size_typ : typ Core_kernel.Bin_prot.Size.sizerval bin_write_typ : typ Core_kernel.Bin_prot.Write.writerval bin_writer_typ : typ Core_kernel.Bin_prot.Type_class.writerval bin_read_typ : typ Core_kernel.Bin_prot.Read.readerval __bin_read_typ__ : (int -> typ) Core_kernel.Bin_prot.Read.readerval bin_reader_typ : typ Core_kernel.Bin_prot.Type_class.readerval bin_typ : typ Core_kernel.Bin_prot.Type_class.tval sexp_of_typ : typ -> Ppx_sexp_conv_lib.Sexp.tval typ_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> typtype var = Bil.varval bin_size_var : var Core_kernel.Bin_prot.Size.sizerval bin_write_var : var Core_kernel.Bin_prot.Write.writerval bin_writer_var : var Core_kernel.Bin_prot.Type_class.writerval bin_read_var : var Core_kernel.Bin_prot.Read.readerval __bin_read_var__ : (int -> var) Core_kernel.Bin_prot.Read.readerval bin_reader_var : var Core_kernel.Bin_prot.Type_class.readerval bin_var : var Core_kernel.Bin_prot.Type_class.tval sexp_of_var : var -> Ppx_sexp_conv_lib.Sexp.tval var_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> vartype bil = Bil.tval bin_size_bil : bil Core_kernel.Bin_prot.Size.sizerval bin_write_bil : bil Core_kernel.Bin_prot.Write.writerval bin_writer_bil : bil Core_kernel.Bin_prot.Type_class.writerval bin_read_bil : bil Core_kernel.Bin_prot.Read.readerval __bin_read_bil__ : (int -> bil) Core_kernel.Bin_prot.Read.readerval bin_reader_bil : bil Core_kernel.Bin_prot.Type_class.readerval bin_bil : bil Core_kernel.Bin_prot.Type_class.tval sexp_of_bil : bil -> Ppx_sexp_conv_lib.Sexp.tval bil_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> biltype binop = Bil.binopval bin_size_binop : binop Core_kernel.Bin_prot.Size.sizerval bin_write_binop : binop Core_kernel.Bin_prot.Write.writerval bin_writer_binop : binop Core_kernel.Bin_prot.Type_class.writerval bin_read_binop : binop Core_kernel.Bin_prot.Read.readerval __bin_read_binop__ : (int -> binop) Core_kernel.Bin_prot.Read.readerval bin_reader_binop : binop Core_kernel.Bin_prot.Type_class.readerval bin_binop : binop Core_kernel.Bin_prot.Type_class.tval sexp_of_binop : binop -> Ppx_sexp_conv_lib.Sexp.tval binop_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> binoptype cast = Bil.castval bin_size_cast : cast Core_kernel.Bin_prot.Size.sizerval bin_write_cast : cast Core_kernel.Bin_prot.Write.writerval bin_writer_cast : cast Core_kernel.Bin_prot.Type_class.writerval bin_read_cast : cast Core_kernel.Bin_prot.Read.readerval __bin_read_cast__ : (int -> cast) Core_kernel.Bin_prot.Read.readerval bin_reader_cast : cast Core_kernel.Bin_prot.Type_class.readerval bin_cast : cast Core_kernel.Bin_prot.Type_class.tval sexp_of_cast : cast -> Ppx_sexp_conv_lib.Sexp.tval cast_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> casttype exp = Bil.expval bin_size_exp : exp Core_kernel.Bin_prot.Size.sizerval bin_write_exp : exp Core_kernel.Bin_prot.Write.writerval bin_writer_exp : exp Core_kernel.Bin_prot.Type_class.writerval bin_read_exp : exp Core_kernel.Bin_prot.Read.readerval __bin_read_exp__ : (int -> exp) Core_kernel.Bin_prot.Read.readerval bin_reader_exp : exp Core_kernel.Bin_prot.Type_class.readerval bin_exp : exp Core_kernel.Bin_prot.Type_class.tval sexp_of_exp : exp -> Ppx_sexp_conv_lib.Sexp.tval exp_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> exptype stmt = Bil.stmtval bin_size_stmt : stmt Core_kernel.Bin_prot.Size.sizerval bin_write_stmt : stmt Core_kernel.Bin_prot.Write.writerval bin_writer_stmt : stmt Core_kernel.Bin_prot.Type_class.writerval bin_read_stmt : stmt Core_kernel.Bin_prot.Read.readerval __bin_read_stmt__ : (int -> stmt) Core_kernel.Bin_prot.Read.readerval bin_reader_stmt : stmt Core_kernel.Bin_prot.Type_class.readerval bin_stmt : stmt Core_kernel.Bin_prot.Type_class.tval sexp_of_stmt : stmt -> Ppx_sexp_conv_lib.Sexp.tval stmt_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> stmttype unop = Bil.unopval bin_size_unop : unop Core_kernel.Bin_prot.Size.sizerval bin_write_unop : unop Core_kernel.Bin_prot.Write.writerval bin_writer_unop : unop Core_kernel.Bin_prot.Type_class.writerval bin_read_unop : unop Core_kernel.Bin_prot.Read.readerval __bin_read_unop__ : (int -> unop) Core_kernel.Bin_prot.Read.readerval bin_reader_unop : unop Core_kernel.Bin_prot.Type_class.readerval bin_unop : unop Core_kernel.Bin_prot.Type_class.tval sexp_of_unop : unop -> Ppx_sexp_conv_lib.Sexp.tval unop_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> unopmodule Type : sig ... endThe type of a BIL expression.
val bool_t : typone bit
val reg8_t : typone bit
8-bit width value
val reg16_t : typ8-bit width value
16-bit width value
val reg32_t : typ16-bit width value
32-bit width value
val reg64_t : typ32-bit width value
64-bit width value
val reg128_t : typ64-bit width value
128-bit width value
val reg256_t : typ128-bit width value
256-bit width value
mem32_t size creates a type for memory with 32-bit addresses and elements of the given size.
mem64_t size creates a type for memory with 64-bit addresses and elements of the given size.
module Var : sig ... endBIL variable.
module Context : sig ... endBase class for evaluation contexts.
module Type_error : module type of Type.Error with type t = Type.Error.tBIL type errors.
type type_error = Type_error.tA BIL type error
val bin_size_type_error : type_error Core_kernel.Bin_prot.Size.sizerval bin_write_type_error : type_error Core_kernel.Bin_prot.Write.writerval bin_writer_type_error : type_error Core_kernel.Bin_prot.Type_class.writerval bin_read_type_error : type_error Core_kernel.Bin_prot.Read.readerval __bin_read_type_error__ :
(int -> type_error) Core_kernel.Bin_prot.Read.readerval bin_reader_type_error : type_error Core_kernel.Bin_prot.Type_class.readerval bin_type_error : type_error Core_kernel.Bin_prot.Type_class.tval compare_type_error : type_error -> type_error -> intval sexp_of_type_error : type_error -> Ppx_sexp_conv_lib.Sexp.tval type_error_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> type_errormodule Eval : sig ... endBasic and generic expression evaluator.
module Expi : sig ... endExpression Language Interpreter.
Expression interpreter
module Bili : sig ... endBIL Interpreter.
BIL interpreter
module Eff : sig ... endEffect analysis.
module Exp : sig ... endRegular interface for BIL expressions
module Stmt : sig ... endRegular interface for BIL statements
module Arch : sig ... endArchitecture
type arch = Arch.tarchitecture
val bin_size_arch : arch Core_kernel.Bin_prot.Size.sizerval bin_write_arch : arch Core_kernel.Bin_prot.Write.writerval bin_writer_arch : arch Core_kernel.Bin_prot.Type_class.writerval bin_read_arch : arch Core_kernel.Bin_prot.Read.readerval __bin_read_arch__ : (int -> arch) Core_kernel.Bin_prot.Read.readerval bin_reader_arch : arch Core_kernel.Bin_prot.Type_class.readerval bin_arch : arch Core_kernel.Bin_prot.Type_class.tval sexp_of_arch : arch -> Ppx_sexp_conv_lib.Sexp.tval arch_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> archmodule Value : sig ... endUniversal Values.
type 'a tag = 'a Value.tagmodule Dict : sig ... endUniversal Heterogeneous Map.
module Vector : sig ... endResizable Array.
val bin_size_term :
'a Core_kernel.Bin_prot.Size.sizer ->
'a term Core_kernel.Bin_prot.Size.sizerval bin_write_term :
'a Core_kernel.Bin_prot.Write.writer ->
'a term Core_kernel.Bin_prot.Write.writerval bin_writer_term :
'a Core_kernel.Bin_prot.Type_class.writer ->
'a term Core_kernel.Bin_prot.Type_class.writerval bin_read_term :
'a Core_kernel.Bin_prot.Read.reader ->
'a term Core_kernel.Bin_prot.Read.readerval __bin_read_term__ :
'a Core_kernel.Bin_prot.Read.reader ->
(int -> 'a term) Core_kernel.Bin_prot.Read.readerval bin_reader_term :
'a Core_kernel.Bin_prot.Type_class.reader ->
'a term Core_kernel.Bin_prot.Type_class.readerval bin_term :
'a Core_kernel.Bin_prot.Type_class.t ->
'a term Core_kernel.Bin_prot.Type_class.tval sexp_of_term :
('a -> Ppx_sexp_conv_lib.Sexp.t) ->
'a term ->
Ppx_sexp_conv_lib.Sexp.tval term_of_sexp :
(Ppx_sexp_conv_lib.Sexp.t -> 'a) ->
Ppx_sexp_conv_lib.Sexp.t ->
'a termval bin_size_program : program Core_kernel.Bin_prot.Size.sizerval bin_write_program : program Core_kernel.Bin_prot.Write.writerval bin_writer_program : program Core_kernel.Bin_prot.Type_class.writerval bin_read_program : program Core_kernel.Bin_prot.Read.readerval __bin_read_program__ : (int -> program) Core_kernel.Bin_prot.Read.readerval bin_reader_program : program Core_kernel.Bin_prot.Type_class.readerval bin_program : program Core_kernel.Bin_prot.Type_class.tval sexp_of_program : program -> Ppx_sexp_conv_lib.Sexp.tval program_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> programval bin_size_sub : sub Core_kernel.Bin_prot.Size.sizerval bin_write_sub : sub Core_kernel.Bin_prot.Write.writerval bin_writer_sub : sub Core_kernel.Bin_prot.Type_class.writerval bin_read_sub : sub Core_kernel.Bin_prot.Read.readerval __bin_read_sub__ : (int -> sub) Core_kernel.Bin_prot.Read.readerval bin_reader_sub : sub Core_kernel.Bin_prot.Type_class.readerval bin_sub : sub Core_kernel.Bin_prot.Type_class.tval sexp_of_sub : sub -> Ppx_sexp_conv_lib.Sexp.tval sub_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> subval bin_size_arg : arg Core_kernel.Bin_prot.Size.sizerval bin_write_arg : arg Core_kernel.Bin_prot.Write.writerval bin_writer_arg : arg Core_kernel.Bin_prot.Type_class.writerval bin_read_arg : arg Core_kernel.Bin_prot.Read.readerval __bin_read_arg__ : (int -> arg) Core_kernel.Bin_prot.Read.readerval bin_reader_arg : arg Core_kernel.Bin_prot.Type_class.readerval bin_arg : arg Core_kernel.Bin_prot.Type_class.tval sexp_of_arg : arg -> Ppx_sexp_conv_lib.Sexp.tval arg_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> argval bin_size_blk : blk Core_kernel.Bin_prot.Size.sizerval bin_write_blk : blk Core_kernel.Bin_prot.Write.writerval bin_writer_blk : blk Core_kernel.Bin_prot.Type_class.writerval bin_read_blk : blk Core_kernel.Bin_prot.Read.readerval __bin_read_blk__ : (int -> blk) Core_kernel.Bin_prot.Read.readerval bin_reader_blk : blk Core_kernel.Bin_prot.Type_class.readerval bin_blk : blk Core_kernel.Bin_prot.Type_class.tval sexp_of_blk : blk -> Ppx_sexp_conv_lib.Sexp.tval blk_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> blkval bin_size_phi : phi Core_kernel.Bin_prot.Size.sizerval bin_write_phi : phi Core_kernel.Bin_prot.Write.writerval bin_writer_phi : phi Core_kernel.Bin_prot.Type_class.writerval bin_read_phi : phi Core_kernel.Bin_prot.Read.readerval __bin_read_phi__ : (int -> phi) Core_kernel.Bin_prot.Read.readerval bin_reader_phi : phi Core_kernel.Bin_prot.Type_class.readerval bin_phi : phi Core_kernel.Bin_prot.Type_class.tval sexp_of_phi : phi -> Ppx_sexp_conv_lib.Sexp.tval phi_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> phival bin_size_def : def Core_kernel.Bin_prot.Size.sizerval bin_write_def : def Core_kernel.Bin_prot.Write.writerval bin_writer_def : def Core_kernel.Bin_prot.Type_class.writerval bin_read_def : def Core_kernel.Bin_prot.Read.readerval __bin_read_def__ : (int -> def) Core_kernel.Bin_prot.Read.readerval bin_reader_def : def Core_kernel.Bin_prot.Type_class.readerval bin_def : def Core_kernel.Bin_prot.Type_class.tval sexp_of_def : def -> Ppx_sexp_conv_lib.Sexp.tval def_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> defval bin_size_jmp : jmp Core_kernel.Bin_prot.Size.sizerval bin_write_jmp : jmp Core_kernel.Bin_prot.Write.writerval bin_writer_jmp : jmp Core_kernel.Bin_prot.Type_class.writerval bin_read_jmp : jmp Core_kernel.Bin_prot.Read.readerval __bin_read_jmp__ : (int -> jmp) Core_kernel.Bin_prot.Read.readerval bin_reader_jmp : jmp Core_kernel.Bin_prot.Type_class.readerval bin_jmp : jmp Core_kernel.Bin_prot.Type_class.tval sexp_of_jmp : jmp -> Ppx_sexp_conv_lib.Sexp.tval jmp_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> jmpval bin_size_nil : nil Core_kernel.Bin_prot.Size.sizerval bin_write_nil : nil Core_kernel.Bin_prot.Write.writerval bin_writer_nil : nil Core_kernel.Bin_prot.Type_class.writerval bin_read_nil : nil Core_kernel.Bin_prot.Read.readerval __bin_read_nil__ : (int -> nil) Core_kernel.Bin_prot.Read.readerval bin_reader_nil : nil Core_kernel.Bin_prot.Type_class.readerval bin_nil : nil Core_kernel.Bin_prot.Type_class.tval sexp_of_nil : nil -> Ppx_sexp_conv_lib.Sexp.tval nil_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> niltype tid = Bap_core_theory.Theory.Label.tval bin_size_tid : tid Core_kernel.Bin_prot.Size.sizerval bin_write_tid : tid Core_kernel.Bin_prot.Write.writerval bin_writer_tid : tid Core_kernel.Bin_prot.Type_class.writerval bin_read_tid : tid Core_kernel.Bin_prot.Read.readerval __bin_read_tid__ : (int -> tid) Core_kernel.Bin_prot.Read.readerval bin_reader_tid : tid Core_kernel.Bin_prot.Type_class.readerval bin_tid : tid Core_kernel.Bin_prot.Type_class.tval sexp_of_tid : tid -> Ppx_sexp_conv_lib.Sexp.tval tid_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> tidval bin_size_call : call Core_kernel.Bin_prot.Size.sizerval bin_write_call : call Core_kernel.Bin_prot.Write.writerval bin_writer_call : call Core_kernel.Bin_prot.Type_class.writerval bin_read_call : call Core_kernel.Bin_prot.Read.readerval __bin_read_call__ : (int -> call) Core_kernel.Bin_prot.Read.readerval bin_reader_call : call Core_kernel.Bin_prot.Type_class.readerval bin_call : call Core_kernel.Bin_prot.Type_class.tval sexp_of_call : call -> Ppx_sexp_conv_lib.Sexp.tval call_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> calltarget of control transfer
val bin_size_label : label Core_kernel.Bin_prot.Size.sizerval bin_write_label : label Core_kernel.Bin_prot.Write.writerval bin_writer_label : label Core_kernel.Bin_prot.Type_class.writerval bin_read_label : label Core_kernel.Bin_prot.Read.readerval __bin_read_label__ : (int -> label) Core_kernel.Bin_prot.Read.readerval bin_reader_label : label Core_kernel.Bin_prot.Type_class.readerval bin_label : label Core_kernel.Bin_prot.Type_class.tval sexp_of_label : label -> Ppx_sexp_conv_lib.Sexp.tval label_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> labelval bin_size_jmp_kind : jmp_kind Core_kernel.Bin_prot.Size.sizerval bin_write_jmp_kind : jmp_kind Core_kernel.Bin_prot.Write.writerval bin_writer_jmp_kind : jmp_kind Core_kernel.Bin_prot.Type_class.writerval bin_read_jmp_kind : jmp_kind Core_kernel.Bin_prot.Read.readerval __bin_read_jmp_kind__ : (int -> jmp_kind) Core_kernel.Bin_prot.Read.readerval bin_reader_jmp_kind : jmp_kind Core_kernel.Bin_prot.Type_class.readerval bin_jmp_kind : jmp_kind Core_kernel.Bin_prot.Type_class.tval sexp_of_jmp_kind : jmp_kind -> Ppx_sexp_conv_lib.Sexp.tval jmp_kind_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> jmp_kindargument intention
val bin_size_intent : intent Core_kernel.Bin_prot.Size.sizerval bin_write_intent : intent Core_kernel.Bin_prot.Write.writerval bin_writer_intent : intent Core_kernel.Bin_prot.Type_class.writerval bin_read_intent : intent Core_kernel.Bin_prot.Read.readerval __bin_read_intent__ : (int -> intent) Core_kernel.Bin_prot.Read.readerval bin_reader_intent : intent Core_kernel.Bin_prot.Type_class.readerval bin_intent : intent Core_kernel.Bin_prot.Type_class.tval sexp_of_intent : intent -> Ppx_sexp_conv_lib.Sexp.tval intent_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> intentTerm type classes
module Biri : sig ... endBIR Interpreter
BIR interpreter
Some predefined tags
val bin_size_color : color Core_kernel.Bin_prot.Size.sizerval bin_write_color : color Core_kernel.Bin_prot.Write.writerval bin_writer_color : color Core_kernel.Bin_prot.Type_class.writerval bin_read_color : color Core_kernel.Bin_prot.Read.readerval __bin_read_color__ : (int -> color) Core_kernel.Bin_prot.Read.readerval bin_reader_color : color Core_kernel.Bin_prot.Type_class.readerval bin_color : color Core_kernel.Bin_prot.Type_class.tval sexp_of_color : color -> Ppx_sexp_conv_lib.Sexp.tval color_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> colorval __color_of_sexp__ : Ppx_sexp_conv_lib.Sexp.t -> colorprint marked entity with the specified color. (the same as color, but pretty printing function will output ascii escape sequence of corresponding color.
val comment : string tagA human readable comment
val python : string tagA command in python language
val shell : string tagA command in shell language
val mark : unit tagMark something as marked
val weight : float tagGive a weight
val filename : string tagA name of a file
val sexp_of_mem : mem -> Ppx_sexp_conv_lib.Sexp.tval sexp_of_table :
('a -> Ppx_sexp_conv_lib.Sexp.t) ->
'a table ->
Ppx_sexp_conv_lib.Sexp.tval sexp_of_memmap :
('a -> Ppx_sexp_conv_lib.Sexp.t) ->
'a memmap ->
Ppx_sexp_conv_lib.Sexp.tmodule type Memory_iterators = sig ... endIterators lifted into monad
module Memory : sig ... endMemory region
module Table : sig ... endTable.
module Location : sig ... endA locations of a chunk of memory
type location = Location.tmemory location
val bin_size_location : location Core_kernel.Bin_prot.Size.sizerval bin_write_location : location Core_kernel.Bin_prot.Write.writerval bin_writer_location : location Core_kernel.Bin_prot.Type_class.writerval bin_read_location : location Core_kernel.Bin_prot.Read.readerval __bin_read_location__ : (int -> location) Core_kernel.Bin_prot.Read.readerval bin_reader_location : location Core_kernel.Bin_prot.Type_class.readerval bin_location : location Core_kernel.Bin_prot.Type_class.tval sexp_of_location : location -> Ppx_sexp_conv_lib.Sexp.tval location_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> locationmodule Backend : sig ... endA backend interface.
module Image : sig ... endBinary Image.
module Memmap : sig ... endMemory maps. Memory map is an assosiative data structure that maps memory regions to values. Unlike in the Table, memory regions in the Memmap can intersect in an arbitrary ways. This data structure is also known as an Interval Tree.
type insn = Bap_core_theory.Theory.Program.Semantics.tvalues of type insn represents machine instructions decoded from a given piece of memory
val bin_size_insn : insn Core_kernel.Bin_prot.Size.sizerval bin_write_insn : insn Core_kernel.Bin_prot.Write.writerval bin_writer_insn : insn Core_kernel.Bin_prot.Type_class.writerval bin_read_insn : insn Core_kernel.Bin_prot.Read.readerval __bin_read_insn__ : (int -> insn) Core_kernel.Bin_prot.Read.readerval bin_reader_insn : insn Core_kernel.Bin_prot.Type_class.readerval bin_insn : insn Core_kernel.Bin_prot.Type_class.tval sexp_of_insn : insn -> Ppx_sexp_conv_lib.Sexp.tval insn_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> insnblock is a region of memory that is believed to be a basic block of control flow graph to the best of our knowledge.
val sexp_of_block : block -> Ppx_sexp_conv_lib.Sexp.ta jump kind. A jump to another block can be conditional or unconditional.
This type defines a relation between two basic blocks.
val sexp_of_jump : jump -> Ppx_sexp_conv_lib.Sexp.tval jump_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> jumpval __jump_of_sexp__ : Ppx_sexp_conv_lib.Sexp.t -> jumpThis type defines a relation between two basic blocks.
val sexp_of_edge : edge -> Ppx_sexp_conv_lib.Sexp.tval edge_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> edgeval __edge_of_sexp__ : Ppx_sexp_conv_lib.Sexp.t -> edgemodule Kind : sig ... endKinds of instructions
val bin_size_reg : reg Core_kernel.Bin_prot.Size.sizerval bin_write_reg : reg Core_kernel.Bin_prot.Write.writerval bin_writer_reg : reg Core_kernel.Bin_prot.Type_class.writerval bin_read_reg : reg Core_kernel.Bin_prot.Read.readerval __bin_read_reg__ : (int -> reg) Core_kernel.Bin_prot.Read.readerval bin_reader_reg : reg Core_kernel.Bin_prot.Type_class.readerval bin_reg : reg Core_kernel.Bin_prot.Type_class.tval sexp_of_reg : reg -> Ppx_sexp_conv_lib.Sexp.tval reg_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> regval bin_size_imm : imm Core_kernel.Bin_prot.Size.sizerval bin_write_imm : imm Core_kernel.Bin_prot.Write.writerval bin_writer_imm : imm Core_kernel.Bin_prot.Type_class.writerval bin_read_imm : imm Core_kernel.Bin_prot.Read.readerval __bin_read_imm__ : (int -> imm) Core_kernel.Bin_prot.Read.readerval bin_reader_imm : imm Core_kernel.Bin_prot.Type_class.readerval bin_imm : imm Core_kernel.Bin_prot.Type_class.tval sexp_of_imm : imm -> Ppx_sexp_conv_lib.Sexp.tval imm_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> immval bin_size_fmm : fmm Core_kernel.Bin_prot.Size.sizerval bin_write_fmm : fmm Core_kernel.Bin_prot.Write.writerval bin_writer_fmm : fmm Core_kernel.Bin_prot.Type_class.writerval bin_read_fmm : fmm Core_kernel.Bin_prot.Read.readerval __bin_read_fmm__ : (int -> fmm) Core_kernel.Bin_prot.Read.readerval bin_reader_fmm : fmm Core_kernel.Bin_prot.Type_class.readerval bin_fmm : fmm Core_kernel.Bin_prot.Type_class.tval sexp_of_fmm : fmm -> Ppx_sexp_conv_lib.Sexp.tval fmm_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> fmmtype kind = Kind.tkind of instruction
val bin_size_kind : kind Core_kernel.Bin_prot.Size.sizerval bin_write_kind : kind Core_kernel.Bin_prot.Write.writerval bin_writer_kind : kind Core_kernel.Bin_prot.Type_class.writerval bin_read_kind : kind Core_kernel.Bin_prot.Read.readerval __bin_read_kind__ : (int -> kind) Core_kernel.Bin_prot.Read.readerval bin_reader_kind : kind Core_kernel.Bin_prot.Type_class.readerval bin_kind : kind Core_kernel.Bin_prot.Type_class.tval sexp_of_kind : kind -> Ppx_sexp_conv_lib.Sexp.tval kind_of_sexp : Ppx_sexp_conv_lib.Sexp.t -> kindmodule Reg : sig ... endRegister.
module Imm : sig ... endInteger immediate operand
module Fmm : sig ... endFloating point immediate operand
module Op : sig ... endOperand
type op = Op.tval bin_size_op : op Core_kernel.Bin_prot.Size.sizerval bin_write_op : op Core_kernel.Bin_prot.Write.writerval bin_writer_op : op Core_kernel.Bin_prot.Type_class.writerval bin_read_op : op Core_kernel.Bin_prot.Read.readerval __bin_read_op__ : (int -> op) Core_kernel.Bin_prot.Read.readerval bin_reader_op : op Core_kernel.Bin_prot.Type_class.readerval bin_op : op Core_kernel.Bin_prot.Type_class.tval sexp_of_op : op -> Ppx_sexp_conv_lib.Sexp.tmodule Disasm_expert : sig ... endExpert interface to disassembler.
module Insn : sig ... endAssembly instruction.
module Block : sig ... endBasic block.
module Graphs : sig ... endBAP Common Graphs.
module Disasm : sig ... endThe interface to the disassembler level.
module Symtab : sig ... endReconstructed symbol table.
type lifter =
mem ->
Disasm_expert.Basic.full_insn ->
bil Core_kernel.Or_error.tmodule type CPU = sig ... endA BIL model of CPU
module type Target = sig ... endAbstract interface for all targets.
target_of_arch arch returns a module packed into value, that abstracts target architecture. The returned module has type Target and can be unpacked locally with:
let module Target = (val target_of_arch arch) inRegister new target architecture. If target for the given arch already exists, then it will be superseded by the new target.
module Tid : sig ... endTerm identifier.
module Term : sig ... endIR language term.
module Program : sig ... endProgram in Intermediate representation.
module Sub : sig ... endSubroutine.
module Def : sig ... endDefinition.
module Jmp : sig ... endA control transfer operation.
module Phi : sig ... endPHI-node
module Blk : sig ... endBasic block.
module Arg : sig ... endSubroutine argument.
module Call : sig ... endA control transfer to another subroutine.
module Label : sig ... endTarget of a control flow transfer.
module Source : sig ... endSource of information.
module Taint : sig ... endAbstract taint.
type 'a source = 'a Source.tmodule Symbolizer : sig ... endSymbolizer maps addresses to function names
module Rooter : sig ... endRooter finds starts of functions in the binary.
module Brancher : sig ... endBrancher is responsible for resolving destinations of branch instructions.
module Reconstructor : sig ... endReconstructor is responsible for reconstructing symbol table from a CFG. It should partition a CFG into a set of possibly intersecting functions. See Symtab module for more information about symbol table and functions.
module Event : sig ... endEvent subsystem.
type event = Event.t = ..module Toplevel : sig ... endThe interface to the BAP toplevel state.
module Project : sig ... endDisassembled program.
module Self () : sig ... endA self reflection.
module Log : sig ... end