Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
miasm — Framework de rétro-ingénierie en Python | Kitploit
Outils/GitHubGitHub/cea-sec/miasm
Analyse StatiqueAnalyse Dynamique (Sandboxing)Rétro-ingénierieDébogueursFuzzingAnalyse de Binaires
GitHubcea-sec/miasm

miasm

Framework de rétro-ingénierie en Python

Voir le dépôt
3.9k489il y a 10 joursVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
Site web

Build Status Build status Miasm tests Code Climate Join the chat at https://gitter.im/cea-sec/miasm

Qu'est-ce que Miasm ?

Miasm est un framework de rétro-ingénierie gratuit et open source (GPLv2). Miasm a pour but d'analyser / modifier / générer des programmes binaires. Voici une liste non exhaustive de fonctionnalités :

  • Ouvrir / modifier / générer des PE / ELF 32 / 64 LE / BE
  • Assembler / Désassembler X86 / ARM / MIPS / SH4 / MSP430
  • Représenter la sémantique d'assemblage à l'aide d'un langage intermédiaire
  • Émuler via JIT (analyse de code dynamique, dépaquetage, ...)
  • Simplification d'expressions pour la désobfuscation automatique
  • ...

Consultez le blog officiel pour plus d'exemples et de démos.

Table des matières

  • Qu'est-ce que Miasm ?
  • Exemples de base
    • Assembler / Désassembler
    • Représentation intermédiaire
    • Émulation
    • Exécution symbolique
  • Comment ça marche ?
  • Documentation
  • Obtenir Miasm
    • Prérequis logiciels
    • Configuration
    • Windows et IDA
  • Tests
  • Ils utilisent déjà Miasm
  • Divers

Exemples de base

Assembler / Désassembler

Importer l'architecture x86 de Miasm :```pycon

from miasm.arch.x86.arch import mn_x86 from miasm.core.locationdb import LocationDB

root@kitploit:~
Obtenez un db de localisation :```pycon
>>> loc_db = LocationDB()

Assembler une ligne :```pycon

l = mn_x86.fromstring('XOR ECX, ECX', loc_db, 32) print(l) XOR ECX, ECX mn_x86.asm(l) ['1\xc9', '3\xc9', 'g1\xc9', 'g3\xc9']

root@kitploit:~
Modifier un opérande :```pycon
>>> l.args[0] = mn_x86.regs.EAX
>>> print(l)
XOR        EAX, ECX
>>> a = mn_x86.asm(l)
>>> print(a)
['1\xc8', '3\xc1', 'g1\xc8', 'g3\xc1']

Désassemblez le résultat :```pycon

print(mn_x86.dis(a[0], 32)) XOR EAX, ECX

root@kitploit:~
En utilisant l'abstraction `Machine`:```pycon
>>> from miasm.analysis.machine import Machine
>>> mn = Machine('x86_32').mn
>>> print(mn.dis('\x33\x30', 32))
XOR        ESI, DWORD PTR [EAX]

Pour MIPS:```pycon

mn = Machine('mips32b').mn print(mn.dis(b'\x97\xa3\x00 ', "b")) LHU V1, 0x20(SP)

root@kitploit:~
Représentation intermédiaire
---------------------------

Créer une instruction :```pycon
>>> machine = Machine('arml')
>>> instr = machine.mn.dis('\x00 \x88\xe0', 'l')
>>> print(instr)
ADD        R2, R8, R0

Créer un objet de représentation intermédiaire :```pycon

lifter = machine.lifter_model_call(loc_db)

root@kitploit:~
Créer un ircfg vide :```pycon
>>> ircfg = lifter.new_ircfg()

Ajouter une instruction au pool:```pycon

lifter.add_instr_to_ircfg(instr, ircfg)

root@kitploit:~
Afficher le pool actuel :```pycon
>>> for lbl, irblock in ircfg.blocks.items():
...     print(irblock)
loc_0:
R2 = R8 + R0

IRDst = loc_4

Travailler avec IR, par exemple en obtenant des effets secondaires :```pycon

for lbl, irblock in ircfg.blocks.items(): ... for assignblk in irblock: ... rw = assignblk.get_rw() ... for dst, reads in rw.items(): ... print('read: ', [str(x) for x in reads]) ... print('written:', dst) ... print() ... read: ['R8', 'R0'] written: R2

read: [] written: IRDst

root@kitploit:~
Plus d'informations sur l'IR de Miasm sont dans le [Jupyter Notebook correspondant](https://github.com/cea-sec/miasm/blob/master/doc/expression/expression.ipynb).

Émulation
---------```pycon
00000000 8d4904      lea    ecx, [ecx+0x4]
00000003 8d5b01      lea    ebx, [ebx+0x1]
00000006 80f901      cmp    cl, 0x1
00000009 7405        jz     0x10
0000000b 8d5bff      lea    ebx, [ebx-1]
0000000e eb03        jmp    0x13
00000010 8d5b01      lea    ebx, [ebx+0x1]
00000013 89d8        mov    eax, ebx
00000015 c3          ret
>>> s = b'\x8dI\x04\x8d[\x01\x80\xf9\x01t\x05\x8d[\xff\xeb\x03\x8d[\x01\x89\xd8\xc3'

Importez le shellcode grâce à l'abstraction Container:```pycon

from miasm.analysis.binary import Container c = Container.from_string(s, loc_db) c <miasm.analysis.binary.ContainerUnknown object at 0x7f34cefe6090>

root@kitploit:~
Désassemblage du shellcode à l'adresse `0` :```pycon
>>> from miasm.analysis.machine import Machine
>>> machine = Machine('x86_32')
>>> mdis = machine.dis_engine(c.bin_stream, loc_db=loc_db)
>>> asmcfg = mdis.dis_multiblock(0)
>>> for block in asmcfg.blocks:
...  print(block)
...
loc_0
LEA        ECX, DWORD PTR [ECX + 0x4]
LEA        EBX, DWORD PTR [EBX + 0x1]
CMP        CL, 0x1
JZ         loc_10
->      c_next:loc_b    c_to:loc_10
loc_10
LEA        EBX, DWORD PTR [EBX + 0x1]
->      c_next:loc_13
loc_b
LEA        EBX, DWORD PTR [EBX + 0xFFFFFFFF]
JMP        loc_13
->      c_to:loc_13
loc_13
MOV        EAX, EBX
RET

Initialisation du moteur JIT avec une pile :```pycon

jitter = machine.jitter(loc_db, jit_type='python') jitter.init_stack()

root@kitploit:~
Ajoutez le shellcode dans un emplacement mémoire arbitraire :```pycon
>>> run_addr = 0x40000000
>>> from miasm.jitter.csts import PAGE_READ, PAGE_WRITE
>>> jitter.vm.add_memory_page(run_addr, PAGE_READ | PAGE_WRITE, s)

Créez une sentinelle pour intercepter le retour du shellcode :```Python def code_sentinelle(jitter): jitter.running = False jitter.pc = 0 return True

jitter.add_breakpoint(0x1337beef, code_sentinelle) jitter.push_uint32_t(0x1337beef)

root@kitploit:~
Logs actifs:```pycon
>>> jitter.set_trace_log()

Exécuter à une adresse arbitraire :```pycon

jitter.init_run(run_addr) jitter.continue_run() RAX 0000000000000000 RBX 0000000000000000 RCX 0000000000000000 RDX 0000000000000000 RSI 0000000000000000 RDI 0000000000000000 RSP 000000000123FFF8 RBP 0000000000000000 zf 0000000000000000 nf 0000000000000000 of 0000000000000000 cf 0000000000000000 RIP 0000000040000000 40000000 LEA ECX, DWORD PTR [ECX+0x4] RAX 0000000000000000 RBX 0000000000000000 RCX 0000000000000004 RDX 0000000000000000 RSI 0000000000000000 RDI 0000000000000000 RSP 000000000123FFF8 RBP 0000000000000000 zf 0000000000000000 nf 0000000000000000 of 0000000000000000 cf 0000000000000000 .... 4000000e JMP loc_0000000040000013:0x40000013 RAX 0000000000000000 RBX 0000000000000000 RCX 0000000000000004 RDX 0000000000000000 RSI 0000000000000000 RDI 0000000000000000 RSP 000000000123FFF8 RBP 0000000000000000 zf 0000000000000000 nf 0000000000000000 of 0000000000000000 cf 0000000000000000 RIP 0000000040000013 40000013 MOV EAX, EBX RAX 0000000000000000 RBX 0000000000000000 RCX 0000000000000004 RDX 0000000000000000 RSI 0000000000000000 RDI 0000000000000000 RSP 000000000123FFF8 RBP 0000000000000000 zf 0000000000000000 nf 0000000000000000 of 0000000000000000 cf 0000000000000000 RIP 0000000040000013 40000015 RET

root@kitploit:~
Interagir avec le jitter :```pycon
>>> jitter.vm
ad 1230000 size 10000 RW_ hpad 0x2854b40
ad 40000000 size 16 RW_ hpad 0x25e0ed0

>>> hex(jitter.cpu.EAX)
'0x0L'
>>> jitter.cpu.ESI = 12

Exécution symbolique

Initialisation du pool IR :```pycon

lifter = machine.lifter_model_call(loc_db) ircfg = lifter.new_ircfg_from_asmcfg(asmcfg)

root@kitploit:~
Initialisation du moteur avec des valeurs symboliques par défaut :```pycon
>>> from miasm.ir.symbexec import SymbolicExecutionEngine
>>> sb = SymbolicExecutionEngine(lifter)

Lancement de l'exécution :```pycon

symbolic_pc = sb.run_at(ircfg, 0) print(symbolic_pc) ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10)

root@kitploit:~
Idem, avec les journaux d'étape (seuls les changements sont affichés) :```pycon
>>> sb = SymbolicExecutionEngine(lifter, machine.mn.regs.regs_init)
>>> symbolic_pc = sb.run_at(ircfg, 0, step=True)
Instr LEA        ECX, DWORD PTR [ECX + 0x4]
Assignblk:
ECX = ECX + 0x4
________________________________________________________________________________
ECX                = ECX + 0x4
________________________________________________________________________________
Instr LEA        EBX, DWORD PTR [EBX + 0x1]
Assignblk:
EBX = EBX + 0x1
________________________________________________________________________________
EBX                = EBX + 0x1
ECX                = ECX + 0x4
________________________________________________________________________________
Instr CMP        CL, 0x1
Assignblk:
zf = (ECX[0:8] + -0x1)?(0x0,0x1)
nf = (ECX[0:8] + -0x1)[7:8]
pf = parity((ECX[0:8] + -0x1) & 0xFF)
of = ((ECX[0:8] ^ (ECX[0:8] + -0x1)) & (ECX[0:8] ^ 0x1))[7:8]
cf = (((ECX[0:8] ^ 0x1) ^ (ECX[0:8] + -0x1)) ^ ((ECX[0:8] ^ (ECX[0:8] + -0x1)) & (ECX[0:8] ^ 0x1)))[7:8]
af = ((ECX[0:8] ^ 0x1) ^ (ECX[0:8] + -0x1))[4:5]
________________________________________________________________________________
af                 = (((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[4:5]
pf                 = parity((ECX + 0x4)[0:8] + 0xFF)
zf                 = ((ECX + 0x4)[0:8] + 0xFF)?(0x0,0x1)
ECX                = ECX + 0x4
of                 = ((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1))[7:8]
nf                 = ((ECX + 0x4)[0:8] + 0xFF)[7:8]
cf                 = (((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1)) ^ ((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[7:8]
EBX                = EBX + 0x1
________________________________________________________________________________
Instr JZ         loc_key_1
Assignblk:
IRDst = zf?(loc_key_1,loc_key_2)
EIP = zf?(loc_key_1,loc_key_2)
________________________________________________________________________________
af                 = (((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[4:5]
EIP                = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10)
pf                 = parity((ECX + 0x4)[0:8] + 0xFF)
IRDst              = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10)
zf                 = ((ECX + 0x4)[0:8] + 0xFF)?(0x0,0x1)
ECX                = ECX + 0x4
of                 = ((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1))[7:8]
nf                 = ((ECX + 0x4)[0:8] + 0xFF)[7:8]
cf                 = (((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1)) ^ ((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[7:8]
EBX                = EBX + 0x1
________________________________________________________________________________
>>>

Réessayez l'exécution avec un ECX concret. Ici, l'exécution symbolique / concolic atteint la fin du shellcode :```pycon

from miasm.expression.expression import ExprInt sb.symbols[machine.mn.regs.ECX] = ExprInt(-3, 32) symbolic_pc = sb.run_at(ircfg, 0, step=True) Instr LEA ECX, DWORD PTR [ECX + 0x4] Assignblk: ECX = ECX + 0x4


af = (((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[4:5] EIP = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) pf = parity((ECX + 0x4)[0:8] + 0xFF) IRDst = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) zf = ((ECX + 0x4)[0:8] + 0xFF)?(0x0,0x1) ECX = 0x1 of = ((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1))[7:8] nf = ((ECX + 0x4)[0:8] + 0xFF)[7:8] cf = (((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1)) ^ ((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[7:8] EBX = EBX + 0x1


Instr LEA EBX, DWORD PTR [EBX + 0x1] Assignblk: EBX = EBX + 0x1


af = (((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[4:5] EIP = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) pf = parity((ECX + 0x4)[0:8] + 0xFF) IRDst = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) zf = ((ECX + 0x4)[0:8] + 0xFF)?(0x0,0x1) ECX = 0x1 of = ((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1))[7:8] nf = ((ECX + 0x4)[0:8] + 0xFF)[7:8] cf = (((((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8]) & ((ECX + 0x4)[0:8] ^ 0x1)) ^ ((ECX + 0x4)[0:8] + 0xFF) ^ (ECX + 0x4)[0:8] ^ 0x1)[7:8] EBX = EBX + 0x2


Instr CMP CL, 0x1 Assignblk: zf = (ECX[0:8] + -0x1)?(0x0,0x1) nf = (ECX[0:8] + -0x1)[7:8] pf = parity((ECX[0:8] + -0x1) & 0xFF) of = ((ECX[0:8] ^ (ECX[0:8] + -0x1)) & (ECX[0:8] ^ 0x1))[7:8] cf = (((ECX[0:8] ^ 0x1) ^ (ECX[0:8] + -0x1)) ^ ((ECX[0:8] ^ (ECX[0:8] + -0x1)) & (ECX[0:8] ^ 0x1)))[7:8] af = ((ECX[0:8] ^ 0x1) ^ (ECX[0:8] + -0x1))[4:5]


af = 0x0 EIP = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) pf = 0x1 IRDst = ((ECX + 0x4)[0:8] + 0xFF)?(0xB,0x10) zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x2


Instr JZ loc_key_1 Assignblk: IRDst = zf?(loc_key_1,loc_key_2) EIP = zf?(loc_key_1,loc_key_2)


af = 0x0 EIP = 0x10 pf = 0x1 IRDst = 0x10 zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x2


Instr LEA EBX, DWORD PTR [EBX + 0x1] Assignblk: EBX = EBX + 0x1


af = 0x0 EIP = 0x10 pf = 0x1 IRDst = 0x10 zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x3


Instr LEA EBX, DWORD PTR [EBX + 0x1] Assignblk: IRDst = loc_key_3


af = 0x0 EIP = 0x10 pf = 0x1 IRDst = 0x13 zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x3


Instr MOV EAX, EBX Assignblk: EAX = EBX


af = 0x0 EIP = 0x10 pf = 0x1 IRDst = 0x13 zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x3 EAX = EBX + 0x3


Instr RET Assignblk: IRDst = @32[ESP[0:32]] ESP = {ESP[0:32] + 0x4 0 32} EIP = @32[ESP[0:32]]


af = 0x0 EIP = @32[ESP] pf = 0x1 IRDst = @32[ESP] zf = 0x1 ECX = 0x1 of = 0x0 nf = 0x0 cf = 0x0 EBX = EBX + 0x3 ESP = ESP + 0x4 EAX = EBX + 0x3


root@kitploit:~
Comment ça marche ?
=================

Miasm embarque son propre désassembleur, langage intermédiaire et sémantique d'instructions. Il est écrit en Python.

Pour émuler du code, il utilise LLVM, GCC, Clang ou Python pour JIT la représentation intermédiaire. Il peut émuler des shellcodes et tout ou partie de binaires. Des callbacks Python peuvent être exécutés pour interagir avec l'exécution, par exemple pour émuler les effets des fonctions de bibliothèque.

Documentation
=============

Des ressources de documentation sont disponibles dans le dossier [doc](https://github.com/cea-sec/miasm/blob/HEAD/doc).

Une documentation auto-générée est disponible :
* [Doxygen](http://miasm.re/miasm_doxygen)
* [pdoc](http://miasm.re/miasm_pdoc)

Obtention de Miasm
===================

* Clonez le dépôt : [Miasm sur GitHub](https://github.com/cea-sec/miasm/)
* Obtenez l'une des images Docker sur [Docker Hub](https://registry.hub.docker.com/u/miasm/)

Prérequis logiciels
--------------------

Miasm utilise :

* python-pyparsing
* python-dev
* optionnellement python-pycparser (version >= 2.17)

Pour activer le JIT de code, l'un des modules suivants est obligatoire :
* GCC
* Clang
* LLVM avec Numba llvmlite, voir ci-dessous

'optionnel' Miasm peut aussi utiliser :
* Z3, le [prouveur de théorèmes](https://github.com/Z3Prover/z3)

Configuration
-------------

Pour utiliser le jitter, GCC ou LLVM est recommandé
* GCC (n'importe quelle version)
* Clang (n'importe quelle version)
* LLVM
  * Debian (testing/unstable) : Non testé
  * Debian stable/Ubuntu/Kali/whatever : `pip install llvmlite` ou installer depuis [llvmlite](https://github.com/numba/llvmlite)
  * Windows : Non testé
* Construire et installer Miasm :```pycon
$ cd miasm_directory
$ python setup.py build
$ sudo python setup.py install

Si quelque chose se passe mal lors de la compilation d'un des modules jitter, Miasm ignorera l'erreur et désactivera le module correspondant (voir la sortie de compilation).

Windows et IDA

La plupart des plugins IDA de Miasm utilisent un sous-ensemble des fonctionnalités de Miasm. Un moyen rapide de les faire fonctionner est d'ajouter :

  • pyparsing.py dans C:\...\IDA\python\ ou pip install pyparsing
  • le répertoire miasm/miasm dans C:\...\IDA\python\

Toutes les fonctionnalités, à l'exception de celles liées au JITter, seront disponibles. Pour une installation plus complète, veuillez vous référer aux paragraphes ci-dessus.

Tests

Miasm est livré avec un ensemble de tests de régression. Pour exécuter tous ces tests :```pycon cd miasm_directory/test

Run tests using our own test runner

python test_all.py

Run tests using standard frameworks (slower, require 'parameterized')

python -m unittest test_all.py # sequential, requires 'unittest' python -m pytest test_all.py # sequential, requires 'pytest' python -m pytest -n auto test_all.py # parallel, requires 'pytest' and 'pytest-xdist'

root@kitploit:~
Certaines options peuvent être spécifiées :

* Mono threading : `-m`
* Instrumentation de couverture de code : `-c`
* Tests rapides uniquement : `-t long` (exclut les tests longs)

Ils utilisent déjà Miasm
=========================

Outils
------

* [Sibyl](https://github.com/cea-sec/Sibyl) : Un outil de divination de fonctions
* [R2M2](https://github.com/guedou/r2m2) : Utiliser miasm comme plugin radare2
* [CGrex](https://github.com/mechaphish/cgrex) : Correcteur ciblé pour les binaires CGC
* [ethRE](https://github.com/jbcayrou/ethRE) : Outil de rétro-ingénierie pour Ethereum EVM (avec l'architecture Miasm2 correspondante)

Articles de blog / papiers / conférences
-----------------------------------------

* [Désobfuscation : récupérer un programme protégé par OLLVM](http://blog.quarkslab.com/deobfuscation-recovering-an-ollvm-protected-program.html)
* [Apprivoiser un binaire MIPS protégé par Nanomite avec exécution symbolique : No Such Crackme](https://doar-e.github.io/blog/2014/10/11/taiming-a-wild-nanomite-protected-mips-binary-with-symbolic-execution-no-such-crackme/)
* [Génération rapide de DGA avec Miasm](https://www.lexsi.com/securityhub/generation-rapide-de-dga-avec-miasm/) : Calcul rapide de DGA (article français)
* [Permettre la résistance aux crashs côté client pour surmonter la diversification et le masquage d'informations](https://www.internetsociety.org/sites/default/files/blogs-media/enabling-client-side-crash-resistance-overcome-diversification-information-hiding.pdf) : Détecter les arguments potentiels d'appels non dirigés
* [Miasm : Framework de reverse engineering](https://www.sstic.org/2012/presentation/miasm_framework_de_reverse_engineering/) (français)
* [Tutoriel miasm](https://www.sstic.org/2014/presentation/Tutorial_miasm/) (vidéo française)
* [Graphes de dépendances : Petit Poucet style](https://www.sstic.org/2016/presentation/graphes_de_dpendances__petit_poucet_style/) : DepGraph (français)

Livres
------

* [Practical Reverse Engineering: X86, X64, Arm, Windows Kernel, Reversing Tools, and Obfuscation](http://eu.wiley.com/WileyCDA/WileyTitle/productCd-1118787315,subjectCd-CSJ0.html) : Introduction à Miasm (Chapitre 5 « Obfuscation »)
* [BlackHat Python - Annexe](https://github.com/oreilly-japan/black-hat-python-jp-support/tree/master/appendix-A) : Échantillons du livre de sécurité japonais
Télécharger l’outil