Pull to refresh

Брутфорсим EFI с Arduino

Reading time 23 min
Views 102K
Приветствую Хабравчан!

Думаю, данной темой не многих удивишь — достаточно набрать в поисковике фразу arduino bruteforce и сразу станет понятно, насколько распространен перебор паролей при помощи платформы Arduino. Я же хочу рассказать о том, как это быстро организовать с наименьшим наборов компонентов, без разводки/травления плат и пайки. Сразу оговорюсь, что описанные мною действия носят ознакомительный характер и никому не причинили вреда, ни морального, ни физического… разве что мошенникам.


 
Зачем я это делал

Однажды вечером на мой iPhone пришло уведомление о смене пароля в Apple ID. Заподозря неладное, я кинулся проверять аккаунт Apple ID. Как вы уже догадались, со мной произошла та самая неприятная ситуация. Зайти в аккаунт я уже, естественно, не смог, восстановить пароль тоже не получалось — не приходили письма от Apple на почтовый ящик. Вскоре обнаружил известную фишку хакеров — настройку фильтрации входящей почты на самом ящике. Собственно, изначально взломали почтовый ящик, потом без проблем поменяли пароль на Apple ID. Но когда удалось восстановить доступ к Apple ID, было уже поздно. К тому времени iPhone был заблокирован злоумышленниками через сервис «Найти iPhone», MacBook тоже требовал пароль, ну и как полагается, на экране красовалось сообщение:



И если сброс iPhone на заводские настройки через iCloud не вызвал никаких сложностей, то сбросить блокировку с Mac стандартными средствами невозможно. В Mac устанавливается пароль не на учетную запись, а непосредственно на прошивку EFI. Пароль хранится на отдельном чипе в зашифрованном виде, поэтому компьютер становится заблокированным на уровне железа. Служба поддержки направила меня в авторизированный сервисный центр, где за N-ную сумму и пару дней предлагали сбросить пароль. Кстати сказать, эта сумма почти вдвое больше, чем запрашивают мошенники за пароль. Но я не стал спешить расставаться с деньгами и начал искать в интернете способы сделать все самому. Перелопатив множество форумов пришел к выводу, что нужен полный перебор паролей.

Эврика!

Перебирать вручную 10 000 комбинаций — дело не царское, а ведь и скриптик негде запустить. К счастью, заработала клавиатура, подключенная к MacBook через USB, а значит время создать «умную USB клавиатуру»! Именно для этого случая у меня пылилась платка Arduino Uno, с ней и будет весь концерт.

Небольшое отступление. Позже в интернете я нашел один интересный проект «взломщика» на Arduino, довольно-таки серьезное устройство, считывающее и анализирующее картинку через VGA разъем. Но это для тех, у кого есть желание и много времени.

За дело

Для начала нашел специальную прошивку для микросхемы «ATMEL MEGA16U2», на Arduino Uno бывает еще «ATMEL MEGA8U2». Это USB-контроллер платы Arduino. На фото ниже расположение USB-контроллера Arduino Uno ревизии R3:



Необходима такая прошивка, чтобы компьютер воспринимал плату не как устройство COM-порта, а как HID клавиатуру. Код прошивки будет позже.

Примечание: Arduino Leonardo и Arduino Micro поддерживают USB HID штатно

Итак, дело осталось за малым — написать программу для самого контроллера. Сначала проверим нашу «клавиатуру» на заведомо невзломанном рабочем компьютере.

ВНИМАНИЕ! Прошиваем сначала контроллер ATMEGA, только потом USB-контроллер MEGA! Среда разработки Arduino прошивать клавиатуры не умеет.

Загружаем тестовый скетч на контроллер:

uint8_t buf[8] = { 0 }; // байт с информацией о «нажатой» клавише

void setup() 
{
  Serial.begin(9600); // Устанавливаем скорость соединения
  delay(2000); // Пауза, чтобы «клавиатура» успела определиться в системе
}

void loop() 
{
  int dig1, dig2, dig3, dig4; // Цифры, которые будут последовательно вводиться
  int keys[10] = { 39, 30, 31, 32, 33, 
  34, 35, 36, 37, 38  }; // Массив с ASCII кодами цифер от 0 до 9 соответственно

// Перебираем комбинации, начиная  с 0000:

  for(dig1=0; dig1<10; dig1++)
  {
    for(dig2=0; dig2<10; dig2++)
    {
      for(dig3=0; dig3<10; dig3++)
      {
        for(dig4=0; dig4<10; dig4++)
        {
          pressKey(keys[dig1]);
          pressKey(keys[dig2]);
          pressKey(keys[dig3]);
          pressKey(keys[dig4]);
          pressKey(40); // Клавиша Enter
          delay(1000);
        }
      }
    }
  }
}

void pressKey(int dig) // Функция ввода
{
  buf[2] = dig;
  Serial.write(buf, 8); // Нажать клавишу
  buf[0] = 0;
  buf[2] = 0;
  delay(20);
  Serial.write(buf, 8); // Отпустить клавишу
  delay(200);
}



Отсоединяем Arduino от компьютера.

Теперь нужно прошить USB-контроллер, для этого скачаем программу FLIP (Windows) c сайта ATMEL и установим ее.
В случае с MacOS отдельные инструкции. Для некоторых версий Arduino Uno есть тонкости при прошивке USB-контроллера, подробности здесь.

Создадим hex-файл прошивки USB-контроллера. Код можно просто скопировать в текстовый редактор типа Блокнота и сохранить с расширением .hex
«Arduino-Uno-keyboard.hex»
:100000009AC00000B3C00000B1C00000AFC0000043
:10001000ADC00000ABC00000A9C00000A7C0000038
:10002000A5C00000A3C00000A1C00000E3C3000001
:100030009DC000009BC0000099C0000097C0000058
:1000400095C0000093C0000091C000008FC0000068
:100050008DC000008BC0000089C0000052C10000AC
:1000600085C0000083C0000081C000007FC0000088
:100070007DC000007BC0000079C0000077C0000098
:1000800075C0000073C0000071C000006FC00000A8
:100090006DC000006BC0000005010906A1017501DB
:1000A0009508050719E029E715002501810295014A
:1000B0007508810395057501050819012905910247
:1000C00095017503910395067508150026E700054F
:1000D00007190029E78100C0120110010000000883
:1000E000EB0342200000010200010902220001018D
:1000F00000C03209040000010301010009211101BF
:1001000000012240000705810308000A04030904D6
:100110001003410072006400750069006E006F00FA
:10012000000012034B006500790062006F0061005F
:1001300072006400000011241FBECFEFD2E0DEBFCA
:10014000CDBF11E0A0E0B1E0E8EAFFE002C0059019
:100150000D92AE30B107D9F711E0AEE0B1E001C0C9
:100160001D92AE3AB107E1F74ED01CC749CFBF92FE
:10017000CF92DF92EF92FF920F931F93CF93DF9373
:1001800084B7877F84BF28E10FB6F894209360007E
:10019000109260000FBE3CECC32ED12C87E690E09D
:1001A000F601918380839AECE92EF12C86E0B82E3B
:1001B000F701B08208EC10E0F8011082C9ECD0E041
:1001C0002883539A5A9A0BD384E085BD5F9A579A35
:1001D0001882F8011082F70110828FEC90E0F6018E
:1001E00091838083F701B08282E0F801808388E9FF
:1001F0008883DF91CF911F910F91FF90EF90DF9057
:10020000CF90BF900895B3DF2FB7F8948FE191E0BE
:100210009093A00180939F019093A2018093A101EC
:100220002FBF789480E091E0E7D584D4FBCF089588
:10023000089580E091E0B8D5E2EEF0E0808184603E
:100240008083089580E091E087C480910B019091B4
:100250000C01009729F0019790930C0180930B01FA
:1002600008950F931F93CF93DF93E8019FB7F894FE
:100270008091A3019FBF883050F1AEE0B1E08FE1E3
:1002800091E0E091A101F091A2015191F093A201BE
:10029000E093A10141E0EF39F40721F49093A2012A
:1002A0008093A1016FB7F8944091A301415040930E
:1002B000A3016FBF5D9341E0A631B40711F78091B0
:1002C00016019091C80095FFFCCF8093CE00EEE020
:1002D000F1E0822F932FDC0181918D9381E0E63153
:1002E000F807D1F788E090E09983888380E0DF9178
:1002F000CF911F910F910895F9018081809316018C
:1003000008951F920F920FB60F9211242F938F937F
:100310009F93EF93FF938091CE009EB39430F9F4B6
:10032000E0919F01F091A0018083E0919F01F09105
:10033000A001CF0101969093A00180939F0121E03D
:100340008F39920721F48FE191E0928381839FB7E7
:10035000F8948091A3018F5F8093A3019FBFFF91C9
:10036000EF919F918F912F910F900FBE0F901F9043
:100370001895933089F0943028F4913059F19230E7
:1003800071F505C09132E1F0923249F51EC022E2CA
:1003900030E0EAEEF0E027C0813049F0813018F01B
:1003A0008230E9F408C0ECE0F1E0249107C0E0E11C
:1003B000F1E0249103C0E2E2F1E0249130E013C0C7
:1003C00029E030E0ECEFF0E00EC020E430E0E8E9B6
:1003D000F0E009C022E130E0E8EDF0E004C020E008
:1003E00030E0E0E0F0E0DA011196FC93EE93C90111
:1003F000089528E030E040E003C04F5F220F331F34
:1004000028173907D0F3842F8295807F0895809331
:10041000E900EBEEF0E0808181608083EDEEF0E0BA
:1004200010826093EC0040838091EE00881F882743
:10043000881F08951092F40080E08093E9001092E4
:10044000F0001092E8001092ED009091EB009E7F7A
:100450009093EB008F5F853081F708958091A6011E
:1004600087FF11C003C08EB38823B1F08091E800EC
:1004700082FFF9CF8091E8008B778093E8000895A0
:100480008EB3882349F08091E80080FFF9CF8091F6
:10049000E8008E778093E800089584E69091EC0060
:1004A00090FF05C09091E80090FF05C01BC090919F
:1004B000E80092FD17C09EB39923B1F09EB395302A
:1004C000A9F09091EB0095FD13C09091E10092FF8F
:1004D000E5CF9091E1009B7F9093E100882351F05C
:1004E0008150DCCF80E0089582E0089583E0089594
:1004F00081E0089584E00895AF92BF92DF92EF9279
:10050000FF920F931F93DF93CF930F92CDB7DEB778
:10051000082F5B017A019983C0DFD82E9981882347
:1005200031F5192F1CC08091E80085FD10C0809125
:10053000E8008E778093E800E114F10421F0F701E0
:100540000995813081F0A9DF882349F00FC0F801B7
:1005500081918F018093F1000894A108B108A11442
:10056000B10409F704C075E0D72E01C0D82E8D2D37
:100570000F90CF91DF911F910F91FF90EF90DF903F
:10058000BF90AF900895282F392FF9018091AC01C9
:100590009091AD018617970718F4BC0190E032C026
:1005A00061157105D9F78091E8008E778093E80096
:1005B000F5CF8091E80083FD37C08091E80082FD8F
:1005C0002DC08EB38823A1F18EB3853079F180914F
:1005D000E80080FF17C08091F20006C091919093CF
:1005E000F100615070408F5F6115710511F0883026
:1005F000A8F391E0883009F090E08091E8008E77D0
:100600008093E80061157105A1F6992391F606C063
:100610008EB3882369F08EB3853061F08091E80055
:1006200082FFF6CF80E0089581E0089583E0089589
:1006300082E0089583E00895282F392FC901209181
:10064000AC013091AD012617370718F4B90130E03D
:1006500034C061157105D9F72091E8002E772093F9
:10066000E800F5CF2091E80023FD39C02091E80093
:1006700022FD2FC02EB32223B1F12EB3253089F1F4
:100680002091E80020FF19C02091F20008C0FC0171
:100690000196E491E093F100615070402F5F611585
:1006A000710511F0283098F331E0283009F030E07E
:1006B0002091E8002E772093E8006115710591F6EE
:1006C000332381F606C08EB3882369F08EB385305C
:1006D00061F08091E80082FFF6CF80E0089581E02C
:1006E000089583E0089582E0089583E008956115F8
:1006F000710519F51DC02091E80023FD2EC02EB311
:10070000222379F12EB3253051F12091E80022FF08
:10071000F2CFE82FF92F07C08091F1008193CF012C
:100720006150704029F0CF012091F2002223A1F7FF
:100730002091E8002B772093E80061157105D9F628
:1007400006C08EB3882369F08EB3853061F0809146
:10075000E80080FFF6CF80E0089581E0089583E00F
:10076000089582E0089583E008953ED040D01EBAF7
:100770001092A40184E089BD89B5826089BD09B465
:1007800000FEFDCF8091D800982F9F779093D800DE
:1007900080688093D800809163008E7F809363008F
:1007A0008091D8008F7D8093D8008091E0008E7F6B
:1007B0008093E0008091E1008E7F8093E100809142
:1007C000E20081608093E2008091E100877F809366
:1007D000E1008091E20088608093E2000895C5DF27
:1007E00081E08093A50108951092E200089510928F
:1007F000E10008951F920F920FB60F9211242F93CC
:100800003F934F935F936F937F938F939F93AF9398
:10081000BF93EF93FF938091E10080FF1BC0809115
:10082000E20080FF17C08091E1008E7F8093E1009D
:100830008091E2008E7F8093E2008091E2008061EF
:100840008093E2008091D80080628093D80019BC28
:100850001EBAEEDC8091E10084FF29C08091E200A5
:1008600084FF25C084E089BD89B5826089BD09B453
:1008700000FEFDCF8091D8008F7D8093D8008091BD
:10088000E1008F7E8093E1008091E2008F7E809373
:10089000E2008091E20081608093E2008091A401F7
:1008A000882311F084E001C081E08EBBC0DC809120
:1008B000E10083FF22C08091E20083FF1EC080918F
:1008C000E100877F8093E10082E08EBB1092A4015B
:1008D0008091E1008E7F8093E1008091E2008E7F25
:1008E0008093E2008091E20080618093E200A2DDCB
:1008F00080E060E042E08BDD1CD18091E10082FF6E
:100900000AC08091E20082FF06C08091E1008B7FE7
:100910008093E1009ADCFF91EF91BF91AF919F919D
:100920008F917F916F915F914F913F912F910F9098
:100930000FBE0F901F9018951F93DF93CF9300D099
:10094000CDB7DEB7E6EAF1E08091F100819381E076
:10095000EE3AF807C9F78091A6019091A70195306A
:1009600009F46BC0963040F4913061F1913070F031
:10097000933009F0C9C026C0983009F49BC0993063
:1009800009F4AAC0963009F0BFC075C0803809F4D8
:10099000BCC0823809F0B8C08091AA0187708093EA
:1009A000E9009091EB001092E9008091E800877FC8
:1009B0008093E80081E095FF80E08093F100109241
:1009C000F10083C0882319F0823009F09DC08F7137
:1009D000823009F09AC08091A801882341F52091C6
:1009E000AA01277009F491C02093E9008091EB00DF
:1009F00080FF8BC08091A701833021F48091EB00B0
:100A0000806213C08091EB0080618093EB0081E0F5
:100A100090E002C0880F991F2A95E2F78093EA00C0
:100A20001092EA008091EB0088608093EB001092B6
:100A3000E9008091E800877F4BC0882309F064C0FB
:100A40001091A8018091E800877F8093E80006DD7F
:100A500004C08EB3882309F458C08091E80080FF59
:100A6000F8CF1F7711F083E001C082E08EBB1068E1
:100A70001093E3004AC08058823008F045C080914E
:100A8000A8019091A9016091AA01AE014F5F5F4F4B
:100A900070DCBC010097C9F18091E800877F8093EA
:100AA000E80089819A81C8DD8091E8008B77809386
:100AB000E8002BC0803841F58091E800877F809363
:100AC000E8008091A4018093F1008091E8008E7786
:100AD0008093E800C3DC19C08823B1F49091A80189
:100AE000923098F48091E800877F8093E80090939B
:100AF000A401B4DC8091A401882311F084E001C03A
:100B000083E08EBB96DB01C09DDB8091E80083FF14
:100B10000AC08091EB0080628093EB008091E80036
:100B2000877F8093E8000F900F90CF91DF911F9106
:100B3000089508951F938EB3882361F01091E90002
:100B400017701092E9008091E80083FF01C0F4DE85
:100B50001093E9001F9108956F927F928F929F9258
:100B6000AF92BF92CF92DF92EF92FF920F931F93BB
:100B7000DF93CF9300D00F92CDB7DEB77C016DB677
:100B80007EB68091E80083FFF8C0F701808190E095
:100B90002091AA013091AB012817390709F0EDC067
:100BA0008091A701833009F499C0843030F48130FA
:100BB00071F0823009F0E1C0C8C08A3009F4AEC0DB
:100BC0008B3009F498C0893009F0D7C04CC08091AF
:100BD000A601813A09F0D1C0CDB6DEB69DB68D2C06
:100BE0008091E800877F8093E8001B821A828091C1
:100BF000A8010091A9018983F7014781C41AD1088E
:100C00000FB6F894DEBE0FBECDBE0894C11CD11C39
:100C1000BC2CAD2CC60160E070E050E0BCD1402F90
:100C20004150C701BE016F5F7F4F96018E010E5F7D
:100C30001F4F17DBF701258136812115310529F07A
:100C40004781C901B60150E09DD11092E9006A8147
:100C50007B818B2D9A2D97DC8091E8008B77809398
:100C6000E800940133C08091A601813209F085C06B
:100C7000CDB6DEB6BDB6AD2C8091E800877F8093FF
:100C8000E8000091AC011091AD019090A801809016
:100C9000A9018DB79EB7801B910B0FB6F8949EBF2C
:100CA0000FBE8DBFCDB6DEB60894C11CD11CC601E7
:100CB000B8011DDD482D4150C701692D96011CDB8F
:100CC0008091E8008E778093E8009501832F922F22
:100CD0000FB6F8949EBF0FBE8DBF4FC08091A60186
:100CE000813A09F04AC08091E800877F8093E8004C
:100CF000F70180853AC08091A601813209F03DC09C
:100D00008091E800877F8093E8009091A80181E0BE
:100D1000992309F480E0F70180872EC08091A60115
:100D2000813259F58091E800877F8093E8008091B7
:100D3000A8019091A901807036E0969587953A9523
:100D4000E1F7F7019287818717C08091A601813A68
:100D5000A1F48091E800877F8093E800F701818506
:100D6000928596958795969587958093F1008091C9
:100D7000E8008E778093E80071DB0FB6F8947EBEB2
:100D80000FBE6DBE0F900F900F90CF91DF911F910E
:100D90000F91FF90EF90DF90CF90BF90AF909F901A
:100DA0008F907F906F9008950F931F93CF93DF9351
:100DB000FC010896DC0185E0ED0119928A95E9F7BE
:100DC00081E0808784EF91E092878187228133815F
:100DD00001818481882311F014E001C010E0C90171
:100DE00008DB412F482B4260802F61EC10DBDF9144
:100DF000CF911F910F9108954F925F926F927F92C2
:100E00008F929F92AF92BF92CF92DF92EF92FF921A
:100E10000F931F93DF93CF9300D00F92CDB7DEB720
:100E20007C016DB67EB68EB3843009F085C0F701C3
:100E300081818093E9008091E80085FF7DC05DB6E7
:100E4000472C4781CDB6DEB6C41AD1080FB6F89448
:100E5000DEBE0FBECDBE0DB71EB70F5F1F4FB02E4B
:100E6000912E19821B821A82C80160E070E050E066
:100E700092D0C701BE016F5F7F4F40E098018E01A5
:100E80000E5F1F4FEED9882EF7018185928500975E
:100E900059F081E090E0238534852115310511F06A
:100EA00080E090E06C0102C0CC24DD24F7010581D4
:100EB00016810115110599F04A815B818B2D992DC1
:100EC000B80153D0AA24A394009709F4AA24F701E7
:100ED0004781C8016B2D792D50E054D001C0AA2460
:100EE0008A819B81009701F1882029F4AA2019F4B6
:100EF000C114D104C9F0F701818592859487838755
:100F000081818093E9008981882311F08093F10029
:100F10006A817B818B2D992D40E050E0EDDA809144
:100F2000E8008E778093E8009201832F942D0FB60E
:100F3000F8949EBF0FBE8DBF0FB6F8947EBE0FBE55
:100F40006DBE0F900F900F90CF91DF911F910F9179
:100F5000FF90EF90DF90CF90BF90AF909F908F90D9
:100F60007F906F905F904F900895FB01DC0104C06B
:100F70008D910190801921F441505040C8F7881B91
:100F8000990B0895FB01DC0102C001900D924150C4
:100F90005040D8F70895DC0101C06D934150504096
:080FA000E0F70895F894FFCF7B
:0E0FA800000108000017010800000000000012
:00000001FF

Дальше необходимо перевести Arduino в режим DFU. Для этого открываем «Диспетчер устройств» на Windows, подключаем плату к компьютеру, убеждаемся, что Windows видит ее как устройство COM-порта, затем закорачиваем какой-нибудь железкой контакты Arduino как показано на картинке ниже:



Через 5-10 секунд контакты размыкаем. Если в диспетчере появилось новое USB устройство «ATmega16U2» (или «...8U2») — отлично!

Нет — замыкаем контакты еще раз, можно попробовать подержать подольше. Если появляется «Неизвестное устройство», то необходимо установить драйвер для USB-контроллера Arduino: нажимаем правой кнопкой мыши на «Неизвестное устройство» > «Обновить драйверы» > «Выполнить поиск драйверов на этом компьютере» > ищем директорию с установленным FLIP, в ней папку «usb» > устанавливаем драйвер.

В итоге мы должны увидеть следующее:



Итак, Arduino в режиме DFU, теперь ее можно превращать в клавиатуру. Далее пойдет описание работы под Windows.

1. Запускаем FLIP. Во вкладке «Device» нажимаем «Select» или нажимаем на микросхемку, ищем в списке «ATmega16U2» (или «...8U2»), нажимаем «ОК».



2. Далее вкладка «Settings» > «Communication» или нажимаем на USB шнурок > «USB» > «Open». Если не выскочило никаких ошибок, значит пока все делаем правильно. В противном случае пробуем заново ввести Arduino в режим DFU.





3. Теперь вкладка «File» > «Load HEX File…» или нажимаем книжку со стрелочкой, ищем созданный ранее файл «Arduino-Uno-keyboard.hex», проверяем галочки и нажимаем «Run».





Пару мгновений и Arduino превращается… в элегантную клавиатуру! Отсоединяем плату от компьютера. На компьютере открываем любой текстовый редактор, затем подключаем Arduino вновь. Через пару секунд кто-то начнет печатать:

0000
0001
0002
…

Наш полтергейст перебощик паролей практически готов!

Все бы хорошо, но когда Arduino будет вводить пароли на MacBook, мы не сможем узнать, какой из них оказался правильным. Мы будем точно знать, что подошли какие-то четыре звездочки. Поэтому сделаем так, чтобы текущий пароль выводился на 28-сегментный индикатор. У меня как раз был такой:



Модуль индикатора уже распаян на плате с ключами и резисторами, поэтому, в моем случае, схема подключения простая: вход VCC индикатора подключаем к выводу 5V Аrduino, остальные от D1 до G — к цифровым выводам Arduino с 12 по 2 соответственно.

Существует множество видов сегментных идикаторов: с общим катодом, с общим анодом; со встроенным контроллером, без контроллера, матричные, соответственно и способы подключения индикаторов к контроллеру разные. Проще всего работать с модульным индикатором, имеющим контроллер или хотя бы матричную разводку:



Мне остается только приклеить индикатор куда-нибудь изолентой:



Финишная прямая

Пишем скетч с поддержкой модульного индикатора и необходимыми настройками ввода. Замеры показали, что время задержки ввода пароля у MacBook до загрузки ОС составляет 12 секунд после 5-ти попыток неверного ввода. Чтобы прошить «клавиатуру», нужно вернуть USB-контроллер Arduino к первоначальному состоянию. Для этого создадим hex-файл родной прошивки USB-контроллера. Код так же просто копируем в текстовый редактор типа Блокнота и сохраняем с расширением .hex
«Arduino-Uno-R3-usbserial.hex»
:1000000090C00000A9C00000A7C00000A5C000006B
:10001000A3C00000A1C000009FC000009DC0000060
:100020009BC0000099C0000097C0000048C40000B9
:100030000CC4000091C000008FC000008DC0000003
:100040008BC0000089C0000087C0000085C0000090
:1000500083C0000081C000007FC0000002C100001A
:100060007BC0000079C0000077C0000075C00000B0
:1000700073C0000071C000006FC000006DC00000C0
:100080006BC0000069C0000067C0000065C00000D0
:1000900063C0000061C000001201100102000008EE
:1000A0004123430001000102DC0109023E0002017C
:1000B00000C0320904000001020201000524000111
:1000C0001004240206052406000107058203080027
:1000D000FF09040100020A000000070504024000B5
:1000E00001070583024000010403090432034100B3
:1000F00072006400750069006E006F002000280027
:100100007700770077002E006100720064007500B0
:1001100069006E006F002E0063006300290000007C
:10012000000011241FBECFEFD2E0DEBFCDBF11E033
:10013000A0E0B1E0ECEAFFE002C005900D92A6312C
:10014000B107D9F712E0A6E1B1E001C01D92AF32CC
:10015000B107E1F7F1D028C753CF9C01DC01AE57BE
:10016000BF4FED91FC91119741911196FC93EE9345
:1001700080589F4FE817F90711F42D933C939FB7D0
:10018000F894F901EC57FF4F8081815080839FBF25
:10019000842F0895DF92EF92FF920F931F93FC013B
:1001A0008489813019F0823021F405C040E3D42ED7
:1001B00004C0DD2402C030E2D32E8389823011F4E2
:1001C00088E0D82A8589873031F0883031F0863050
:1001D00031F482E003C084E001C086E0D82A1092A6
:1001E000C9001092C8001092CA00E784F088018903
:1001F000128980E0E81681EEF80680E0080780E0CA
:10020000180719F420E130E00FC0C801B701969536
:1002100087957795679560587B47814E9F4FA801DA
:100220009701A0D6215030403093CD002093CC00D0
:10023000D092CA0080E0E81681EEF80680E0080758
:1002400080E0180711F082E001C080E08093C800D0
:1002500088E98093C9001F910F91FF90EF90DF9084
:1002600008951F920F920FB60F9211242F938F9320
:100270009F93EF93FF939091CE008EB38430F1F46F
:10028000E0919901F0919A019083E0919901F091A8
:100290009A01CF01019690939A018093990189590F
:1002A000914021F489E191E0928381839FB7F89492
:1002B00080919D018F5F80939D019FBFFF91EF9182
:1002C0009F918F912F910F900FBE0F901F901895B7
:1002D000FC01858580FF02C05F9808955F9A0895AC
:1002E00080E091E0D5C580E091E088C584B7877F44
:1002F00084BF28E10FB6F89420936000109260004C
:100300000FBE87E690E09093CD008093CC0086E00E
:100310008093CA001092C8002093C900539A5A9A39
:100320008AB180638AB98BB180638BB983D284E050
:1003300085BD5F9A579A08950F931F93CF93DF93CC
:10034000D5DF2FB7F8948EE991E090931F02809348
:100350001E0290932102809320022FBF2FB7F894A2
:1003600089E191E090939A018093990190939C0187
:1003700080939B012FBF7894CEE9D1E003E08FB743
:10038000F894909122028FBF903809F180E091E0BB
:10039000ABD497FD1CC0E0911E02F0911F02808338
:1003A000E0911E02F0911F02CF01019690931F026F
:1003B00080931E028E51924011F4D283C1839FB765
:1003C000F894809122028F5F809322029FBF8FB7A3
:1003D000F89410919D018FBFA89902C0113678F151
:1003E000A89A80919D01882361F05D980093160181
:1003F00008C089E191E0B1DE682F80E091E0DAD4B5
:1004000011501123B1F780911601882351F080918A
:10041000160181508093160180911601882309F4FA
:100420005D9A80911701882351F0809117018150C6
:100430008093170180911701882309F45C9A8FB784
:10044000F894909122028FBF992369F08EE991E090
:1004500084DE982F8091C80085FFFCCF9093CE005A
:100460005C980093170180E091E095D42AD487CF5F
:10047000DA01923049F0933061F09130F9F4E8E913
:10048000F0E022E130E01EC0EAEAF0E02EE330E0E6
:1004900019C0813049F0813018F0823079F408C0F9
:1004A000E8EEF0E0849107C0ECEEF0E0849103C048
:1004B000E0E2F1E08491282F30E004C0E0E0F0E0D9
:1004C00020E030E0ED93FC93C901089528E030E08E
:1004D00040E003C04F5F220F331F28173907D0F3C6
:1004E000842F8295807F08958093E9008091EB00AE
:1004F00081608093EB001092ED006093EC004093DC
:10050000ED008091EE00881F8827881F08951092C3
:10051000F40090E09093E9001092F0001092E8004F
:100520001092ED008091EB008E7F8093EB009F5F37
:10053000953081F708958091270288238CF403C0B9
:100540008EB38823B1F08091E80082FFF9CF8091CB
:10055000E8008B778093E80008958EB3882349F0F4
:100560008091E80080FFF9CF8091E8008E7780933A
:10057000E800089594E68091EC0080FF05C080912A
:10058000E80080FF05C023C08091E80082FD1FC005
:100590008EB3882311F482E008958EB3853011F470
:1005A00083E008958091EB0085FF02C081E008950B
:1005B0008091E10082FFDFCF8091E1008B7F80930B
:1005C000E100992311F484E008959150D4CF80E0A4
:1005D00008959C0140912D0250912E024617570715
:1005E00018F4F90120E038C06115710511F0AB0174
:1005F000F8CF8091E8008E778093E80040E050E0EB
:10060000F0CF8091E80083FF02C081E008958091DF
:10061000E80082FD2DC08EB3882381F18EB3853032
:1006200079F18091E80080FF17C09091F20006C038
:1006300081918093F100415050409F5F41155105D9
:1006400011F09830A8F320E0983009F421E080916F
:10065000E8008E778093E8004115510591F622233A
:1006600081F606C08EB3882349F08EB3853041F001
:100670008091E80082FFF6CF80E0089582E008953F
:1006800083E008959C0140912D0250912E0246175F
:10069000570710F490E03BC06115710511F0AB01F4
:1006A000F9CF8091E8008E778093E80040E050E039
:1006B000F1CF8091E80083FF02C081E0089580912E
:1006C000E80082FD30C08EB3882399F18EB3853067
:1006D00091F18091E80080FF1AC08091F20009C07A
:1006E000F9012F5F3F4FE491E093F10041505040FA
:1006F0008F5F4115510511F0883090F390E08830FC
:1007000009F491E08091E8008E778093E80041152C
:10071000510579F6992369F606C08EB3882349F00E
:100720008EB3853041F08091E80082FFF6CF80E003
:10073000089582E0089583E008959C016115710594
:1007400029F48091E8008B778093E800F90120C0BC
:100750008091E80083FF02C081E008958EB3882372
:1007600039F18EB3853031F18091E80082FFF0CF0E
:1007700006C08091F10081936150704021F080911A
:10078000F2008823B1F78091E8008B778093E8002E
:1007900061157105E9F606C08EB3882349F08EB362
:1007A000853041F08091E80080FFF6CF80E0089529
:1007B00082E0089583E0089542D044D01EBA10929A
:1007C0002502109224021092230284E089BD89B58B
:1007D000826089BD09B400FEFDCF8091D800982FBA
:1007E0009F779093D80080688093D80080916300B1
:1007F0008E7F809363008091D8008F7D8093D80096
:100800008091E0008E7F8093E0008091E1008E7FF8
:100810008093E1008091E20081608093E20080910A
:10082000E100877F8093E1008091E20088608093FF
:10083000E2000895C1DF81E08093260208951092BE
:10084000E20008951092E10008951F920F920FB6F2
:100850000F9211241F932F933F934F935F936F93A6
:100860007F938F939F93AF93BF93EF93FF93E9EEA3
:10087000F0E0108117701082E0EFF0E08081877F58
:1008800080837894C3D0F894A9EEB0E01C92E0EF96
:10089000F0E08081886080831C93FF91EF91BF918D
:1008A000AF919F918F917F916F915F914F913F9108
:1008B0002F911F910F900FBE0F901F9018951F92B0
:1008C0000F920FB60F9211242F933F934F935F9384
:1008D0006F937F938F939F93AF93BF93EF93FF9308
:1008E0008091E10080FF1BC08091E20080FF17C073
:1008F0008091E1008E7F8093E1008091E2008E7F05
:100900008093E2008091E20080618093E200809118
:10091000D80080628093D80019BC1EBAD1D18091D2
:10092000E10084FF29C08091E20084FF25C084E0BB
:1009300089BD89B5826089BD09B400FEFDCF809173
:10094000D8008F7D8093D8008091E1008F7E8093C6
:10095000E1008091E2008F7E8093E2008091E200CE
:1009600081608093E20080912502882311F481E068
:1009700001C084E08EBBA4D18091E10083FF27C039
:100980008091E20083FF23C08091E100877F809304
:10099000E10082E08EBB109225028091E1008E7F03
:1009A0008093E1008091E2008E7F8093E20080914D
:1009B000E20080618093E200AADD80E060E042E036
:1009C00093DD8091F00088608093F00079D1809170
:1009D000E10082FF0AC08091E20082FF06C08091A0
:1009E000E1008B7F8093E1006BD1FF91EF91BF918C
:1009F000AF919F918F917F916F915F914F913F91B7
:100A00002F910F900FBE0F901F9018951F93DF939B
:100A1000CF93CDB7DEB7AC970FB6F894DEBF0FBE5D
:100A2000CDBFE7E2F2E08091F100819322E0EF3266
:100A3000F207C9F78091270230912802353009F476
:100A400087C0363040F43130C9F1313070F0333086
:100A500009F01DC133C0383009F4EFC0393009F452
:100A6000FEC0363009F013C192C0803821F08238C0
:100A700009F00DC108C090912302809124028823BF
:100A800099F0926011C080912B0287708093E900E9
:100A90008091EB0090E025E0969587952A95E1F707
:100AA000982F91701092E9008091E800877F8093E1
:100AB000E8009093F1001092F100CAC0882319F069
:100AC000823009F0E4C090E08F719070009721F0BF
:100AD000029709F0DDC00CC080912902813009F035
:100AE000D7C010922402333069F5809324022AC0C3
:100AF00080912902882331F520912B02277009F477
:100B0000C7C02093E9008091EB0080FFC1C0333063
:100B100021F48091EB00806213C08091EB00806132
:100B20008093EB0081E090E002C0880F991F2A9526
:100B3000E2F78093EA001092EA008091EB0088606F
:100B40008093EB001092E9008091E800877F83C0DA
:100B5000882309F09CC0109129028091E800877FCA
:100B60008093E800E8DC04C08EB3882309F490C0C9
:100B70008091E80080FFF8CF812F8F7711F492E009
:100B800001C093E09EBB80688093E30081C08058E1
:100B9000823008F07CC08091290290912A0223E0E3
:100BA0008C3D920799F55FB7F894DE0115964EE0FB
:100BB00020E030E061E2E42FF0E0609357008491A0
:100BC00020FF03C082958F704F5F982F9F70892FF1
:100BD000805D8A3308F0895F8C9311961C9211977F
:100BE0002F5F3F4F12962431310529F75FBF8AE20C
:100BF0008B8383E08C838091E800877F8093E8007B
:100C0000CE0103966AE270E0E4DC11C060912B0231
:100C1000AE014F5F5F4F2CDCBC010097C9F18091A2
:100C2000E800877F8093E80089819A812BDD80919D
:100C3000E8008B778093E8002BC0803841F58091E5
:100C4000E800877F8093E800809125028093F1007F
:100C50008091E8008E778093E8006DDC19C08823CE
:100C6000B1F490912902923098F48091E800877F46
:100C70008093E800909325025EDC80912502882312
:100C800011F483E001C084E08EBB2DDB01C028DBC2
:100C90008091E80083FF0AC08091EB00806280931E
:100CA000EB008091E800877F8093E800AC960FB658
:100CB000F894DEBF0FBECDBFCF91DF911F91089595
:100CC00008951F938EB3882361F01091E90010926C
:100CD000E9008091E80083FF01C098DE177010934F
:100CE000E9001F9108950895FC018EB3843021F529
:100CF00087859089A189B2890097A105B105E1F0A6
:100D000085818093E9008091E80082FF15C0809181
:100D1000F200882319F42FEF3FEF04C08091F10017
:100D2000282F30E08091F200882341F48091E80080
:100D30008B778093E80002C02FEF3FEFC901089541
:100D4000FC018EB3843011F587859089A189B28921
:100D50000097A105B105D1F081818093E9008091D0
:100D6000F2008823A9F09091E8008091E8008E7746
:100D70008093E80095FD0CC0FDDB982F882349F493
:100D80008091E8008E778093E80003C092E001C074
:100D900090E0892F0895FC018EB3843051F487854B
:100DA0009089A189B2890097A105B10511F0CF0101
:100DB000C7CF08951F93FC01162F8EB38430D9F44A
:100DC00087859089A189B2890097A105B10599F01D
:100DD00081818093E9008091E80085FD08C08091C1
:100DE000E8008E778093E800C5DB882329F4109310
:100DF000F10080E001C082E01F9108950F931F93DE
:100E0000CF93DF93EC010D96FC0189E0DF011D9289
:100E10008A95E9F72A813B8109818C81882311F425
:100E200010E001C014E0C90151DB182B1260802FC3
:100E300061E8412F59DB882329F12E813F810D8103
:100E40008885882311F410E001C014E0C9013EDB5D
:100E5000182B1260802F60E8412F46DB882391F029
:100E60002A853B8509858C85882311F410E001C013
:100E700014E0C9012BDB182B1260802F61EC412F8D
:100E800033DB01C080E0DF91CF911F910F91089576
:100E9000CF93DF93EC018091E80083FF60C08881ED
:100EA00090E020912B0230912C022817390709F08D
:100EB00056C080912802813261F0823220F4803263
:100EC00009F04DC019C0823269F1833209F047C080
:100ED00038C080912702813A09F041C08091E80032
:100EE000877F8093E800CE010F9667E070E071DBAA
:100EF0008091E8008B7713C080912702813279F5C9
:100F00008091E800877F8093E800CE010F9667E02C
:100F100070E013DCCE013ED98091E8008E7780939B
:100F2000E8001DC0809127028132C9F48091E80059
:100F3000877F8093E800809129028D87CE01C8D9F0
:100F40000DC080912702813251F48091E800877FA3
:100F50008093E800CE0160912902C5DEECDADF91D2
:100F6000CF910895A1E21A2EAA1BBB1BFD010DC053
:100F7000AA1FBB1FEE1FFF1FA217B307E407F50749
:100F800020F0A21BB30BE40BF50B661F771F881F25
:100F9000991F1A9469F760957095809590959B01BB
:0C0FA000AC01BD01CF010895F894FFCF13
:100FAC0000034000000440000002080000000000A4
:060FBC000000000000002F
:00000001FF

Для всех Arduino родные прошивки USB-контроллера лежат здесь

Чтобы вернуться на родную прошивку USB-контроллера, делаем все с помощью программы FLIP (или по инструкции для Mac), как и ранее, в конце отключаем плату от компьютера. Затем вновь подключаем плату к компьютеру и загружаем на контроллер новый, усовершенствованный скетч с поддержкой индикатора.

uint8_t buf[8] = { 0 }; // байт с информацией о «нажатой» клавише

void setup() 
{
  Serial.begin(9600); // Устанавливаем скорость соединения
  pinMode(2, OUTPUT); // G
  pinMode(3, OUTPUT); // F
  pinMode(4, OUTPUT); // E
  pinMode(5, OUTPUT); // D
  pinMode(6, OUTPUT); // C
  pinMode(7, OUTPUT); // B
  pinMode(8, OUTPUT); // A
  pinMode(9, OUTPUT); // D4
  pinMode(10, OUTPUT); // D3
  pinMode(11, OUTPUT); // D2
  pinMode(12, OUTPUT); // D1

// Так как модуль сегментных индикаторов имеет общий анод, то для того, чтобы 
// светился сегмент, вывод Arduino должно быть в высокоимпедансном состоянии 
// и наоборот

// Выключаем все сегменты:

  digitalWrite(12, HIGH);
  digitalWrite(11, HIGH);
  digitalWrite(10, HIGH);
  digitalWrite(9, HIGH);
  delay(2000); // Пауза, чтобы «клавиатура» успела определиться в системе
}

void loop() 
{
  int dig1, dig2, dig3, dig4; // Цифры, которые будут последовательно вводиться
  int keys[10] = { 39, 30, 31, 32, 33, 
  34, 35, 36, 37, 38 }; // Массив с ASCII кодами цифер от 0 до 9 соответственно

// Перебор с 0000 до 9999:

  for(dig1=0; dig1<10; dig1++)
  {
    for(dig2=0; dig2<10; dig2++)
    {
      for(dig3=0; dig3<10; dig3++)
      {
        for(dig4=0; dig4<10; dig4++)
        {
          pressKey(keys[dig1]);
          pressKey(keys[dig2]);
          pressKey(keys[dig3]);
          pressKey(keys[dig4]);
          pressKey(40); // Клавиша Enter

// Текущий пароль будет отображаться в течение примерно 15-ти секунд (чуть больше времени задержки ввода)

          for(int i=0; i<1200; i++)
          {
            digLED(12, dig1);
            digLED(11, dig2);
            digLED(10, dig3);
            digLED(9, dig4);
          }
        }
      }
    }
  }
}

void pressKey(int dig) // Функция ввода
{
  buf[2] = dig;
  Serial.write(buf, 8); // Нажать клавишу
  buf[0] = 0;
  buf[2] = 0;
  delay(20);
  Serial.write(buf, 8); // Отпустить клавишу
  delay(300);
}

// Возможно, существуют библиотеки для сегментных индикторов, но мне не захотелось с ними разбираться, 
// поэтому набросал свой алгоритм обхода сегментов индикатора

void digLED(int pin, int dig) // Функция отображения цифер на индикаторе
{
  digitalWrite(pin, LOW);
  switch(dig)
  {
  case 0:
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);
    digitalWrite(2, HIGH);
    break;
  case 1:
    digitalWrite(8, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(2, HIGH);
    break;
  case 2:
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(4, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(2, LOW);
    break;
  case 3:
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(2, LOW);
    break;
  case 4:
    digitalWrite(8, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    break;
  case 5:
    digitalWrite(8, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    break;
  case 6:
    digitalWrite(8, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    break;
  case 7:
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(2, HIGH);
    break;
  case 8:
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    break;
  case 9:
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    break;
  }
  delay(3);
  digitalWrite(pin, HIGH);
}


И снова прошиваем USB-контроллер прошивкой Arduino-Uno-keyboard.hex



Можно запускать!

Хотя… Я бы лично не смог до 42-х часов подряд смотреть на индикатор и монитор, ожидая подходящего пароля. Для этих целей отлично подойдет одноглазый свидетель — видеокамера. Запись будет вестись со старенькой SONY через miniDV (IEEE-1394) при помощи бесплатной программы SplitCam на другой компьютер. В качестве альтернативы можно использовать веб-камеру или видеорегистратор для автомобиля.

Запускаем MacBook с нажатой клавишей «alt», подсодиняем «клавиатуру», включаем видеозапись и идем по своим делам, переодически визуально контролируя процесс.

Система в действии:



В моем случае пароль нашелся на вторые сутки. Этот торжественный момент на видео:



Как оказалось, после запуска операционной системы снова потребовался пароль, но ни о чем не подозревающая Arduino продолжала перебор. Позже подошел я, отсоединил «клавиатуру», промотал видео назад и ввел верный пароль.

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

Tags:
Hubs:
+74
Comments 27
Comments Comments 27

Articles