# Usage¶

## iarybo, interactive IPython shell¶

iarybo is a IPython shell that allows to quickly use arybo inside an interactive shell.

You can launch arybo without any command line argument and get a shell without any variable specified. You need to use the set_mba(N) function to declare: * an mba object which will be instanciated as MBA(N) (todo link with the library) * a bunch of N-bits variables: a,b,c,d,x,y

You can also directly specify a bit number as a command line argument, and set_mba(N) will be called for you. In some version of IPython, calling back set_mba(N) does not change the mba object and associated variables that have already been declared (it seems to be related to this bug in IPython https://github.com/ipython/ipython/issues/62, if someone has a workaround for this, any help is welcome :)).

### Example session¶

Here’s a tiny example session:

\$ iarybo 4
Welcome to Arybo (c) Quarkslab 2014-2016!
=========================================

..----.
.------------.
--.-..
      .+yy-
::oydmNNNNNmdysmMMMd
/mNMNdyooymmMMMMMMNNd
/omMMNh/.dhyNMMMMMMNm:
.-.   -hddmMNh.-.+sdMMMMMMd+:
.:+sdmNmd/  -omMMNdyymNMMMMNd+-
.:+hmNNMMMMMMMm.  :yNNNNNNMMMMNhs:..-:
/shMMMMMMNNNMMy/ymmNNNMMMMNd+...-:-
+yNNMNNddNMMMMhyssyysyhdds-  ...--.
.+yhhhdddhhhdNMMMMNNdosoososyyhyo---.  
:osyhhhhhy:-:+oysdmNNhssssydNNhssyhds.   ....
.-/syhho.     -+ssssshmMMMN+y+ohhMs        .--
...         .:/+dNMMMMMMNmNmNNo..       -.
-+hdMMMMMMMMh       ..
.yNMMMMMd-      ..
+mMMMMo.    --:.
.sNMMMNs  .:::::-
.+mMMMMo   -::::--
-+NMMMN-  .::--
:mMMMMh  .::.
..--+NMMMMm.o/..
.-+mMMMMMNoyy+
:ydmMMMMN+
.-:/oos+.

These variables have been set for you:

mba = MBA(4)
x, y, a, b, c, d = 4-bit vars

You can use set_mba(N) to change the bit count of these variables.
WARNING: on some IPython version, this might not work!

Other exposed functions are:
- simplify, simplify_inplace, expand_esf, expand_esf_inplace
- symbol, imm, esf
- Vector/Matrix

Other exposed modules are:
- analyses

Report any issues to qbobf@quarkslab.com.

In [1]: x+1
Out[1]:
Vec([
(x0 + 1),
(x0 + x1),
((x0 * x1) + x2),
((x0 * x1 * x2) + x3)
])

In [2]: (x+y) - (x&y)*2
Out[2]:
Vec([
(x0 + y0),
(x1 + y1),
(x2 + y2),
(x3 + y3)
])


## Using the arybo library¶

Another way to use Arybo is to directly use the provided library.

A classical way to start is to import the arybo.lib.MBA() object, and instantiate one with the number of bits we want to work with:

from arybo.lib import MBA
mba = MBA(8)


From here, we can declare various symbolic variable to work with:

from arybo.lib import MBA
mba = MBA(4)
x = mba.var('x')
y = mba.var('y')


And play with them:

print(x^y)
>>> Vec([
(x0 + y0),
(x1 + y1),
(x2 + y2),
(x3 + y3)
])
print((x+y)-((x&y)<<1))
>>> Vec([
(x0 + y0),
(x1 + y1),
(x2 + y2),
(x3 + y3)
])


Much more can be done! Have a look at the Tutorials page and the ̀examples` directory for more advanced examples, and the Arybo reference page for the documentation of the Arybo API.