ScratchABit est un désassembleur incrémentiel interactif doté de capacités d'analyse de flux de données/contrôle. ScratchABit est dédié aux efforts de la communauté d'ingénierie inverse OpenSource (ingénierie inverse pour produire des pilotes/micrologiciels OpenSource pour le matériel non correctement pris en charge par les fournisseurs, pour l'interopérabilité matérielle et logicielle, pour la recherche en matière de sécurité).
ScratchABit prend en charge l'API IDAPython bien connue de la communauté pour écrire des modules de désassemblage/extension.
ScratchABit est un travail en cours, des fonctionnalités sont ajoutées selon les besoins, les contributions sont les bienvenues.
ScratchABit est publié selon les termes de la licence publique générale GNU v3 (GPLv3).
Ne doit pas être écrit dans un langage obscur. Il s'agit notamment de langages de trop bas niveau, qui permettent d'accéder à des variables non initialisées, qui ne font pas de différence entre les variables et les fonctions/procédures, qui démarrent des index de tableaux à partir de nombres arbitraires, etc., etc. ScratchABit est écrit en Python ( version moderne, Python3) pour votre plaisir et votre santé mentale.
Le cadre d'interface utilisateur doit permettre l'interaction de l'utilisateur au niveau nécessaire, sans ajouter de dépendances, de surcharge, de problèmes et d'incompatibilités entre les versions du cadre. ScratchABit utilise actuellement une simple interface utilisateur texte plein écran, utilisant des séquences d'échappement de terminal ANSI/VT100 (oui, même la bibliothèque Curses a été jugée trop lourde pour être imposée aux utilisateurs).
Doit exploiter des formats de texte faciles à utiliser pour stocker la « base de données », afin de faciliter la réutilisation et l'écriture d'outils, ainsi que le stockage dans les systèmes de contrôle de version.
Pour utiliser ScratchABit, vous devez installer Python3 (testé avec Python 3.3 à 3.7) et un terminal ou un émulateur de terminal VT100 (minimum) ou XTerm (recommandé) (tout système Unix doit être conforme, 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é du code sans --recursive
, exécutez git submodule update --init
dans le répertoire ScratchABit.
ScratchABit est désormais livré avec des plugins CPU basés sur Capstone Engine, qui permettent d'accéder à un certain nombre d'architectures CPU. Pour l'utiliser, un module de liaisons Python récent pour Capstone doit être installé (de préférence aux packages livrés par les distributions d'OS, qui sont souvent obsolètes). Le moyen le plus simple de l'installer est dans le répertoire des packages utilisateur Python :
pip3 install --no-cache-dir --user capstone
Une alternative consiste à 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 des solutions ci-dessus ne fonctionne, vous pouvez essayer d’installer le package Capstone sur l’ensemble du système (non recommandé) :
sudo pip3 install --system capstone
Si vous souhaitez désassembler un fichier dans un format exécutable auto-descriptif (comme ELF), transmettez-le simplement comme argument à ScratchABit.py
. Le référentiel comprend un certain nombre d' 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 quelles zones de mémoire sont définies pour le code, à quelle adresse charger le fichier binaire, etc. (Remarque : un fichier . def peut également être utile pour .elf et des fichiers similaires.) Le référentiel comprend un simple code binaire brut x86_64 et le fichier exemple-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 également 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 à celui d'autres dissambleurs interactifs (une certaine expérience antérieure ou une lecture de fond peut être utile).
Les plugins du processeur IDAPython peuvent être chargés depuis n'importe où sur le chemin du module Python. Alternativement, vous pouvez créer un lien symbolique/copier le(s) fichier(s) du plugin .py
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 du plugin (sans extension .py
) dans la ligne cpu xxx
.
Pour un exemple très simple utilisant un plugin externe, consultez ce fichier esp8266.def qui fonctionne avec le plugin xtensa.py du référentiel ida-xtensa2.
Q : Quels processeurs/architectures sont pris en charge ?
R : ScratchABit ne prend en charge aucune architecture de processeur à lui seul, il est entièrement reciblable à l'aide des plugins API IDAPython. De nombreux plugins sont disponibles, écrire un nouveau plugin est facile. Pour permettre aux utilisateurs de tester 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, le plugin Capstone est également inclus, permettant d'accéder à un certain nombre d'architectures, notamment x86, ARM, MIPS, PowerPC, SPARC, etc. (la prise en charge de l'architecture est activée progressivement en fonction des tests utilisateurs).
Vous pouvez en savoir plus sur les plugins livrés avec ScratchABit dans le README pour plugins/cpu/
dir.
Q : Débogueur ?
R : ScratchABit est dédié à l'analyse statique et à la prise en charge simple des nouvelles architectures de processeur (il suffit de coder un nouveau plugin de processeur en Python - vous pouvez obtenir les premiers résultats en quelques heures). L'analyse dynamique n'a pas été conçue pour être une fonctionnalité essentielle et il n'est pas prévu de la mettre en œuvre dans l'immédiat. Les correctifs sont cependant les bienvenus.
Q : Décompilateur ?
R : Il existe un projet connexe, appelé ScratchABlock, pour l'analyse, la transformation et la décompilation approfondies des programmes. On s'attend à ce qu'à mesure que ScratchABlock mûrisse, certaines de ses fonctionnalités soient disponibles dans ScratchABit (peut-être via des plugins).
Q : Je ne suis pas sous Linux, comment puis-je exécuter ScratchABit ?
R : Installez Linux dans un émulateur/une machine virtuelle sur votre système et réjouissez-vous.
Q : Capture d'écran obligatoire ?
R : Bien sûr :