Prank ahead! Zufällige Tastatureingaben in zufälligen Abständen simulieren, um die Kollegen oder den unliebsamen Schwiegervater so richtig zu nerven! Heute soll es um ein kleines selbstgebautes Bad USB-Stick Projekt gehen, bei dem wir zufällige Tastatureingaben in möglichst zufälligen Zeitabständen durchführen. Das Ganze bedarf keiner Installation und könnte euer Opfer so richtig zur Weißglut bringen :D.
Warum? - Weil unser Projekt zufällig Tasten auf der Tastatur drückt und niemand wissen wird wo die herkommen. Zusehen und Spaß haben!
Vor fast genau drei Monaten habe ich einen Artikel zu einem Bad USB-Stick verfasst, um mittels einem Digispark in wenigen Sekunden ein neues Bildschirmhintergrundbild per simulierten Tastatureingaben herunterzuladen und zu installieren. Das ganze Projekt sollte ein wenig für die Gefahr durch und Problematik hinter Bad USB-Sticks sensibleren. Dieses mal wollen wir noch einmal einen drauf legen und das Opfer langfristig zur Weißglut bringen. Ich möchte vorher jedoch noch einmal darauf hinweisen, dass dieser Witz unter Umständen strafbar sein könnte. Das bedeutet: Nur mit Bedacht durchführen.
Was benötigen wir?
Wir benötigen einen Digispark V3 oder einen anderen Microcontroller, welcher Tastatureingaben simulieren kann. Beispielsweise eignet sich der Arduino Micro dazu.
Zusätzlich benötigen wir die Arduino IDE und einen freien USB-Slot am PC. Erfahrungsgemäß eignet sich dazu ein direkter USB-Slot am Besten, da mein USB-Hub hier leider schlapp gemacht hat. Zum Stand dieses Artikels reichen also ~2€ Materialeinsatz (im 5er-Pack) und etwa 30min der eigenen Zeit aus. Ehrlich gesagt verdammt erschreckend :(
Die Vorbereitungen
Nach dem Kauf und der Lieferung der Microcontroller müssen wir die Arudino IDE mit mindestens der Version 1.6.6 und die DigiSpark (entfällt beim Arduino Micro) Windows Treiber installieren. Einen Download findet ihr hier und hier.
Da ich das Konvolut an Anleitung bereits in einem anderen Artikel abgearbeitet hatte werde ich das hier nur stiefmütterlich behandeln. Wer auf Fotos steht und längere Erklärungen verlangt, dem lege ich den vorangegangenen Artikel ans Herz: Guckst du hier
Eine detailierte Installationsanleitung erhaltet ihr hier: http://digistump.com/wiki/digispark/tutorials/connecting
Nach der Installation müssen wir der Arduino IDE "beibringen" mit dem DigiSpark kommunizieren zu können. Hierfür klicken wir auf: Datei -> Voreinstellungen und fügen folgendes unter dem Punkt "Zusätzliche Boardverwalter-URLs:" hinzu:
http://digistump.com/package_digistump_index.json
Anschließend klicken wir im Menü auf: Werkzeuge -> "Board: XXX" -> Boardverwalter und suchen dort nach "Digistump AVR". Das Suchergebnis müssen wir installieren.
Nach der Installation können wir unser Board auswählen: Werkzeuge -> "Board: XXX" -> Digistump AVR Boards -> DigiStump (Default - 16.5 MHz)
Bevor wir nun mit der Programmierung beginnen können ist noch die zusätzliche Installation einer Library nötig, die unseren DigiSpark in Zukunft als Tastatur ausgibt und Tastatureingaben an den angeschlossenen Rechner weitergibt. Hierzu müssen wir zwei Dinge tun. Erstens muss die eigentliche Library heruntergeladen werden. Im Anschluss ist ein deutsches Tastaturlayout zu programmieren.
Zur Installation klicken wir auf Werkzeuge -> "Bibliotheken verwalten..." und geben dann in die Suche DigisparkKeyboard ein. Installiert werden muss "DigiKeyboardFr".
Ist dies erledigt müssen wir in den selben Ordner in dem auch euer Arduino Projekt (sketchXXX.ino) liegt eine Datei ablegen die das Mapping auf das deutsche Tastaturlayout übernimmt. Diese nennen wir "DigiKeyboardDe.h" und besitzt den Inhalt:
#include "DigiKeyboard.h"
#ifndef DIGIKEYBOARDDE_H
#define DIGIKEYBOARDDE_H
#define DE_MOD_CONTROL_LEFT (1<<8)
#define DE_MOD_SHIFT_LEFT (1<<9)
#define DE_MOD_ALT_LEFT (1<<10)
#define DE_MOD_GUI_LEFT (1<<11)
#define DE_MOD_CONTROL_RIGHT (1<<12)
#define DE_MOD_SHIFT_RIGHT (1<<13)
#define DE_MOD_ALT_RIGHT (1<<14)
#define DE_MOD_GUI_RIGHT (1<<15)
const uint16_t _ascii_de_map[128] PROGMEM =
{
0x00, // NUL
0x00, // SOH
0x00, // STX
0x00, // ETX
0x00, // EOT
0x00, // ENQ
0x00, // ACK
0x00, // BEL
0x2a, // BS Backspace
0x2b, // TAB Tab
0x28, // LF Enter
0x00, // VT
0x00, // FF
0x00, // CR
0x00, // SO
0x00, // SI
0x00, // DEL
0x00, // DC1
0x00, // DC2
0x00, // DC3
0x00, // DC4
0x00, // NAK
0x00, // SYN
0x00, // ETB
0x00, // CAN
0x00, // EM
0x00, // SUB
0x00, // ESC
0x00, // FS
0x00, // GS
0x00, // RS
0x00, // US
0x2c, // ' '
0x1e|DE_MOD_SHIFT_LEFT, // !
0x1F|DE_MOD_SHIFT_LEFT, // "
0x38, // #
0x21|DE_MOD_SHIFT_LEFT, // $
0x22|DE_MOD_SHIFT_LEFT, // %
0x23|DE_MOD_SHIFT_LEFT, // &
0x32|DE_MOD_SHIFT_LEFT, // '
0x25|DE_MOD_SHIFT_LEFT, // (
0x26|DE_MOD_SHIFT_LEFT, // )
0x30|DE_MOD_SHIFT_LEFT, // *
0x30, // +
0x36, // ,
0x38, // -
0x37, // .
0x24|DE_MOD_SHIFT_LEFT, // /
0x27, // 0
0x1e, // 1
0x1f, // 2
0x20, // 3
0x21, // 4
0x22, // 5
0x23, // 6
0x24, // 7
0x25, // 8
0x26, // 9
0x37|DE_MOD_SHIFT_LEFT, // :
0x36|DE_MOD_SHIFT_LEFT, // ;
0x64, // <
0x27|DE_MOD_SHIFT_LEFT, // =
0x64|DE_MOD_SHIFT_LEFT, // >
0x2D|DE_MOD_SHIFT_LEFT, // ?
0x14|DE_MOD_ALT_RIGHT, // @ 0x40 0x14
0x04|DE_MOD_SHIFT_LEFT, // A
0x05|DE_MOD_SHIFT_LEFT, // B
0x06|DE_MOD_SHIFT_LEFT, // C
0x07|DE_MOD_SHIFT_LEFT, // D
0x08|DE_MOD_SHIFT_LEFT, // E
0x09|DE_MOD_SHIFT_LEFT, // F
0x0a|DE_MOD_SHIFT_LEFT, // G
0x0b|DE_MOD_SHIFT_LEFT, // H
0x0c|DE_MOD_SHIFT_LEFT, // I
0x0d|DE_MOD_SHIFT_LEFT, // J
0x0e|DE_MOD_SHIFT_LEFT, // K
0x0f|DE_MOD_SHIFT_LEFT, // L
0x10|DE_MOD_SHIFT_LEFT, // M
0x11|DE_MOD_SHIFT_LEFT, // N
0x12|DE_MOD_SHIFT_LEFT, // O
0x13|DE_MOD_SHIFT_LEFT, // P
0x14|DE_MOD_SHIFT_LEFT, // Q
0x15|DE_MOD_SHIFT_LEFT, // R
0x16|DE_MOD_SHIFT_LEFT, // S
0x17|DE_MOD_SHIFT_LEFT, // T
0x18|DE_MOD_SHIFT_LEFT, // U
0x19|DE_MOD_SHIFT_LEFT, // V
0x1a|DE_MOD_SHIFT_LEFT, // W
0x1b|DE_MOD_SHIFT_LEFT, // X
0x1d|DE_MOD_SHIFT_LEFT, // Y
0x1c|DE_MOD_SHIFT_LEFT, // Z
0x25|DE_MOD_ALT_RIGHT, // [
0x2d|DE_MOD_ALT_RIGHT, // bslash
0x26|DE_MOD_ALT_RIGHT, // ]
0x35, // ^
0x38|DE_MOD_SHIFT_LEFT, // _
0x2E|DE_MOD_SHIFT_LEFT, // `
0x04, // a
0x05, // b
0x06, // c
0x07, // d
0x08, // e
0x09, // f
0x0a, // g
0x0b, // h
0x0c, // i
0x0d, // j
0x0e, // k
0x0f, // l
0x10, // m
0x11, // n
0x12, // o
0x13, // p
0x14, // q
0x15, // r
0x16, // s
0x17, // t
0x18, // u
0x19, // v
0x1a, // w
0x1b, // x
0x1d, // y
0x1c, // z
0x24|DE_MOD_ALT_RIGHT, // {
0x64|DE_MOD_ALT_RIGHT, // |
0x27|DE_MOD_ALT_RIGHT, // }
0x30|DE_MOD_ALT_RIGHT, // ~
0 // DEL
};
class DigiKeyboardDeviceDe : public DigiKeyboardDevice{
public:
size_t write(uint8_t chr) {
unsigned int temp = pgm_read_word_near(_ascii_de_map + chr);
unsigned char low = temp & 0xFF;
unsigned char high = (temp >> 8) & 0xFF;
sendKeyStroke(low,high);
return 1;
}
void sendKeyReport(uchar *array,const unsigned int size){
while (!usbInterruptIsReady()) {
// Note: We wait until we can send keyPress
// so we know the previous keyPress was
// sent.
usbPoll();
_delay_ms(5);
}
usbSetInterrupt(array, size);
}
};
DigiKeyboardDeviceDe DigiKeyboardDe = DigiKeyboardDeviceDe();
#endif //DIGIKEYBOARDDE_H
Nun können wir dann aber wirklich mal mit der eigentlichen Programmierung unseres "kleinen" Scherzes beginnen.
Unsere Programmierung
Steckt den Microcontroller nun, wenn noch nicht geschehen, in den PC ein und fügt folgenden Code in die Arduino IDE ein:
#include "DigiKeyboardDe.h"
char message[37] = "0123456789abcdefghijklmnopqrstuvwxyz";
void setup() {
DigiKeyboardDe.delay(10000);
}
void loop() {
int wait = random(5, 60) * 1000; // Wähle eine Zahlt zwischen 5000 und 60000 Millisekunden
DigiKeyboardDe.delay(wait);// Warte die gewählte Zeit in Sekunden
int randomKey = random(0, 35); // Zufälle Stelle aus den möglichen Tastatureingaben
DigiKeyboardDe.print(message[randomKey]); // Schreibe den zufälligen Buchstaben auf dem PC
}
Und das wars dann auch schon. Klingt nach nicht viel, aber es reicht tatsächlich aus.
Was machen wir nun also mit diesem Stick, nachdem wir auf "Upload/Hochladen" geklickt haben und der Code auf dem Digispark angekommen ist? Ich würde behaupten wir schließen ihn an einen PC an und warten, bis die andere Person zur Weißglut getrieben wurde.
Ich wünsche viel Spaß und eine beschauliche Weihnachtszeit.