Archie est un cadre basé sur QEMU pour l'évaluation indépendante de l'architecture des défauts. Il permet à l'utilisateur de définir des campagnes de défauts à l'aide d'un fichier de configuration JSON et d'exécuter automatiquement toute la campagne sans entrée utilisateur supplémentaire. Archie est capable de simuler des défauts permanents et transitoires dans les instructions, la mémoire et les registres. Les données comportementales de la cible sont collectées et stockées dans un fichier journal HDF5 pour une analyse ultérieure.
Pour utiliser ce programme Python, QEMU avec le plugin de défaut est nécessaire (QEMU peut être trouvé dans QEMU, le plugin de défaut peut être trouvé dans le dossier FaultPlugin).
Un exemple de projet, qui injecte des défauts dans un firmware Tinyaes intégré, peut être trouvé unter https://github.com/tibersam/archie-aes-example
[[ TOC ]]
Pour la chaîne d'outils Qemu et le plugin de défaut doivent être compilés. Cela peut être fait automatiquement en exécutant le script build.sh . Veuillez vous assurer que les bibliothèques requises pour Qemu et les bibliothèques Python pour Archie sont installées. Pour Ubuntu, le script de construction peut installer les dépendances manquantes pour Qemu et Python. Il vous demandera s'il doit installer les dépendances.
./build.sh
Alternativement, les instructions de construction sont fournies dans les sections suivantes.
Archie a été testé avec Qemu 6.0, qui est disponible dans Archie-Qemu. Assurez-vous d'abord que les exigences de base pour Qemu sont installées. Voir le wiki pour les bibliothèques requises (https://wiki.qemu.org/hosts/linux). Sur les systèmes Ubuntu, vous pouvez installer les packages minimaux requis avec:
sudo apt install git build-essential ninja-build libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev
Découvrez le sous-module GIT Qemu, qui devrait vérifier TCG_PLUGIN_DEV du GIT. Voir le segment de code ci-dessous.
git submodule update --init
mkdir -p qemu/build/debug
cd qemu/build/debug
./../../configure --target-list=arm-softmmu --enable-debug --enable-plugins --disable-sdl --disable-gtk --disable-curses --disable-vnc
make -j {CPUCORENUMBER}
cd ../../../faultplugin/
make
Avec cela, Archie-Qemu est construit dans Qemu / build / Debug / et le plugin est construit dans FaultPlugin / Si vous modifiez le répertoire de construction pour Archie-Qemu , veuillez modifier le chemin dans le makefile dans le FaultPlugin / Dossier pour la construction du plugin.
Pour le programme Python3, les bibliothèques suivantes sont nécessaires
pandas (tested 0.25.3)
tables (tested 3.6.1)
python-prctl (tested 1.6.1)
numpy (tested 1.17.4)
json (tested 2.0.9), or json5 (tested 0.9.6)
Ces bibliothèques Python3 peuvent être installées à l'aide de la méthode d'installation de votre Linux-Distribution ou en utilisant PIP3. JSON5 est fortement recommandé car il permet aux entiers d'être représentés sous forme de nombres hexadécimaux.
Pour PIP3, les exigences.txt peuvent être utilisées. Si vous utilisez PIP3, assurez-vous d'installer LiBCAP-DEV . Il est nécessaire pour Python-PRCTL. Voir aussi https://pythonhosted.org/python-prctl/#downloading-and-installing
Pour utiliser le programme Python3 (Controller.py), deux fichiers de configuration sont nécessaires. Ces fichiers sont au format JSON. Voir https://www.json.org/json-en.html pour plus de détails.
QemUconf.json contient un objet avec le chemin d'accès à l'exécutable QEMU, la bibliothèque de plugin, le BIOS et le noyau qui devrait être exécuté par Qemu. Des arguments supplémentaires qui doivent être transmis à Qemu peuvent être spécifiés avec additional_qemu_args . Voir "QemUconf.json" pour un fichier JSON valide avec des chemins. Veuillez ajuster les chemins à votre système respectif. Le dossier MiniBlink contient une démo binaire pour l'expérimentation initiale. Pour le tester, modifiez le chemin du noyau vers "kernel" : "miniblink/miniblink.bin . Si une autre architecture doit être utilisée, modifiez la ligne "machine" : "stm32f0discovery" en remplaçant le nom STM32F0Discovery par le nom associé dans Qemu. Pour trouver le nom, exécutez le Qemu binaire par l'option -M ? ..
Fault.json contient la description des défauts. Il contient un objet qui implique l'objet de point de départ, l'objet Endpoint, l'objet Memdump et un tableau de défauts. Veuillez consulter les descriptions dans Fault-Readme.md pour voir comment construire cet objet JSON. Un exemple de configuration pour plusieurs expériences peut être trouvé dans Fault.json
La sortie du programme sera stockée dans un fichier HDF5. Pour une description de la façon d'interpréter le contenu du fichier, voir hdf5 readme.md .
Pour exécuter le programme Python3, Type:
python3 controller.py --debug --fault fault.json --qemu qemuconf.json output.hdf5
Remplacez Fault.json et QemUconf.json par les fichiers correspondants.
L' indicateur debug crée un fichier journal pour chaque expérience. Le nom du fichier journal a le format suivant: log_experiment-id.txt , par exemple, log_4.txt pour l'expérience avec l'ID 4.
Pour obtenir des informations supplémentaires sur les paramètres d'entrée, Type:
python3 controller.py --help
Il est possible de se connecter à une instance QEMU en cours avec GDB. Pour utiliser cette fonctionnalité dans le cadre et observer les défauts introduits, l'indicateur --gdb peut être défini. Archie commencera le processus QEMU interne avec GDB activé et s'arrête au démarrage du système simulé. Pour se connecter à QEMU à partir de GDB, utilisez le port 1234. Il obligera également le cadre à apparaître uniquement un travailleur et il traversera tous les défauts configurés dans Fault.json . Si un défaut spécifique est requis, le fichier JSON doit être modifié pour ne contenir que ce défaut spécifique.
python3 controller.py --gdb --fault fault.json --qemu qemuconf.json output.hdf5
Pour se connecter de GDB à la session QEMU Utiliser
targ rem:localhost:1234
Qemu attendra unil la session GDB est attachée. Le mode de débogage ne convient que pour l'analyse d'un faible nombre de défauts. Parcourir une grande quantité de défauts est lourd. Cela doit être pris en compte lors de l'ajustement des fichiers JSON.