Rapport de Projet ¬IMA3 S6 du groupe P12 
Titre : Fabrication d’appareille USB spécialisé dans espionnage 
Introduction :
Le but de notre projet est la création de périphériques USB (clavier et clef USB) incorporant des fonctionnalités propres (installation de logiciel d’espionnage, keygraber). Ces périphériques seront contrôlés par un atmega16u2.
La durée de notre projet étant de deux ans nous avons décidé, durant la première année, de nous focaliser sur la partie software :
-l’étude théorique (comment utiliser des bibliothèques, comment les modifier)
-La création de maquette sur arduino, afin de voir la réalisabilité de notre projet, les problèmes rencontrés, et aussi d’avoir à notre disposition les algorithmes qui seront utilisé à la fin de notre projet .
Ainsi durant la 2ème année nous pourrons nous focaliser sur le hardware, ce qui comprend la création des PCB pour la clef et le clavier. Et aussi leur « coque de protection »

Partie théorique :

Partie maquette :
Dans la partie conception des maquettes nous avons travaillé avec une carte Arduino Leonardo.
Nous avons fait ce choix pour plusieurs raisons :
-l’Arduino UNO ne prend pas en charge la bibliothèque Keyboard qui nous sert à l’émulation du clavier sous l’environnement Arduino.
- Le module micro SD (utilisé pour les deux maquettes) était un module pour Leonardo. 
-Le Leonardo utilise un ATmega32U2 comme contrôleur USB, mais heureusement l’ATmega32U2 et l’ATmega16u2 sont quasiment les même (seul la taille de la mémoire diffère), donc le code pour l’ATmega32u2 sera compatible avec le 16u2.
Partie 1 : La librairie Keyboard
 Comme dit précédemment la librairie Keyboard sert à l’émulation d’un clavier sous l’environnement Arduino . Cette partie est importante car utilisé pour les deux périphériques l’un car étant un clavier, et l’autre car l’installation du logiciel espion nécessitera des commandes à taper dans le shell de Windows. 
Dans un premier temps nous avons téléchargé et installé le logiciel Arduino qui sert à programmer l’arduino Léonardo. Par la suite nous y avons implanté la dernière version de la librairie Keyboard.
Pour écrire notre programme, nous avons utilisé comme squelette de base le code d’exemple de l’utilisation de la librairie Keyboard fourni avec le logiciel.
L’utilisation de la bibliothèque est plutôt simple, il suffit de lancer Keyboard.begin(). Alors l’arduino est reconnue comme un clavier. Par la suite pour rentrer des touches il faut utiliser la commande Keyboard.write() <appuie et relache> une touche ou Keyboard.press() <appuie et maintient appuyée> une touche. Le problème que ces fonctions ne prennent en paramètres qu'un unique caractère. Pour améliorer la lisibilité du code et la facilité de déboggage, nous avons créer la fonction keyboardprint(String) qui permet d'écrire toute la chaîne de caractères passer en paramètre.

Les problèmes que nous avons rencontrés lors de la création de ce programme se situent au niveau de l’envoi de certaines touches bien spécifique (exemple : @ , \, #) qui ont du étre prit en compte différemment des autres touches . Nous ne sommes pas certains de la source de ces erreurs, mais il se pourrait qu'elles soient dues à une différence de définition du clavier Qwerty de la bibliothèque Arduino Keyboard et de celle utilisée par l'ordinateur.

Partie 2 : Code sous Windows pour la clé
Notre clef USB devra injecter des codes sous Windows afin de télécharger et d’installer le logiciel espion. Dans cette partie nous verrons le code utilisé.
Windows possède 2 Shell diffèrent : -CMD et –PowerShell 
Théoriquement les 2 nous permettrais de télécharger et de lancer un logiciel. Mais les essaies sous CMD n’ont pas porté leurs fruits.
Donc nous allons utiliser PowerShell pour télécharger et installer notre logiciel espion.

/*à mettre en annexe
Code :
Ouvrir power Shell en admin :
Windows
Powershell
Entré + shift + entré
<-
Entré
Télécharger un logiciel :
Invoke-WebRequest –Uri «adresse du fichier» –OutFile «adresse destination + nom et type fichier» 
«https://www.mediacollege.com/audio/tone/files/440Hz_44100Hz_16bit_30sec.mp3» -OutFile «./mp3.mp3»
Lancer un .exe :
"C:\Program Files\qBittorrent\qbittorrent.exe" exemple avec qbittorent
*/

Partie 3 : Gestion SD
La carte SD sous Arduino est gérée via la bibliothèque SD, qui inclut la bibliothèque File. La première permet de se déplacer dans le système de fichiers et d'ouvrir des fichiers dans lesquels on pourra lire et écrire.
Les 2 périphériques utiliserons une carte SD (le clavier afin de stocker les touhes pressé et la clef comme stockage des instructions).

La gestion de la carte SD sous arduino n’est pas la meme que sous les environment linux ou windows .Je sous-entend que la manipulation des fichiers sur la carte SD se fait nécessairement à l’aide  de code .

Partie 4 : maquette du clavier :
Pour rappel le clavier devrat se comporté comme un clavier ‘normal’ avec la focntion suplémentaire  d’enregister les imput sur la clef sd et de pouvoir suprimer les imput enregisté ou de les renvoyer sur le pc . 
la maquette du clavier sera réalisé comme dit precedemment sur un arduinio Leonardo.Pour simplifier nous utiliserons au lieu d’un clavier ‘total’  , un clavier numérique comportent 12 entrées (0 à 9 et R (return) et D (delete)).R aura pour fonction de réinjécter les input enregisté et D suprimera les input enregisté .Le composant qui remplie la fonction de  clavier est le shield pour arduino MPR121 Cap. Touche .les touche de ce clavier sont activée par une diférence de capacité au bornes de la touche . Ce qui permet l’utilisation comme touche de quasiment n’importe quelle objet (ce qui ne nous sera pas vraiment utile ici).


La maquette du clavier est parfaitement foncionnelle , voici en quelque ligne sont principe de fonctionnement :

void setup (): initialisation : SD , Keyboard , Adafruit
void loop (): scrutation des touches et enregistrement de celles-ci sur la carte SD, et gestion des touches spéciales R et D

Pour le projet finale la structure du programme restera la meme seul le nombre d’input possible augmente .

Partie 5 : Maquette clef :
Pour rappel la clef Usb devrat : envoyer une serie d’instruction préenregistré sous forme d’input clavier et aussi servir d’adapteteur micro SD.
Le probléme rencontré dans cette partie se situe sur la partie adaptateur micro SD .Car nous souhaitons que la prise en charge de la micro SD se fasse pa le systéme d’exploitation du pc on non celui de l’arduino . Il est possible de faire reconaitre l’arduino par le pc comme un perophérique de stockage mais alors il est impossible de le faire reconaitre comme un clavier .
Donc nous avons crée la maquette qui  remplie la fonction de clavier , notre maquette entre les imput préenregisté (ce qui lui fait telechargé et lancer une music sous windows .
Princpe de fonction :
void setup ()  : initialisation du keyboard et de la SD
void loop ()  : envoie des inputs 
Nous avons pensé pour pouvoir faire ce que nous souhaitons , utiliser un switch qui switchera entre 2 contoleur USB différent un qui gerera le clavier et l’autre le stockage de masse .Le switch entre les 2 controleurs se fera sur l’envoie des packet de mise en veille de l’ordinateur .


