Un poisson fantôme

Publié par cpb
Avr 01 2017

Ghost in the keyboard

En ce 1er avril, je vous propose un mini hack amusant, qui peut être mis à profit pour piéger des collègues en open space ou en salle de TP par exemple.

Il s’agit d’émuler un clavier USB, et de lui faire écrire des phrases préprogrammées pour simuler un interlocuteur fantôme cherchant à communiquer avec nous.

J’ai utilisé une petite carte Teensy LC que l’on programme facilement avec l’IDE de l’Arduino. Elle est connectée par une rallonge USB sur le PC de notre cible (en plus du clavier original), de préférence en face arrière, et j’ai ajouté sur la carte un micro interrupteur afin de séquencer l’envoi des phrases (le bouton présent d’origine est uniquement un Reset non utilisable pour cela).

Teensy LC

Le bouton est branché entre la masse et la GPIO 13 qui est initialisée avec un pullup pour être à 1 par défaut.

Teensy Lc & button

Il y a de nombreux exemples livrés avec la carte Teensy. Je me suis inspiré de ceux d’émulation de clavier USB (que j’ai traité également dans cet article). Le code programmé dans la carte est le suivant :

ghost-keyboard.ino:
/// ------------------------------------------------------------------------------------------
/// \file ghost-keyboard
///
/// \author 2017 Christophe BLAESS 
///
/// \license GPL
/// ------------------------------------------------------------------------------------------

/// \note Remember to Select "Keyboard" in "Tools-> USB Type" menu.

const char * string[] {
    "Helli\bo\n",
    "are you ht\b\bthere?\n",
    "Is there anyone?\n",
    "Hel me\b\b\bp me!\n",
    "Please\n",
    "I'm trapped into this computer!\n",
    NULL
};

int string_counter = 0;

#define BUTTON_PIN 13

void setup()
{
  // Initialize input button with pullup resistor.
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  digitalWrite(BUTTON_PIN, HIGH);
  // Initialize USB keyboard.
  Keyboard.begin();
}



// \brief This function print the string letter-by-letter with backspace handling.
// 
void print_string(const char * string)
{
  int i;
  char printed_string[2];
  
  printed_string[1] = '\0';

  for (i = 0; string[i] != '\0'; i++) {
    printed_string[0] = string[i];
    
    if (printed_string[0] == '\b') {
      // Replace \b sequences by simulated press on Backspace key.
      Keyboard.press(KEY_BACKSPACE);
      Keyboard.release(KEY_BACKSPACE);
    } else if (printed_string[0] == '\n') {
      // Replace \n sequences by simulated press on Enter.
      Keyboard.press(KEY_ENTER);
      Keyboard.release(KEY_ENTER);
    } else {
      Keyboard.print(printed_string);
    }
    // Humanize with a small random delay.
    delay(50 + rand()%200);
  }
}


void loop()
{
  // Wait for a button press.
  while(digitalRead(BUTTON_PIN) == HIGH)
    ;
  while(digitalRead(BUTTON_PIN) == LOW)
    ;
  // Display the next string.
  print_string(string[string_counter]);
  string_counter ++;
  
  if (string[string_counter] == NULL)
    string_counter = 0;
}

Quelques points peuvent être notés à propos de ce programme :

  • Les séquences de caractères '\b' et '\n' sont interprétées correctement en simulant respectivement un appui sur les touches Backspace et Enter. La première est intéressante pour humaniser la saisie, en simulant des fautes de frappes que l’on vient corriger. On pourrait aller plus loin en simulant des déplacements de curseur (comme les touches fléchées) par exemple
  • Le délai aléatoire entre les touches ajoute au réalisme de la saisie en évitant un côté trop mécanique
  • Une fois la liste de phrases entièrement affichée, j’ai choisi de reboucler en revenant à la première. On pourrait préférer s’arrêter définitivement (jusqu’au Reset de la carte Teensy).

Bien sûr la liste de phrases peut être allongée sensiblement, en simulant un personnage implorant, puis coléreux, agressif, etc.

Cliquez sur l’image ci-dessous pour voir un exemple d’exécution sur un ordinateur sous Windows (notez que ce dernier affiche un message lors de la découverte du nouveau « clavier » USB, ce qui peut gâcher l’effet de surprise). Rien n’est saisi au clavier, je presse simplement le bouton de la Teensy de temps à autre pour passer à la phrase suivante.

Enfin, il y a une piste que je n’ai pas explorée mais que mon fils m’a suggérée : prendre en charge la touche Windows pour déclencher des actions sur le système (lancement d’applications, recherches dans l’historique, etc.) ce qui peut d’ailleurs conduire à des plaisanteries de fort mauvais goût.

 

Bon 1er Avril à tous !

4 Réponses

  1. Cyril dit :

    Bonjour,
    Merci pour cet article.
    Pensez-vous que ce mini hack peut être fait avec un raspberry pi zero ?
    Si oui, serait-il intéressant d’utiliser le vecteur de communication wifi/bluetooth afin de séquencer/automatiser l’envoi des phrases ?

  2. Pierre dit :

    C’est plutôt marrant comme truc 🙂

    Le plus compliqué pour réussir la blague est que ça se déclenche au bon moment !

URL de trackback pour cette page