> For the complete documentation index, see [llms.txt](https://sansong.gitbook.io/cyber/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sansong.gitbook.io/cyber/rev/outils/qiling.md).

# Qiling

https\://docs.qiling.io/en/latest/

[<mark style="color:purple;">**Qiling**</mark>](https://github.com/qilingframework/qiling) est un framework d'émulation de binaire qui supporte beaucoup de plateformes, architectures de processeur et formats d'exécutables.

<figure><img src="https://raw.githubusercontent.com/qilingframework/qiling/master/docs/qiling2_logo_small.png" alt="" width="188"><figcaption><p>Le super logo de Qiling</p></figcaption></figure>

* Windows, MacOS, Linux, Android, BSD, UEFI, DOS, MBR, Ethereum Virtual Machine
* 8086, X86, X86\_64, ARM, ARM64, MIPS, RISCV, PowerPC
* PE, MachO, ELF, COM, MBR

> Plus d'infos sur le [repo Github](https://github.com/qilingframework/qiling)

Il permet notamment d'émuler un exécutable, implémenter des hooks, modifier la mémoire et les registres, faire des snapshots, du fuzzing, etc.

### **Installation**

```bash
git clone https://github.com/qilingframework/qiling.git
```

Installer le module python

```bash
cd qiling 
sudo pip3 install .
```

Installer le [<mark style="color:purple;">submodule</mark>](https://git-scm.com/book/en/v2/Git-Tools-Submodules) [<mark style="color:purple;">**rootfs**</mark>](https://github.com/qilingframework/rootfs/tree/32c4fcf52f4aa0efaa1cb03ab6b2186c61f512c6)

```bash
git submodule init
git submodule update
```

Il contient les fichiers nécessaire à l'exécution avec des architectures spécifiques sur différents OS.

> Par exemple pour un binaire arm ELF: <mark style="color:purple;">`qiling/examples/rootfs/arm_linux`</mark>

### **Emulation**

```python
from qiling import Qiling
from qiling.const import QL_VERBOSE

if __name__ == "__main__":
    path = ["chemin/vers/le/binaire"]
    rootfs = "chemin/vers/rootfs/archi_os"
    ql = Qiling( path,
        rootfs,
        verbose=QL_VERBOSE.OFF,
        console=True
    )
    ql.run()
```

<mark style="color:purple;">`verbose`</mark> permet d’afficher des informations de debug ou les instructions exécutées si besoin.

### **Hook**

#### **Adresse**

Hook une adresse pour appeler une fonction

```python
def callback_func(ql : Qiling):
    print("l'adresse 0x113c0 a été atteinte")

def setup_hooks(ql: Qiling):
    ql.hook_address(callback=callback_func, address=0x113c0)
    
if __name__ == "__main__":
    path = ["chemin/vers/le/binaire"]
    rootfs = "chemin/vers/rootfs/archi_os"
    ql = Qiling( path,
        rootfs,
        verbose=QL_VERBOSE.OFF,
        console=True
    )
    setup_hooks()
    ql.run()
```

### Snapshot

### Fuzzing

> voir [Qiling + AFL](/cyber/pwn/fuzzing/qiling-+-afl.md)
