IMA3/IMA4 2018/2020 P12
Sommaire
I. Présentation générale
Description
Trois périphériques sont envisagés :
- un clavier
- une souris
- et une clef USB
Chacun des périphériques sera construit autour d'un ATMEGA16u2 gérant le protocole USB.
Le clavier aura pour fonction de gérer les entrées et quelques LED.
La fonctionnalité supplémentaire consiste à enregistrer des touches tapées par l'utilisateur. Le contenu de cet historique sera stocké dans la mémoire interne du clavier, et pourra être vidé ou supprimé via une combinaison de touches.
La souris contrôlera le déplacement du curseur et possédera des boutons.
Elle contiendra également un mode "Berserk" qui cliquera aléatoirement sur l'écran. Ce mode sera déclenchable à distance.
Enfin, la clef USB sera utilisée comme lecteur de carte SD.
En cas d'inactivité prolongée, elle émulera un clavier qui injectera une séquence d’actions préalablement enregistrée afin de télécharger un logiciel de surveillance sur le PC auquel elle est connectée.
Objectifs
Notre objectif est de réaliser ces périphériques USB artisanaux avec les fonctionnalités supplémentaires décrites.
II. Analyse du projet
Analyse du premier concurrent
Le premier concurrent, celui du clavier, est représenté par les produits de type Keylogger.
Voici un des principaux concurrents de ce marché :
Nom du produit : KeyGrabber USB
Société : Keelog
Description générale:
Ce périphérique USB se connecte entre le port USB de l’ordinateur et celui du clavier. Il enregistre l’activité du clavier dans une mémoire interne. Les données peuvent être récupérées ou effacées avec la bonne combinaison de touches.
Caractéristiques :
Sa longueur est de 38mm. Elle a une capacité de stockage de 16Mo ou 8Go.
Les données présentes sont encryptées par un cryptage 128 bits, unique à chaque produit.
Son prix est 43.99$ pour la version 16Mo ou 83,99$ pour la version 8Go.
Analyse du second concurrent
Le second concurrent est celui de la clé USB.
Nom : USB RUBBER DUCKY
Société :hak5
Description général:
Il s'agit d'un périphérique USB reconnu en tant que clavier. Il injecte des instructions présentes sur la carte micro SD.
Il est facile d'utilisation car il suffit d'écrire les instructions dans un fichier texte, dans un langage spécifique.
Son prix est de 44,99$.
Positionnement par rapport à l'existant
En ce qui concerne le clavier, il aura à peu près les mêmes caractéristiques techniques que le KeyGrabber. La différence majeure réside dans la discrétion de celui-ci. En effet, le keygrabber est une clef USB et il est facilement repérable. Cela implique de le cacher à l'arrière de la tour.
Or, notre dispositif Keylogger sera directement implémentée dans le clavier. Ainsi il restera inaperçu depuis l'extérieur, sur n'importe quelle machine.
Ensuite, notre clé USB diffère de l'USB RUBBER DUCKY car elle sera en premier lieu utilisée comme lecteur de carte SD. On pourra donc s'en servir de stockage alors que chez le concurrent la carte micro SD sert de stockage pour les instructions à envoyer au PC.
Ce stockage rend donc moins suspect notre clé, qui pourra lancer le téléchargement du logiciel de surveillance en cas d'inactivité.
Scénario d'usage du produit ou du concept envisagé
Prenons des parents qui laissent leurs enfants utilisés l'ordinateur familial pour leur devoir maison. Mais il aimeraient vérifier qu'ils ne fassent pas n'importe quoi et qu'ils ne jouent pas sans rester en permanence derrière eux. Dans ce cadre, ils pourraient utilisés nos périphériques. Le clavier, leur permettrait de récupérer les données tapées et de vérifier que celles-ci correspondent bien au travail qu'ils avaient à réaliser. Afin de récupéré les données même si ils ne sont pas chez eux, ils peuvent utilisés la clé pour qu'elle télécharge un logiciel, qui tous les certains temps enregistre ce qu'il a été fait et l'envoie sur leur adresse mail. Quand à la souris, elle pourrait si en passant dans le bureau ils s’aperçoivent que les enfants sont en train de jouer, de les en dissuader en activant le mode berserk qui rendrait la souris momentanément inutilisable.
Réponse à la question difficile
Comment activer les fonctionnalités cachées des différents périphériques ?
Pour le clavier, les fonctionnalités seront activées et désactivées à l'aide d'une combinaison de touches prédéfinies :
combinaison 1 : activation de l’enregistrement des touches
combinaison 2 : désactivation de l'enregistrement des touches
combinaison 3 : renvoie l'historique des touches pressées
combinaison 4 : suppression de la mémoire
Au sujet de la clé, le périphérique va changer son mode de fonctionnement pour devenir un HID (clavier) après une certaine durée d'inactivité de celui-ci. Voir si nous pouvons détecter une mise en veille de Windows.
L'activation de la fonctionnalité de la souris sera faite par le biais d'une télécommande infrarouge. La coque de la souris possèdera une partie laissant passer les infrarouges.
Bibliographie et webographie
Liens concernants les concurrents
- du clavier :
Nom du produit :KeyGrabber USB
Société : Keelog
URL : http://www.keelog.com/fr/usb-keylogger/
- de la clé
Nom : USB RUBBER DUCKY
Société : hak5
URL : https://shop.hak5.org/products/usb-rubber-ducky-deluxe
Voici des documentations pour Arduino :
https://www.arduino.cc/en/Tutorial/CharacterAnalysis
https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/
Les liens suivant concernent la bibliothèque LUFA:
Introduction à LUFA:
https://www.engineersgarage.com/article/introduction-lufa
Résumé de la bibliothèque LUFA par M. REDON:
https://rex.plil.fr/Enseignement/Systeme/Systeme.IMA4/
Un projet IMA4 : Exemple dans laquelle une carte est reconnue en tant que souris à l'aide de LUFA
https://projets-ima.plil.fr/mediawiki/index.php/IMA4_2016/2017_ECP3
Enfin, les liens suivants permettent une meilleure compréhension du protocole USB.
Protocole USB par Bernard ACQUIER http://www.abcelectronique.com/acquier/usb.html
USB : classe HID (Human Interface Device): http://www.rennes.supelec.fr/ren/fi/elec/docs/usb/hid.html
III. Préparation du projet
3.1 Cahier des charges du groupe
Pour chacun des périphériques nous allons utiliser un ATMega16 (u2 ou u4) combiné à la bibliothèque LUFA.
3.2 Cahier des charges des équipes
Clavier
Création d'un clavier physique avec sa mémoire interne, son microcontrôleur, et son driver.
Ce clavier doit permettre :
- d'utiliser le clavier normalement.
- d'enregistrer les entrées au clavier.
- de disposer de différentes fonctions autour de l'enregistrement des entrées clavier, qui seront activées via une combinaison de touches :
- de récupérer les entrées clavier dans un document texte .
- de vider le stockage des entrées clavier.
- activer et désactiver le stockage des entrées clavier.
Clé USB
Création d'un périphérique du stockage USB doté d'un microcontrôleur.
Cette clé USB doit :
- pouvoir servir de stockage de masse
- en cas d'inactivité prolongée, changer son statut auprès de l'ordinateur en clavier afin de lancer l'installation d'un logiciel (espion)
3.3 Choix techniques : matériel et logiciel
- Objectif S6 : prototypes en Arduino.
- Objectif final : ATMega16 + bibliothèque LUFA
Clavier
Nous allons partir d'un clavier physique déjà existant. Mais nous n'excluons pas l'idée de créer notre propre clavier en cas de bonne avancée du projet.
Clé USB
Nous allons devoir créer cette clé de taille raisonnable, pour éviter d'éveiller des soupçons.
3.4 Liste des tâches à effectuer
- Côté réalisation des prototype
- Hardware : réaliser un hardware qui permette d'avoir un prototype fonctionnel.
- Software : réaliser du code qui permette de faire fonctionné comme il se doit le prototype.
- Côté documentation
- Maîtriser le protocole USB
- Maîtriser l'utilisation de l'ATMega 16 U2
3.5 Calendrier prévisionnel
- Protocole USB : Semestres 6 et 7
- Bibliothèque LUFA (compréhension et configuration) : Semestres 6 à 7
- Maquettes Arduino : Semestre 6
- Modélisation des PCB et des coques (clavier et clé) : Semestre 7
- Rédaction du code : Semestre 7 et 8
- Montage des périphériques : Semestres 7 et 8
- Implémentation : Semestre 8
IV. Réalisation du Projet
Projet S6
Eventuellement créer des sous-pages par équipe avec le compte-rendu des réunions de groupe sur cette page principale.
Semaine 4
- Nous remarquons que nos deux projets (clé, clavier) sont en fait assez semblables car tous deux devront se comporter comme un clavier, et tous deux disposeront d'un dispositif de stockage.
- Recherche des instructions pour le téléchargement et l'ouverture d'un fichier sous Windows.
- Recherche/récupération du logiciel espion Iwantsoft Free Keylogger. Il récupère entre autres les recherches faites sur un navigateur, prend des captures d'écran et des photos de l'utilisateur via la webcam (si accessible).
- Téléchargement de la librairie Keyboard.h et essais d'implantations. Cette librairie permet à la carte arduino de se faire passer pour un clavier et d'envoyer des informations à l'ordinateur comme un clavier. Pour effectuer nos premiers essais avec les cartes Arduino, elle est donc d'une importance capitale.
Semaine 5
- Pour implanter la librairie Keyboard.h, il suffit que l'interface Arduino IDE soit à jour.
- Premiers tests avec la-dite librairie.
- Recherches sur l'utilisation de la bibliothèque LUFA
Semaine 6
- Premier Accomplissement avec l'Arduino : on a réussi un KeyboardLogOut sur Windows 8.1.
- Nous poursuivons nos essais dans le but de faire télécharger et exécuter un fichier mp3.
- Suite des recherches sur LUFA, et recherches en parallèle sur le protocole USB
Le protocole USB (Universal Serial Bus) permet la communication de données entre un hôte et un à plusieurs appareils. Il supporte le plug'n play, c'est-à-dire le branchement quand l'hôte est en marche.
L'hôte, détectant l'appareil sur le bus, l'interrogera et chargera les pilotes nécessaires à son bon fonctionnement sans l'intervention de l'utilisateur.
Il existe plusieurs vitesses USB : basse (1,5 Mbits/s), pleine (12 Mbits/s) ou haute (480 Mbits/s).
Un port USB est constitué de quatre broches (voir la figure de droite). Deux d'entre elles sont réservées à l'alimentation électrique du périphérique(une broche 5V et une masse), dans la limite des 0,5 A.
Les deux autres véhiculent les signaux de données différentiels. La communication est bidirectionnelle mais ne peut avoir lieu simultanément dans les deux sens.
Semaine 7
- Création d'une fonction permettant une lecture plus aisée du code (void keyboardprint(string);). Après quelques tests nous remarquons des erreurs notamment sur les caractères '@', '#', '-', '"'. Ces erreurs étaient de 2 types :
- '"' et '-': le document Wordpad sur lequel on avait enregistré les commandes à utiliser dans le shell n'avait pas enregistré ces caractères comme des ASCII 7bits mais comme des utf8 stockés sur 2 octets (ou plus).
- '@' et '#': une incohérence entre les macros de la librairie keyboard.h et celles de l'interface clavier de l'ordinateur.
- Les transactions USB (flux de données) sont composées d'une suite de quatre types de paquets.
- Les paquets début de trame (SOF) indiquent le commencement d'une nouvelle trame.
- Les paquets Jetons (Token) définissent le type de transaction, l'adresse du périphérique et de destination et la terminaison désignée.
- Les paquets DATA optionnels constituent les données utiles.
- Les paquets d'état valident les transactions et fournissent des moyens de correction d'erreur.
- Les paquets début de trame (SOF) indiquent le commencement d'une nouvelle trame.
Les terminaisons (Endpoints en Anglais) sont les émetteurs ou les récepteurs de données. Elles sont situées en fin de chaîne de communication.
Chaque appareil possède une "terminaison zéro" recevant toutes les commandes et demandes d'état, pendant l'énumération et tant que l'appareil est actif.
Semaine 8
- Nous n'avons pas réussi grand chose cette semaine. Nous avons seulement appris que le caractère '\\' était introuvable. Nous ne savons pas encore si cela vient de l'ordinateur ou de la librairie Arduino Keyboard.
- Les descripteurs sont la définition de la communication avec l'appareil USB. Ils informent l'hôte de sa nature, qui l'a réalisé, la version USB supportée, le nombre de configurations et de terminaisons, ainsi que leur type. Il y a cinq types de descripteurs.
- Le descripteur d'appareil précise les identificateurs d'appareils pour charger les pilotes, le nombre de configurations que l'appareil peut avoir. Il n'y a qu'un unique descripteur d'appareil par périphérique USB.
- Les descripteurs de configurations
Ils indiquent l'alimentation et la consommation maximale de l'appareil et le nombre d'interfaces.
Comme différentes alimentations (alimentation de grande puissance, appareil auto-alimenté ou alimenté sur secteur) et modes de transfert sont envisageable, un appareil peut avoir plusieurs configurations.
Lors de l'énumération de l'appareil, l'hôte lit les descripteurs d'appareils et décide de la configuration à adopter. Une seule configuration est validée à la fois.
- Les descripteurs d'interfaces
Ils sont en quelque sorte le détail de chaque fonctionnalité de l'appareil, constituée de plusieurs terminaisons. Si un appareil fait casque audio et microphone, chacune de ces fonctionnalités aura son interface. Plusieurs interfaces peuvent être validées simultanément par l'hôte.
- Les descripteurs de terminaisons précisent les terminaison autres que la terminaison zéro.
- Les descripteurs de chaînes sont optionnels et offrent de l'information plus explicite pour l'homme.
Enfin, nous pouvons considérer un sixième descripteur, le "Report Descriptor", très spécifique à la classe HID (Human Interface Device) grâce auquel chaque périphérique USB peut définir son protocole de transfert.
Semaine 9
- Le problème du backslash est résolu, via alt+92.
- Un code Arduino a été créé, il utilise le Powershell de Windows afin de télécharger et d'ouvrir un fichier mp3. Le code a été par la suite testé sur un pc Windows 8.1 .Le code marche mais ne prend pas en compte la configuration du clavier (obligation de passer le clavier en mode anglais sur l'ordinateur).
- Il y a bien une solution pour connaître l'activité du PC (récupérer les données d'affichage via un VGA ou HDMI), malheureusement cette solution n'est pas compatible avec le fait que notre clé USB doit passer pour un clé USB classique et donc ne se connecter qu'à un port USB.
- Il existe quatre types de transferts pour le protocole USB.
- Les transferts de commande sont nécessaires à l'installation de l'appareil et sont aussi utilisés pour les opérations de commande et d'état.
- Les transferts d'interruptions ont lieu suite à une interruption en provenance de l'appareil. En revanche, celui-ci doit patienter que l'hôte l'interroge pour pouvoir s'exprimer.
- Les transferts isochrones sont continuels et périodiques et limitent le temps de latence pour la communication de données audio ou vidéo.
- Les transferts en bloc permettent un transfert de grandes quantités de données irrégulières.
Semaine 10
- Pour l’équipe du clavier:
Afin de prendre en main la bibliothèque LUFA, nous essayons de faire reconnaître l'Arduino UNO en tant que stockage de masse.
Pour satisfaire cet objectif, nous devons au niveau de la bibliothèque :
- nous appuyer sur un répertoire "Démo" de la classe MassStorage fournit dans celle-ci,
- modifier le Makefile en renseignant les caractéristiques de la carte et du microprocesseur, puis compiler le tout.
Ensuite, pour réinitialiser l'ATMega16u2, il faut relier les broches GND et RESET. Arduino sera alors vu comme "Atmel Corp" par l'OS (nous pourrons le vérifier à l'aide de la commande lsusb).
Il s'agira enfin de reprogrammer le microprocesseur avec dfu-programmer et vérifier après déconnexion et reconnexion de l'Arduino que cette dernière est considérée comme une classe stockage de masse (commande lsusb -v).
Nous nous lançons donc dans cette démarche.
Nous copions le dossier de démonstration depuis /Demos/Device/Classdriver/MasseStorage et paramétrons le Makefile.
Le microprocesseur ATMega16u2 est cadencé à 16 MHz et son architecture est AVR8. La carte est une Arduino UNO.
Un aperçu du Makefile est donné ci-dessous.
Après compilation nous obtenons de nombreuses erreurs de fichiers incorrects, fonctions implicites et de variables non définies dans le fichier Board/Dataflash.h
Note : l'origine de ces erreurs sera expliquée plus tard.
- Pour l'équipe clé USB :
- Après réflexion afin de pouvoir utiliser la clé en tant que HID (clavier) ou périphérique de stokage, la seule solution que nous ayons trouvé pour continuer à utiliser l’Arduino Leonardo est de faire un Switch physique. En effet, l'interface que propose l’Arduino ne correspond pas à nos besoins : nous souhaitons une ouverture "normale" d'un périphérique de stockage, et non l’utilisation de code Arduino pour la gestion de stockage.
Semaine 11
- Nous avons pu récupérer un adafruit MPR121 qui est un clavier capacitif dans l'objectif de réaliser une maquette du clavier espion.
Nous avons donc travaillé sur le code d'un programme permettant la récupération des touches activées sur celui-ci, via la liaison série.
Ce code sera réalisé en deux étapes :
- tout d'abord, avec l'utilisation d'une Arduino UNO afin de voir si nous pouvons détecter les touches et les afficher;
- puis avec une Arduino LEONARDO pour stocker la valeur de ces touches et les envoyer via des instructions.
Nous effectuons ce changement de carte car la UNO ne supporte pas la librairie Keyboard utilisée jusqu'à présent et n'est pas non plus compatible avec une carte SD.
Cette semaine, la première étape a été accomplie.
Semaine 12
- Réalisation de la deuxième partie du programme.
Elle consiste en l'enregistrement des touches activées dans un fichier texte à placer dans la carte SD.
Il faut de plus coder l'envoi des instructions pour l'envoi de ces caractères à l'ordinateur (via la touche 'R') ainsi que l'instruction pour vider le fichier (via la touche 'D').
- Pourquoi les précédents essais de la compilation de LUFA n'ont-il pas abouti ?.
Si des fichiers étaient manquants à la compilation, c'était parce que la carte Arduino UNO ne dispose d'aucun dispositif de stockage de masse.
Par exemple, la carte AT90USBKEY2 d'Atmel, aussi compatible avec LUFA, possède cette fonctionnalité.
Le dossier de démonstration à l'adresse /Demos/Device/ClassDriver/MassStorage est bien paramétré pour une compilation sans erreur.
On branche la carte et exécutons la commande lsusb. Elle est d'abord reconnue comme "Atmel Corp. at90usbkey sample firmware (composite device)".
On réinitialise le microprocesseur en suivant cette démarche: on maintient les boutons RST et HWB, puis on relâche RST et HWB dans cet ordre-ci.
Nous effaçons le programme de l'AT90USB1287,
sudo dfu-programmer at90usb1287 erase
on le reprogramme.
sudo dfu-programmer at90usb1287 flash MassStorage.hex
et on exécute un reset.
sudo dfu-programmer at90usb1287 reset
Nous pouvons observer ci-dessous que la carte est considérée comme stockage de masse (commande lsusb -v).
Documents Rendus
Voici un lien vers le git de notre projet.
Vous y trouverez notamment les codes des maquettes.
Il est possible de visualiser le rapport ici : Media:Rapport IMA3.2021 P12.pdf
Remarques de l'oral
Les remarques qui nous ont été faites sont dans un premier temps sur la forme.
Le diaporama manquait de visibilité à cause du fond non uni. Le logo central perturbait la lisibilité.
Le code affiché devrait être plus gros mais il serait préférable d'en afficher que le strict minimum sur les diapositives.
Pendant la présentation, réduire les détails sur le protocole USB (et autres aspects très techniques) aurait permis moins de monotonie.
Au niveau technique:
A la question de l'utilité de ces périphériques, nous pourrions ajouter l'acquisition de connaissances et de compétences en lien avec le protocole USB à l'aspect du contrôle parental.
Il aurait été intéressant de rentrer plus en détail sur l'état de l'art et les technologies employées par les concurrents.
Pour la rentrée prochaine, nous devrions préciser le cahier des charges afin d'acquérir une vision plus claire des objectifs, notamment sur le choix du clavier à utiliser.
Projet S7
Objectifs de cette année :
Clé USB
réalisation d'un PCB avec l'atméga16u2 pour la gestion de l'USB.
- réaliser le PCB pour intégrer une mémoire raisonnable en termes de volume de stockage afin de passer inaperçu (au moins 1Go). Tout cela sans oublier les fonctions spéciales (téléchargement d'un logiciel + installation + utilisation).
Clavier
Nous avons pensé à :
- récupérer un clavier existant et faire un keygrabber (PCB avec l'atmega en série/parallèle sur le bus reliant le clavier à l'ordinateur).
Pb parallèle : C'est un cas avec un maître et plusieurs esclaves, qui n'est pas possible pour le protocole USB.
Pb série : il faudra gérer un permutateur commandé par notre microprocesseur, car l'ATMEGA 16u2 ne possède qu'un port USB. Par conséquent les requêtes de l'ordinateur seront récupérées et retransmise par l'ATMEGA en respectant les délais de parole imposés par le protocole.
- récupérer un clavier et mettre notre ATMEGA à la place du micro-processeur du clavier.
Pb : existe-t-il un mappage universel ?
- monter un clavier de toutes pièces.
Pb : demande beaucoup plus de temps que les autres solutions.
Nous avons choisi la deuxième option car la première semble très difficile à mettre en œuvre. La troisième a une composante mécanique plus marquée.