[python api] All information about the AstContext Python object.
Description
Triton converts the x86, x86-64 and AArch64 instruction set architecture into an AST representation. This class is used to build your own AST nodes.
Python API - Methods of the AstContext class
- AstNode array(integer addrSize)
Creates an array
node.
e.g: (Array (_ BitVec addrSize) (_ BitVec 8))
.
- AstNode assert_(AstNode node)
Creates a assert
node. e.g: (assert node)
.
- AstNode bswap(AstNode node)
Creates a bswap
node. e.g: (bswap node)
.
- AstNode bv(integer value, integer size)
Creates a bv
node (bitvector). The size
must be in bits.
e.g: (_ bv<balue> size)
.
- AstNode bvadd(AstNode node1, AstNode node2)
Creates a bvadd
node.
e.g: (bvadd node1 epxr2)
.
- AstNode bvand(AstNode node1, AstNode node2)
Creates a bvand
node.
e.g: (bvand node1 epxr2)
.
- AstNode bvashr(AstNode node1, AstNode node2)
Creates a bvashr
node (arithmetic shift right).
e.g: (bvashr node1 epxr2)
.
- AstNode bvfalse(void)
This is an alias on the (_ bv0 1)
ast expression.
- AstNode bvlshr(AstNode node1, AstNode node2)
Creates a bvlshr
node (logical shift right).
e.g: (lshr node1 epxr2)
.
- AstNode bvmul(AstNode node1, AstNode node2)
Creates a bvmul
node.
e.g: (bvmul node1 node2)
.
- AstNode bvnand(AstNode node1, AstNode node2)
Creates a bvnand
node.
e.g: (bvnand node1 node2)
.
- AstNode bvneg(AstNode node1)
Creates a bvneg
node.
e.g: (bvneg node1)
.
- AstNode bvnor(AstNode node1, AstNode node2)
Creates a bvnor
node.
e.g: (bvnor node1 node2)
.
- AstNode bvnot(AstNode node1)
Creates a bvnot
node.
e.g: (bvnot node1)
.
- AstNode bvor(AstNode node1, AstNode node2)
Creates a bvor
node.
e.g: (bvor node1 node2)
.
- AstNode bvror(AstNode node, AstNode rot)
Creates a bvror
node (rotate right).
e.g: ((_ rotate_right rot) node)
.
- AstNode bvrol(AstNode node, AstNode rot)
Creates a bvrol
node (rotate left).
e.g: ((_ rotate_left rot) node)
.
- AstNode bvsdiv(AstNode node1, AstNode node2)
Creates a bvsdiv
node.
e.g: (bvsdiv node1 epxr2)
.
- AstNode bvsge(AstNode node1, AstNode node2)
Creates a bvsge
node.
e.g: (bvsge node1 epxr2)
.
- AstNode bvsgt(AstNode node1, AstNode node2)
Creates a bvsgt
node.
e.g: (bvsgt node1 epxr2)
.
- AstNode bvshl(AstNode node1, AstNode node2)
Creates a Bvshl node (shift left).
e.g: (bvshl node1 node2)
.
- AstNode bvsle(AstNode node1, AstNode node2)
Creates a bvsle
node.
e.g: (bvsle node1 epxr2)
.
- AstNode bvslt(AstNode node1, AstNode node2)
Creates a bvslt
node.
e.g: (bvslt node1 epxr2)
.
- AstNode bvsmod(AstNode node1, AstNode node2)
Creates a bvsmod
node (2's complement signed remainder, sign follows divisor).
e.g: (bvsmod node1 node2)
.
- AstNode bvsrem(AstNode node1, AstNode node2)
Creates a bvsrem
node (2's complement signed remainder, sign follows dividend).
e.g: (bvsrem node1 node2)
.
- AstNode bvsub(AstNode node1, AstNode node2)
Creates a bvsub
node.
e.g: (bvsub node1 epxr2)
.
- AstNode bvtrue(void)
This is an alias on the (_ bv1 1)
ast expression.
- AstNode bvudiv(AstNode node1, AstNode node2)
Creates a bvudiv
node.
e.g: (bvudiv node1 epxr2)
.
- AstNode bvuge(AstNode node1, AstNode node2)
Creates a bvuge
node.
e.g: (bvuge node1 epxr2)
.
- AstNode bvugt(AstNode node1, AstNode node2)
Creates a bvugt
node.
e.g: (bvugt node1 epxr2)
.
- AstNode bvule(AstNode node1, AstNode node2)
Creates a bvule
node.
e.g: (bvule node1 epxr2)
.
- AstNode bvult(AstNode node1, AstNode node2)
Creates a bvult
node.
e.g: (bvult node1 epxr2)
.
- AstNode bvurem(AstNode node1, AstNode node2)
Creates a bvurem
node (unsigned remainder).
e.g: (bvurem node1 node2)
.
- AstNode bvxnor(AstNode node1, AstNode node2)
Creates a bvxnor
node.
e.g: (bvxnor node1 node2)
.
- AstNode bvxor(AstNode node1, AstNode node2)
Creates a bvxor
node.
e.g: (bvxor node1 epxr2)
.
- AstNode concat([AstNode, ...])
Concatenates several nodes.
- AstNode declare(AstNode sort)
Declare a function without argument. Mainly used to delcare a variable or an array.
e.g: (declare-fun SymVar_0 () (_ BitVec 64))
- AstNode distinct(AstNode node1, AstNode node2)
Creates a distinct
node.
e.g: (distinct node1 node2)
- AstNode equal(AstNode node1, AstNode node2)
Creates an equal
node.
e.g: (= node1 epxr2)
.
- AstNode extract(integer high, integer low, AstNode node1)
Creates an extract
node. The high
and low
fields represent the bits position.
e.g: ((_ extract high low) node1)
.
- AstNode forall([AstNode, ...], AstNode body)
Creates an forall
node.
e.g: (forall ((x (_ BitVec <size>)), ...) body)
.
- AstNode iff(AstNode node1, AstNode node2)
Creates an iff
node (if and only if).
e.g: (iff node1 node2)
.
- AstNode ite(AstNode ifExpr, AstNode thenExpr, AstNode elseExpr)
Creates an ite
node (if-then-else node).
e.g: (ite ifExpr thenExpr elseExpr)
.
- AstNode land([AstNode, ...])
Creates a logical AND
on several nodes. e.g: (and node1 node2 node3 node4)
.
- AstNode let(string alias, AstNode node2, AstNode node3)
Creates a let
node.
e.g: (let ((alias node2)) node3)
.
- AstNode lnot(AstNode node)
Creates a lnot
node (logical NOT).
e.g: (not node)
.
- AstNode lor([AstNode, ...])
Creates a logical OR
on several nodes. e.g: (or node1 node2 node3 node4)
.
- AstNode lxor([AstNode, ...])
Creates a logical XOR
on several nodes. e.g: (xor node1 node2 node3 node4)
.
- AstNode reference(SymbolicExpression expr)
Creates a reference node (SSA-based).
e.g: ref!123
.
- AstNode select(AstNode array, AstNode index)
Creates a select
node.
e.g: (select array index)
.
- AstNode store(AstNode array, AstNode index, AstNode expr)
Creates a store
node.
e.g: (store array index expr)
.
- AstNode string(string s)
Creates a string
node.
- AstNode sx(integer sizeExt, AstNode node1)
Creates a sx
node (sign extend).
e.g: ((_ sign_extend sizeExt) node1)
.
- AstNode variable(SymbolicVariable symVar)
Creates a variable
node.
- AstNode zx(integer sizeExt, AstNode node1)
Creates a zx
node (zero extend).
e.g: ((_ zero_extend sizeExt) node1)
.
Python API - Utility methods of the AstContext class
- AstNode dereference(AstNode node)
Returns the first non referene node encountered.
- AstNode duplicate(AstNode node)
Duplicates the node and returns a new instance as AstNode.
- [AstNode, ...] search(AstNode node, AST_NODE match)
Returns a list of collected matched nodes via a depth-first pre order traversal.
- z3.ExprRef tritonToZ3(AstNode node)
Convert a Triton AST to a Z3 AST.
- AstNode unroll(AstNode node)
Unrolls the SSA form of a given AST.
- AstNode z3ToTriton(z3.ExprRef expr)
Convert a Z3 AST to a Triton AST.
Python API - Operators
As we can not overload all AST operators only the following operators are overloaded:
Python's Operator | e.g: SMT2-Lib format |
a + b | (bvadd a b) |
a - b | (bvsub a b) |
a * b | (bvmul a b) |
a / b | (bvudiv a b) |
a | b | (bvor a b) |
a & b | (bvand a b) |
a ^ b | (bvxor a b) |
a % b | (bvurem a b) |
a << b | (bvshl a b) |
a >> b | (bvlshr a b) |
~a | (bvnot a) |
-a | (bvneg a) |
a == b | (= a b) |
a != b | (not (= a b)) |
a <= b | (bvule a b) |
a >= b | (bvuge a b) |
a < b | (bvult a b) |
a > b | (bvugt a b) |
The SMT or Python Syntax
By default, Triton represents semantics in SMT-LIB which is an international initiative aimed at facilitating research and development in Satisfiability Modulo Theories (SMT). However, Triton also allows you to display your AST using a Python syntax.
>>> ctxt = TritonContext()
>>> ctxt.setArchitecture(ARCH.X86_64)
>>> ctxt.setAstRepresentationMode(AST_REPRESENTATION.PYTHON)
>>> inst = Instruction()
>>> inst.setOpcode(b"\x48\x01\xd8")
>>> inst.setAddress(0x400000)
>>> ctxt.setConcreteRegisterValue(ctxt.registers.rax, 0x1122334455667788)
>>> ctxt.setConcreteRegisterValue(ctxt.registers.rbx, 0x8877665544332211)
>>> ctxt.processing(inst)
True
>>> print(inst)
0x400000: add rax, rbx
>>> for expr in inst.getSymbolicExpressions():
... print(expr)
...
ref_0 = ((0x1122334455667788 + 0x8877665544332211) & 0xFFFFFFFFFFFFFFFF)
ref_1 = (0x1 if (0x10 == (0x10 & (ref_0 ^ (0x1122334455667788 ^ 0x8877665544332211)))) else 0x0)
ref_2 = ((((0x1122334455667788 & 0x8877665544332211) ^ (((0x1122334455667788 ^ 0x8877665544332211) ^ ref_0) & (0x1122334455667788 ^ 0x8877665544332211))) >> 63) & 0x1)
ref_3 = ((((0x1122334455667788 ^ (~(0x8877665544332211) & 0xFFFFFFFFFFFFFFFF)) & (0x1122334455667788 ^ ref_0)) >> 63) & 0x1)
ref_4 = ((((((((0x1 ^ (((ref_0 & 0xFF) >> 0x0) & 0x1)) ^ (((ref_0 & 0xFF) >> 0x1) & 0x1)) ^ (((ref_0 & 0xFF) >> 0x2) & 0x1)) ^ (((ref_0 & 0xFF) >> 0x3) & 0x1)) ^ (((ref_0 & 0xFF) >> 0x4) & 0x1)) ^ (((ref_0 & 0xFF) >> 0x5) & 0x1)) ^ (((ref_0 & 0xFF) >> 0x6) & 0x1)) ^ (((ref_0 & 0xFF) >> 0x7) & 0x1))
ref_5 = ((ref_0 >> 63) & 0x1)
ref_6 = (0x1 if (ref_0 == 0x0) else 0x0)
ref_7 = 0x400003