Инструмент хакера на Ардуино.

bifurkas
Offline
Зарегистрирован: 27.10.2013

Возникла такая задача. На старом ЧПУ станке села батарейка и компьютер иероглифами вежливо попросил обратиться за паролем в сервисный центр. Сервисный центр в Китае. Был. Цифровой пароль содержит максимум 8 символов и ограничений на не правильный ввод нет. Вот и возникла мысль последовательно перебрать все пароли, с использованием Ардуино. Аппаратно я всё быстро состряпал - подключил параллельно цифровым кнопкам ЧПУ клавиатуры 0-9 порты ардуино от 0 до 9 и кнопку "Ввод" на 10. А с написанием скетча застрял. Редко я программирую.

Задача перебрать все цифры от 0 до 99999999 и передать их на клавиатуру моего ЧПУ станка. Т.е. например пароль 45: на порт 4 ардуино единица-задержка-ноль-задержка, на порт 5 единица-задержка-ноль-задержка, на порт 10 ("Ввод")единица-задержка-ноль-задержка. И так все возможные варианты от 0 до 99999999. Никак не соображу как это сделать, помогите неучу, плиз!

b707
Онлайн
Зарегистрирован: 26.05.2017

вы сначала придумайте, как ардуина определит, что пароль подошел? Без этого такой перебор не имеет ни малейшего смысла

bifurkas
Offline
Зарегистрирован: 27.10.2013

Фишка в том, что мне знать пароль не нужно. Как только будет введён правильный, станок ЧПУ загрузится и не будет его больше запрашивать. По крайней мере до тех пор, пока в нём опять не сядет батарейка.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Фишка в другом. Надо паралельно кнопкам поставить контакты реле. И пусть реле имитирует нажатие кнопок.

ПС: Похоже цифровой автомат это для вас за гранью.

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

Это может занять до 4 месяцев, а то и больше. Сами посчитайте.

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

Вы бы сразу шли в платный раздел и заказывали за деньги. Здесь Вам вряд ли обломится. Возможно, конечно, но вероятность минимальна.

SLKH
Offline
Зарегистрирован: 17.08.2015

если нажимать "ввод" 2 раза в секунду (полагаю, станку надо давать время на осмысление), то не пройдет и двух лет, как пароль подберется. 

SLKH
Offline
Зарегистрирован: 17.08.2015

qwone пишет:

Фишка в другом. Надо паралельно кнопкам поставить контакты реле. И пусть реле имитирует нажатие кнопок.

и через сколько суток реле начнут дохнуть?

b707
Онлайн
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Это может занять до 4 месяцев, а то и больше. Сами посчитайте.

Оптимистичная оценка :) -это порядка 200 нажатий в секунду... китайский станок, небось, не мониторит кнопки с такой частотой :)

bifurkas
Offline
Зарегистрирован: 27.10.2013

Беда не в том, что мне сейчас тут долго будут объяснять, какой я тупой. Я это и так знаю. Беда в том, что в платном разделе с меня сначала возьмут денег, а потом будут объяснять, какой я тупой и в итоге я не получу что мне нужно. Просто был опыт.

Вариант ждать 4 месяца лучше, чем менять ЧПУ. К тому-же задача несколько проще, пароль скорее всего восьмизначный от 10000000 до 99999999.

SLKH
Offline
Зарегистрирован: 17.08.2015

qwone пишет:

ПС: Похоже цифровой автомат это для вас за гранью.

да какой там ещё автомат?  один цикл while - вся программа.

bifurkas
Offline
Зарегистрирован: 27.10.2013

Я не знаю. Только пробовать.

sadman41
Offline
Зарегистрирован: 19.10.2016

А от того, что кто-то вам на пальцах обьяснит алгоритм - будет лучше? Сразу напишете программу?

b707
Онлайн
Зарегистрирован: 26.05.2017

bifurkas пишет:

Беда не в том, что мне сейчас тут долго будут объяснять, какой я тупой. Я это и так знаю. Беда в том, что в платном разделе с меня сначала возьмут денег, а потом будут объяснять, какой я тупой и в итоге я не получу что мне нужно. Просто был опыт.

значит плохо обьясняли или более того - сами не знали, что хотите. Таких заказчиков каждый второй...

Те, кто приходит с четким ТЗ или хотя наброском - обычно получают результат или хотя бы обьяснение, почему это невозможно.

 

SLKH
Offline
Зарегистрирован: 17.08.2015

b707 пишет:

bifurkas пишет:

Беда не в том, что мне сейчас тут долго будут объяснять, какой я тупой. Я это и так знаю. Беда в том, что в платном разделе с меня сначала возьмут денег, а потом будут объяснять, какой я тупой и в итоге я не получу что мне нужно. Просто был опыт.

значит плохо обьясняли или более того - сами не знали, что хотите. Таких заказчиков каждый второй...

Те, кто приходит с четким ТЗ или хотя наброском - обычно получают результат или хотя бы обьяснение, почему это невозможно.

 

Да вроде бы задачка достаточно ясно изложена.

Если ТС на своей стороне решит проблему электрического сопряжения пинов с кнопками и примет решение о длительносях сигналов/пауз - запрограммировать дрыганье ногами несложно.

Да, ещё про бесперебойник не забыть бы.

bifurkas
Offline
Зарегистрирован: 27.10.2013

SLKH пишет:

Если ТС на своей стороне решит проблему электрического сопряжения пинов с кнопками и примет решение о длительносях сигналов/пауз - запрограммировать дрыганье ногами несложно.

Да, ещё про бесперебойник не забыть бы.

Определить время обработки пароля моим ЧПУ мне не сложно.Завтра по-экспериментирую.

Да, и проблемы сопряжения нет, с ардуино я пробовал ввести пароль, получилось.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

SLKH пишет:
да какой там ещё автомат?  один цикл while - вся программа.

Это по вашему рабочая программа

void setup() {
  while ( /*пока пароль не подошел*/ )
  {
  }
}
void loop() {
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

А кто скажет, что она нерабочая?

SLKH
Offline
Зарегистрирован: 17.08.2015

qwone пишет:

SLKH пишет:
да какой там ещё автомат?  один цикл while - вся программа.

Это по вашему рабочая программа

void setup() {
  while ( /*пока пароль не подошел*/ )
  {
  }
}
void loop() {
}

 

добавить в начало объявление passw=0 и в цикл дерганье ногами и passw++, будет почти совсем рабочая.

с какого перепоя там автоматы с классами разводить?

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

гомеопатическая программа.Никакой химии. Запустил , положил рядом и ждешь 4 месяца.

SLKH
Offline
Зарегистрирован: 17.08.2015

bifurkas пишет:

SLKH пишет:

Если ТС на своей стороне решит проблему электрического сопряжения пинов с кнопками и примет решение о длительносях сигналов/пауз - запрограммировать дрыганье ногами несложно.

Да, ещё про бесперебойник не забыть бы.

Определить время обработки пароля моим ЧПУ мне не сложно.Завтра по-экспериментирую.

Да, и проблемы сопряжения нет, с ардуино я пробовал ввести пароль, получилось.

придумай еще сигнал со станка на ардуину - чтобы она знала, что станок с питанием и можно в него цифры тыкать. 

SLKH
Offline
Зарегистрирован: 17.08.2015

qwone пишет:

гомеопатическая программа.Никакой химии. Запустил , положил рядом и ждешь 4 месяца.

или дольше.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

SLKH пишет:
добавить в начало объявление passw=0 и в цикл дерганье ногами и passw++, будет почти совсем рабочая.

с какого перепоя там автоматы с классами разводить?

unsigned long passw=0;
void setup() {
  while ( /*пока пароль не подошел*/ )
  {
    /*цикл дерганье ногами*/
    passw++;
  }
}
void loop() {
}

Супер-гомеопатическая программа.

sadman41
Offline
Зарегистрирован: 19.10.2016

Главное - чтобы миллис не успел переполниться до конца подбора кода, а то хана вашей лямбда-гомеопатии.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

b707 пишет:

вы сначала придумайте, как ардуина определит, что пароль подошел? Без этого такой перебор не имеет ни малейшего смысла

Обычно фотодатчик к экрану клеют скотчем :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Это может занять до 4 месяцев, а то и больше. Сами посчитайте.

есть видео и скетч для подбора сервисного пароля на мак, за пару дней одолевал...
думаю не методом прямого перебора...
вскрывал я один станок,  (точнее 6 станков) прямой записью в ОЗУ

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014
#define PIN_0 3
#define PIN_1 4
#define PIN_2 5
#define PIN_3 6
#define PIN_4 7
#define PIN_5 8
#define PIN_6 9
#define PIN_7 10
#define PIN_8 11
#define PIN_9 12
#define PIN_ENT 13

#define PAUSE_KEY_TO_KEY 100 
#define HOLD_KEY         100 
#define RELAY_ON         LOW 
#define RELAY_OFF        HIGH 

uint8_t pins[]={PIN_0, PIN_1,PIN_2,PIN_3,PIN_4,PIN_5,PIN_6,PIN_7,PIN_8,PIN_9,PIN_ENT};

void entPass(uint32_t pass){
   for(uint8_t i=0; i<=8; i++){
      Serial.print(pass%10);
      digitalWrite(pins[pass%10],RELAY_ON);
      delay(HOLD_KEY);
      digitalWrite(pins[pass%10],RELAY_OFF);
      delay(PAUSE_KEY_TO_KEY);
      pass/=10;
   }
   Serial.println();
   digitalWrite(PIN_ENT,RELAY_ON);
   delay(HOLD_KEY);
   digitalWrite(PIN_ENT,RELAY_OFF);
   delay(PAUSE_KEY_TO_KEY);
}

void setup() {
  Serial.begin(115200);
  Serial.println("Hallo...");
  for(uint8_t i=0;i<sizeof(pins);i++){
    pinMode(pins[i],OUTPUT);
    digitalWrite(pins[i],RELAY_OFF);
  }
}

void loop() {
   static uint32_t pass=0;
   entPass(pass++);
}

 

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

SLKH пишет:
да какой там ещё автомат?  один цикл while - вся программа.
Как какой? И ещё лямбда-функции не забыть! :)))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

из тех станков, что мне попадались, после ввода сервисного пароля надо было выполнить процедуру первичной инициализации, просто набор цифр запускающих процедуру инициализации

MaksVV
Offline
Зарегистрирован: 06.08.2015

to brokly пасиб полезно, пригодится. 

b707
Онлайн
Зарегистрирован: 26.05.2017

MaksVV пишет:

to brokly пасиб полезно, пригодится. 

надо еще добавить сброс статуса в ЕЕПРОМ - скажем раз в час или после каждых 10 тыс паролей, ну и чтение при старте соответвенно - чтобы при рестарте не начинать каждый раз с нуля.

bifurkas
Offline
Зарегистрирован: 27.10.2013

brokly, благодарю!

DIVGENY
Offline
Зарегистрирован: 23.08.2016

 делал на заказ мызыкальные автоматы. кнопки через оптопару замыкали необходимые контакты на плате обычной USB клавиатуры.

 

APJ
Offline
Зарегистрирован: 25.03.2015

Что за станок то? Точнее что за чпу. Может всё проще решается.

И обычно при дохлой батарейке слетают параметры и настройки со стойки.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Почитайте про этот брутфорс , надеюсь Вам поможет

https://habr.com/ru/post/240291/

еще как слетают и на тпа тоже

bifurkas
Offline
Зарегистрирован: 27.10.2013

APJ пишет:

Что за станок то? Точнее что за чпу. Может всё проще решается.

И обычно при дохлой батарейке слетают параметры и настройки со стойки.

ТПА ChenDe, ЧПУ Ai-01. При перевозке и хранении батарейка села и он запросил сервис-пароль.

Green
Онлайн
Зарегистрирован: 01.10.2015

brokly, старт с 10 000 000 и 8 разрядов, а не с 0 и 9, как у тебя.)

bifurkas пишет:

Вариант ждать 4 месяца лучше, чем менять ЧПУ. К тому-же задача несколько проще, пароль скорее всего восьмизначный от 10000000 до 99999999.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Green пишет:

brokly, старт с 10 000 000 и 8 разрядов, а не с 0 и 9, как у тебя.)

Тут не магазин, кому нужно тот поправит. А кто не может - в тему ищу исполнителя.

Специально для Грина:

#define PIN_0 3
#define PIN_1 4
#define PIN_2 5
#define PIN_3 6
#define PIN_4 7
#define PIN_5 8
#define PIN_6 9
#define PIN_7 10
#define PIN_8 11
#define PIN_9 12
#define PIN_ENT 13

#define PASS_START 0
#define PASS_LEN 8
//#define NO_FIRST_ZERRO

#define PAUSE_KEY_TO_KEY 50 
#define HOLD_KEY         50 
#define RELAY_ON         LOW 
#define RELAY_OFF        HIGH 

uint8_t pins[]={PIN_0, PIN_1,PIN_2,PIN_3,PIN_4,PIN_5,PIN_6,PIN_7,PIN_8,PIN_9,PIN_ENT};

void entPass(uint32_t pass){
   uint32_t divider=pow(10,PASS_LEN);
   #ifdef NO_FIRST_ZERRO 
      bool _print=false;
   #else
      bool _print=true;
   #endif
   for(uint8_t i=0; i<PASS_LEN; i++){
      uint8_t temp=pass%divider/(divider/10);
      #ifdef NO_FIRST_ZERRO 
         if (!_print) _print=(temp!=0);
      #endif
      if (_print) {
         Serial.print(temp);
         digitalWrite(pins[temp],RELAY_ON);
         delay(HOLD_KEY);
         digitalWrite(pins[temp],RELAY_OFF);
         delay(PAUSE_KEY_TO_KEY);
      }
      divider/=10;
   }
   Serial.println();
   digitalWrite(PIN_ENT,RELAY_ON);
   delay(HOLD_KEY);
   digitalWrite(PIN_ENT,RELAY_OFF);
   delay(PAUSE_KEY_TO_KEY);
}

void setup() {
  Serial.begin(115200);
  Serial.println("Hallo...");
  for(uint8_t i=0;i<sizeof(pins);i++){
    pinMode(pins[i],OUTPUT);
    digitalWrite(pins[i],RELAY_OFF);
  }
}

void loop() {
   static uint32_t pass=PASS_START;
   entPass(pass++);
   if (pass>(uint32_t)pow(10,PASS_LEN)-1) pass=PASS_START;
}

 

Green
Онлайн
Зарегистрирован: 01.10.2015

Нет, специально для bifurkas.
Во! И вывод уже не по молдавски... "Так значит можешь, если захочешь!")

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Это была "обратная польская нотация".

Green
Онлайн
Зарегистрирован: 01.10.2015

brokly пишет:

Тут не магазин, кому нужно тот поправит. А кто не может - в тему ищу исполнителя.


А вот это золотые слова.)

SLKH
Offline
Зарегистрирован: 17.08.2015

brokly пишет:

#define PIN_0 3

#define PIN_1 4
#define PIN_2 5
#define PIN_3 6
#define PIN_4 7
#define PIN_5 8
#define PIN_6 9
#define PIN_7 10
#define PIN_8 11
#define PIN_9 12
#define PIN_ENT 13


uint8_t pins[]={PIN_0, PIN_1,PIN_2,PIN_3,PIN_4,PIN_5,PIN_6,PIN_7,PIN_8,PIN_9,PIN_ENT};

         digitalWrite(pins[temp],RELAY_ON);

 

я бы написал вместо этого

for (byte i=3; i<14; i++) {pinMode(i, OUTPUT); digitalWrite(i, RELAY_OFF);}

и потом в работе 

digitalWrite(temp+3, RELAY_ON);

 


 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

И зря бы сделали, мы же не знаем какие ноги будут юзать :) А может у человека бутерброд из шилдов нахлабучек, может у него ESP32 или еще какая хрень.

SLKH
Offline
Зарегистрирован: 17.08.2015

brokly пишет:

И зря бы сделали, мы же не знаем какие ноги будут юзать :) А может у человека бутерброд из шилдов нахлабучек, может у него ESP32 или еще какая хрень.

даже если не знаем и пины вразброс - почему не объявить их номера в массиве без предварительных дефайнов?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Потому что так людям которые будут это юзать (если будут), проще понять и изменить.

bifurkas
Offline
Зарегистрирован: 27.10.2013

Уважаемый brokly! Огромное Вам человеческое спасибо! На моё счастье пароль оказался из 6 цифр и ардуино подобрал его за несколько часов. Никаких дополнительных вводов цифр или подтверждений пароля на моём ЧПУ не было, всё благополучно загрузилось, правда с дефолтными настройками, т.е. на китайском. Но это уже победа! Ещё раз большое спасибо!!!

sadman41
Offline
Зарегистрирован: 19.10.2016

Таперича придется бюст брукле отлить в награду...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

bifurkas пишет:

Уважаемый brokly! Огромное Вам человеческое спасибо! На моё счастье пароль оказался из 6 цифр и ардуино подобрал его за несколько часов. Никаких дополнительных вводов цифр или подтверждений пароля на моём ЧПУ не было, всё благополучно загрузилось, правда с дефолтными настройками, т.е. на китайском. Но это уже победа! Ещё раз большое спасибо!!!


мог бы и выложить пароль )))

bifurkas
Offline
Зарегистрирован: 27.10.2013

ua6em пишет:

мог бы и выложить пароль )))

А я его не знаю. Я же выше писал алгоритм набора пароля для моего ЧПУ. Единожды его введя, после смены батарейки, станок больше его не запрашивает.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

sadman41 пишет:

Таперича придется бюст брукле отлить в награду...

Ну все.... Теперь я вдвое больше за работу брать буду :)

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

brokly пишет:

Ну все.... Теперь я вдвое больше за работу брать буду :)

По два бюста?