
Désassembleur interactif facilement re-ciblable et modifiable, avec une API de plugins compatible IDAPython.
ScratchABit est un désassembleur incrémental interactif avec des capacités d'analyse de flux de données et de contrôle. ScratchABit est dédié aux efforts de la communauté de rétro-ingénierie OpenSource (rétro-ingénierie pour produire des pilotes/firmware OpenSource pour du matériel mal supporté par les fournisseurs, pour l'interopérabilité matérielle et logicielle, pour la recherche en sécurité).
ScratchABit prend en charge l'API IDAPython bien connue dans la communauté pour écrire des modules de désassemblage/d'extension.
ScratchABit est un travail en cours, des fonctionnalités sont ajoutées au besoin, les contributions sont les bienvenues.
ScratchABit est publié sous les termes de la GNU General Public License v3 (GPLv3).
Ne doit pas être écrit dans un langage obscurci. Cela inclut les langages qui sont trop bas niveau, qui permettent d'accéder à des variables non initialisées, qui ne différencient pas les variables des fonctions/procédures, qui commencent les indices de tableau à partir de nombres arbitraires, etc., etc. ScratchABit est écrit en Python (version moderne, Python3) pour votre plaisir et votre santé mentale.
Le framework d'interface utilisateur doit permettre une interaction utilisateur du niveau requis, sans ajouter de dépendances, de bloat, de problèmes et d'incompatibilités entre les versions du framework. ScratchABit utilise actuellement une interface utilisateur texte plein écran simple, utilisant les séquences d'échappement de terminal ANSI/VT100 (oui, même la bibliothèque curses a été jugée trop lourde comme dépendance à imposer aux utilisateurs).
Devrait tirer parti de formats texte faciles à utiliser pour stocker la « base de données », afin de faciliter la réutilisation et l'écriture d'outils, et le stockage dans des systèmes de contrôle de version.
Pour utiliser ScratchABit, vous avez besoin de Python3 installé (testé avec Python 3.3 à 3.7) et d'un terminal ou émulateur de terminal VT100 (minimum) ou XTerm (recommandé) (tout système Unix devrait être compatible, comme Linux/BSD/etc., voir FAQ ci-dessous pour plus).
Clonez le code en utilisant :
git clone --recursive https://github.com/pfalcon/ScratchABit
Si vous avez cloné le code sans --recursive, exécutez git submodule update --init dans le répertoire ScratchABit.
ScratchABit est désormais livré avec un ou des plugins CPU basés sur Capstone Engine, qui permettent d'accéder à un certain nombre d'architectures CPU. Pour l'utiliser, le module de liaisons Python récent pour Capstone doit être installé (de préférence aux paquets fournis par les distributions OS, souvent obsolètes). Le moyen le plus simple de l'installer est dans le répertoire des paquets utilisateur Python :
pip3 install --no-cache-dir --user capstone
Une alternative est de l'installer dans un environnement virtuel Python dans le répertoire ScratchABit :
python3 -m venv .venv
source .venv/bin/activate
pip3 install --no-cache-dir capstone
Chaque fois que vous ouvrez une nouvelle session de terminal pour travailler avec ScratchABit, exécutez à nouveau la commande source .venv/bin/activate pour activer l'environnement virtuel.
Si rien de ce qui précède ne fonctionne, vous pouvez essayer d'installer le paquet capstone à l'échelle du système (déconseillé) :
sudo pip3 install --system capstone
Si vous souhaitez désassembler un fichier dans un format exécutable auto-descriptif (comme ELF), passez-le simplement comme argument à ScratchABit.py. Le dépôt inclut un certain nombre de fichiers example-*.elf pour diverses architectures pour un démarrage rapide. Par exemple, pour essayer la version x86 32 bits :
python3 ScratchABit.py example-x86_32.elf
Alternativement, si vous souhaitez désassembler un fichier binaire brut, vous devez créer un fichier .def (définition), pour spécifier les zones mémoire définies pour le code, à quelle adresse charger le fichier binaire, etc. (Remarque : un fichier .def peut être utile pour les fichiers .elf et similaires aussi.) Le dépôt inclut un code binaire brut simple x86_64, et le fichier example-x86_64.def correspondant (regardez à l'intérieur pour la description des options disponibles) :
python3 ScratchABit.py example-x86_64.def
Appuyez sur F9 pour accéder aux menus (la souris fonctionne aussi dans les terminaux compatibles XTerm). Appuyez sur F1 pour obtenir de l'aide sur les raccourcis clavier (la plupart des actions sont également accessibles via le menu). Le flux de travail de ScratchABit est similaire à d'autres désassembleurs interactifs (une expérience préalable ou une lecture de fond peut être utile).
Les plugins de processeur IDAPython peuvent être chargés depuis n'importe quel endroit du chemin des modules Python. Alternativement, vous pouvez créer un lien symbolique/copier le(s) fichier(s) .py du plugin dans le sous-répertoire plugins/cpu/.
Une fois le plugin rendu disponible, créez un nouveau fichier de définition basé sur example-x86_64.def qui définit le nom du module plugin (sans l'extension .py) dans la ligne cpu xxx.
Pour un exemple très simple utilisant un plugin externe, voir ce fichier esp8266.def qui fonctionne avec le plugin xtensa.py du dépôt ida-xtensa2.
Q : Quels processeurs/architectures sont pris en charge ?
R : ScratchABit ne prend en charge aucune architecture de processeur par lui-même, il est entièrement reciblable à l'aide de plugins API IDAPython. De nombreux plugins sont disponibles, écrire un nouveau plugin est facile. Pour permettre aux utilisateurs d'essayer ScratchABit, un simple plugin de processeur x86 est inclus dans la distribution, utilisant le désassembleur Pymsasid sous le capot.
À partir de la version 2.0, un plugin Capstone est également inclus, permettant d'accéder à un certain nombre d'architectures, notamment x86, ARM, MIPS, PowerPC, SPARC, etc. (le support d'architecture est activé progressivement en fonction des tests utilisateurs).
Vous pouvez en savoir plus sur les plugins fournis avec ScratchABit dans le README du répertoire plugins/cpu/.
Q : Débogueur ?
R : ScratchABit est dédié à l'analyse statique et au support facile des nouvelles architectures CPU (il suffit de coder un nouveau plugin CPU en Python - vous pouvez obtenir des résultats initiaux en quelques heures). L'analyse dynamique n'a pas été conçue comme une fonctionnalité principale et il n'y a pas de plans immédiats pour l'implémenter. Les correctifs sont cependant les bienvenus.
Q : Décompilateur ?
R : Il existe un projet connexe, appelé ScratchABlock pour l'analyse approfondie de programmes, la transformation et la décompilation. On s'attend à ce qu'à mesure que ScratchABlock mûrit, certaines de ses fonctionnalités soient disponibles dans ScratchABit (peut-être via des plugins).
Q : Je ne suis pas sur Linux, comment puis-je exécuter ScratchABit ?
R : Installez Linux dans un émulateur/VM sur votre système et réjouissez-vous.
Q : Capture d'écran obligatoire ?
R : Bien sûr :
