Русский
Русский
English
Статистика
Реклама

Прошивка

Как расшифровать прошивку автомобиля в неизвестном формате

30.07.2020 12:15:48 | Автор: admin

Toyota распространяет свои прошивки в недокументированном формате. Мой заказчик, у которого автомобиль этой марки, показал мне файл прошивки, который начинается так:

CALIBRATIONXi
attach.att
[Format]
Version=4

[Vehicle]
Number=0
DateOfIssue=2019-08-26
VehicleType=GUN1**
EngineType=1GD-FTV,2GD-FTV
VehicleName=IMV
ModelYear=15-
ContactType=CAN
KindOfECU=0
NumberOfCalibration=1

[CPU01]
CPUImageName=3F0S7300.xxz
FlashCodeName=
NewCID=3F0S7300
LocationID=0002000100070720
CPUType=87
NumberOfTargets=3
01_TargetCalibration=3F0S7200
01_TargetData=3531464734383B3A
02_TargetCalibration=3F0S7100
02_TargetData=3747354537494A39
03_TargetCalibration=3F0S7000
03_TargetData=3732463737463B4A

3F0S7300forIMV.txt Nim5A56001000820EE13FE2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133E2030133E2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133E2030133E2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133E20911381959FAB0EE9000
81C9E03ADE35CEEEEFC5CF8DE9AC0910
38C2E031DE35CEEEEFC8CF87E95C0920
...


Дальше идут строки по 32 шестнадцатеричные цифры.

Хозяину и прочим умельцам хотелось бы перед установкой прошивки иметь возможность проверить, что там внутри: засунуть ее в дизассемблер и посмотреть, что она делает.

Конкретно для этой прошивки у него имелся дамп содержимого:

0000: 80 07 80 00 00 00 00 00 00 00 00 00 00 00 00 00
0010: 80 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0030: 80 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0040: 80 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0050: 80 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0070: 80 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080: E0 07 60 01 2A 06 00 FF 00 00 0A 58 EA FF 20 00
0090: FF 57 40 00 EB 51 B2 05 80 07 48 01 E0 FF 20 00
...


Как видно, нет ничего даже близко похожего на строчки шестнадцатеричных цифр в файле прошивки. Встает вопрос: в каком формате распространяется прошивка, и как ее расшифровать? Эту задачу хозяин автомобиля поручил мне.

Повторяющиеся фрагменты


Посмотрим внимательно на те шестнадцатеричные строчки:

5A56001000820EE13FE2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133E2030133E2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133E2030133E2030133E20301
33E2030133C20EF13FE2030133E20301
33E2030133E20911381959FAB0EE9000
81C9E03ADE35CEEEEFC5CF8DE9AC0910
38C2E031DE35CEEEEFC8CF87E95C0920
...


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

  1. Пять первых байт 5A56001000 это некий заголовок, не влияющий на содержимое дампа;
  2. Дальнейшее содержимое зашифровано блоками по 4 байта, причем одинаковым байтам дампа соответствуют одинаковые байты в файле:
    • E2030133 00000000
    • 820EE13F 80078000
    • C20EF13F 80070000
    • E2091138 E0076001
    • 1959FAB0 2A0600FF
    • EE900081 00000A58
    • C9E03ADE EAFF2000
  3. Видно, что это не XOR-шифрование, а нечто более сложное; но при этом похожим блокам дампа соответствуют похожие блоки в файле например, изменению одного бита 8007800080070000 соответствует изменение одного бита 820EE13FC20EF13F.

Соответствия между блоками


Получим список всех пар (блок файла, блок дампа), и поищем в нем закономерности:

$ xxd -r -p firmware.txt decoded$ python>>> f = open('decoded','rb')>>> data=f.read()>>> words=[data[i:i+4] for i in range(0,4096,4)]>>> f = open('dump','rb')>>> data=f.read()[:4096]>>> reference=[data[i:i+4] for i in range(0,4096,4)]>>> list(zip(words,reference))[:3][(b'\x82\x0e\xe1?', b'\x80\x07\x80\x00'), (b'\xe2\x03\x013', b'\x00\x00\x00\x00'), (b'\xe2\x03\x013', b'\x00\x00\x00\x00')]>>> dict(zip(words,reference)){b'\x82\x0e\xe1?': b'\x80\x07\x80\x00', b'\xe2\x03\x013': b'\x00\x00\x00\x00', b'\xc2\x0e\xf1?': b'\x80\x07\x00\x00', ...}>>> decode=dict(zip((w.hex() for w in words), (r.hex() for r in reference)))>>> decode{'820ee13f': '80078000', 'e2030133': '00000000', 'c20ef13f': '80070000', ...}>>> sorted(decode.items())[('00beb5ff', '4c07a010'), ('02057139', '0000f00f'), ('03ef5ed0', '50ff710f'), ...]

Вот как выглядят первые пары в отсортированном списке:

00beb5ff  4c07a01002057139  0000f00f03ef5ed0  50ff710f \ изменение в бите 24 в дампе меняет биты 8, 10, 24-27 в файле04ef5bd0  51ff710f < 0408ed38  14002d06  \05f92ed7  ffffd087   |0a5d22bb  f602dffe    > изменение в бите 25 в дампе меняет биты 11, 25-27 в файле0a62f9a9  e10f5761   |0acdc6e4  a25d2c06  /0aef53d0  53ff710f <0aef5cd0  52ff710f / изменение в бите 24 в дампе меняет биты 8-11 в файле0bdebd6f  4c57a4100d0c7fec  0064ffff0d0fe57f  18402c570d8fa4d0  bfff88ff0ee882d7  eafd7f001001c5c6  6c570042 \1008d238  42003e06  > изменение в бите 1 в дампе меняет биты 0, 3, 16-19 в файле100ec5cf  6c570040 /109ec58f  6c07005010e1ebdf  62ff600810ec4cdd  dafd4c07119f0f8f  08006d5711c0feee  2c5f0500120ff07e  20420452125ef13e  20f600c8125fc14e  60420032126f02af  02006d671281d09f  400f34881281d19f  400f308812a6d0bb  4007349812a6d1bb  40073098 \12aed0bf  40073490  > изменение в бите 3 в дампе меняет биты 2 и 19 в файле12aed1bf  40073090 /> изменение в бите 10 в дампе меняет бит 8 в файле12c3f1ea  20560001 \12c9f1ea  20560002 /  изменения в битах 0 и 1 в дампе меняет биты 17 и 19 в файле...

Действительно, видны закономерности:

  • Изменения в битах 0-3 в дампе меняют биты 0-3 и 16-19 в файле (маска 000F000F)
  • Изменения в битах 24-25 в дампе меняют биты 8-11 и 24-27 в файле (маска 0F000F00)

Напрашивается гипотеза, что каждые 4 бита в дампе влияют на те же самые 4 бита в каждой 16-битной половине 32-битного блока.

Для проверки отрежем старшие 4 бита в каждом полублоке, и посмотрим, какие пары получатся:

>>> ints=[int.from_bytes(w, 'big') for w in words]>>> [hex(i) for i in ints][:3]['0x820ee13f', '0xe2030133', '0xe2030133']>>> scrambled=[((i & 0xf000f000) >> 12, (i & 0x0f000f00) >> 8, (i & 0x00f000f0) >> 4, (i & 0x000f000f)) for i in ints]>>> scrambled=[tuple(((i >> 16) << 4) | (i & 15) for i in q) for q in scrambled]>>> scrambled[:3][(142, 33, 3, 239), (224, 33, 3, 51), (224, 33, 3, 51)]>>> [tuple(hex(i) for i in q) for q in scrambled][:3][('0x8e', '0x21', '0x3', '0xef'), ('0xe0', '0x21', '0x3', '0x33'), ('0xe0', '0x21', '0x3', '0x33')]>>> [b''.join(bytes([i]) for i in q) for q in scrambled][:3][b'\x8e!\x03\xef', b'\xe0!\x033', b'\xe0!\x033']>>> decode=dict(zip((b''.join(bytes([i]) for i in q).hex() for q in scrambled), (r.hex() for r in reference)))>>> sorted(decode.items())[('025efd97', 'ffffd087'), ('02a25bdb', 'f602dffe'), ('053eedf0', '50ff710f'), ...]>>> decode=dict(zip((b''.join(bytes([i]) for i in q[1:]).hex() for q in scrambled), (r.hex()[1:4]+r.hex()[5:8] for r in reference)))>>> sorted(decode.items())[('018d90', '0f63ff'), ('020388', '200e06'), ('050309', 'c03000'), ...]

После перестановки подблоков по 4 бита в ключе сортировки, соответствия между парами подблоков становятся еще более явными:

018d90  0f63ff020388  200e06    \050309  c03000 \   | блок xx0xxx0x в дампе соответствует блоку xx0xxx3x в файле05030e  c0f000  |  |05036e  c06000  | /050c16  c57042  |050cef  c57040  |05971e  c88007   > блок xCxxx0xx в дампе соответствует блоку x0xxx5xx в файле0598ef  c07050  |05bfef  c07010  |05db59  c9000f  |05ed0e  cff000 <060ecc  264fff  |065ba7  205fff  |0bed1f  2ff008 <|0bfd15  2ff086  |0cedcd  afdc07 <|10f2e7  e06a7e   > блок xxFxxx0x в дампе соответствует блоку xxExxxDx в файле118d5a  9fdfff  | \13032b  40010a  |  > блок xxFxxxFx в дампе соответствует блоку xx8xxxDx в файле148d3d  fff6fc  | /16b333  f00e30  |16ed15  fffe06 /1b63e6  52e8831c98ff  400b57 \1d4d97  aff1b7  | блок xx00xx57 в дампе соответствует блоку xx9Fxx8F в файле1ece0e  c5f500  |1f98ff  800d57 /20032f  00e400 \200398  007401  |2007fe  042452  |2020ef  057490  |206284  067463   > блок x0xxx4xx в дампе соответствует блоку x2xxx0xx в файле20891f  00f488  |20ab6b  007498  | \20abef  007490  | / блок xx0xxx9x в дампе соответствует блоку xxAxxxBx в файле20ed1d  0ff404  |20fb6e  0064c0 /21030e  00f000 \21032a  00b008  |210333  000000  |210349  00c008  |21034b  003007  |210359  00000f  |210388  000006   > блок x00xx00x в дампе соответствует блоку x20xx13x в файле21038b  00300b  |210398  007001  |2103c6  007004  |2103d2  008000  |2103e1  008009  |2103ef  007000 /...

Соответствия между подблоками


В вышеприведенном списке видны такие соответствия:

  • Для маски 0F000F00:
    • x0xxx0xx в дампе x2xxx1xx в файле
    • x0xxx4xx в дампе x2xxx0xx в файле
    • xCxxx0xx в дампе x0xxx5xx в файле
  • Для маски 00F000F0:
    • xx0xxx0x в дампе xx0xxx3x в файле
    • xx0xxx5x в дампе xx9xxx8x в файле
    • xx0xxx9x в дампе xxAxxxBx в файле
    • xxFxxx0x в дампе xxExxxDx в файле
    • xxFxxxFx в дампе xx8xxxDx в файле
  • Для маски 000F000F:
    • xxx0xxx7 в дампе xxxFxxxF в файле
    • xxx7xxx0 в дампе xxxExxxF в файле
    • xxx7xxx1 в дампе xxx9xxx8 в файле

Можно сделать вывод, что каждый 32-битный блок в дампе разбивается на четыре восьмибитных значения, и эти значения заменяются при помощи неких таблиц подстановки, для каждой маски своей. Содержимое этих четырех таблиц кажется относительно случайным, но попробуем выделить из нашего файла их все:

>>> ref_ints=[int.from_bytes(w, 'big') for w in reference]>>> ref_scrambled=[((i & 0xf000f000) >> 12, (i & 0x0f000f00) >> 8, (i & 0x00f000f0) >> 4, (i & 0x000f000f)) for i in ref_ints]>>> ref_scrambled=[tuple(((i >> 16) << 4) | (i & 15) for i in q) for q in ref_scrambled]>>> decode=dict(zip((b''.join(bytes([i]) for i in q).hex() for q in scrambled), (b''.join(bytes([i]) for i in q).hex() for q in ref_scrambled)))>>> sorted(decode.items())[('025efd97', 'fdf0f8f7'), ('02a25bdb', 'fd6f0f2e'), ('053eedf0', '5701f0ff'), ...]>>> decode=[dict(zip((bytes([q[byte]]).hex() for q in scrambled), (bytes([q[byte]]).hex() for q in ref_scrambled))) for byte in range(4)]>>> decode[{'8e': '88', 'e0': '00', 'cf': '80', 'e1': 'e6', '1f': '20', 'c3': 'e2', ...}, {'03': '00', '5b': '0f', '98': '05', 'ed': 'f0', 'ce': '50', 'd6': '51', ...}, {'21': '00', '9a': 'a0', 'e0': '0a', '5e': 'f0', '5d': 'b2', 'c0': '08', ...}, {'ef': '70', '33': '00', '98': '71', '90': '6f', '01': '08', '0e': 'f0', ...}]>>> decode=[dict(zip((q[byte] for q in scrambled), (q[byte] for q in ref_scrambled))) for byte in range(4)]>>> decode[{142: 136, 224: 0, 207: 128, 225: 230, 31: 32, 195: 226, 62: 244, 200: 235, ...}, {3: 0, 91: 15, 152: 5, 237: 240, 206: 80, 214: 81, 113: 16, 185: 2, 179: 3, ...}, {33: 0, 154: 160, 224: 10, 94: 240, 93: 178, 192: 8, 135: 2, 62: 1, 120: 26, ...}, {239: 112, 51: 0, 152: 113, 144: 111, 1: 8, 14: 240, 249: 21, 110: 96, 241: 47, ...}]

Когда таблицы соответствия готовы, код расшифровки получается совсем простой:

>>> def _decode(x):...   scrambled = ((x & 0xf000f000) >> 12, (x & 0x0f000f00) >> 8, (x & 0x00f000f0) >> 4, (x & 0x000f000f))...   decoded = tuple(decode[i][((v >> 16) << 4) | (v & 15)] for i, v in enumerate(scrambled))...   unscrambled = tuple(((i >> 4) << 16) | (i & 15) for i in decoded)...   return (unscrambled[0] << 12) | (unscrambled[1] << 8) | (unscrambled[2] << 4) | (unscrambled[3])...>>> hex(_decode(0x00beb5ff))'0x4c07a010'>>> hex(_decode(0x12aed1bf))'0x40073090'

Заголовок прошивки


В самом начале перед зашифрованными данными был пятибайтный заголовок 5A56001000. Первые два байта сигнатура 'ZV' подсказывают, что используется формат LZF; дальше обозначены метод сжатия (0x00 без сжатия) и длина (0x1000 байт).

Хозяин автомобиля, передавший мне файлы для анализа, подтвердил, что в прошивках встречаются и сжатые LZF данные. К счастью, реализация LZF открыта и довольно проста, так что вместе с моим анализом ему удалось удовлетворить свое любопытство по поводу содержимого прошивок. Теперь он может вносить изменения в код например, автозапуск двигателя при падении температуры ниже заданного уровня, чтобы использовать автомобиль в условиях суровой русской зимы.

Подробнее..

Реверс-инжиниринг трафика на шине CAN

21.08.2020 12:12:17 | Автор: admin

Необработанный сигнал шины CAN

Шина CAN (Controller Area Network) стала стандартом в автомобилестроении: все новые автомобили обязаны поддерживать CAN (с 2001 в Европе и с 2008 в США). Кроме автомобилей, CAN применяется и в широком ряде других устройств. Производители диагностического оборудования для CAN рекламируют его применение, кроме разнообразной автомобильной техники, в мотоциклах, автопогрузчиках, судах, шахтных поездах, батискафах, беспилотных самолетах и пр. Давайте разберемся, что из себя представляет CAN.

В автомобилях используется несколько CAN; например, в Ford Focus таких шин четыре три высокоскоростных (500 kbps) для управления мотором, тормозами, приборной панелью и т.п., и одна низкоскоростная (125 kbps) для управления дверьми, фарами, подушками безопасности, аудиосистемой, кондиционером и всем прочим. Подключившись к CAN, можно имитировать сигналы от любых устройств в автомобиле например, управлять кондиционером с приложения на телефоне или накручивать одометр без движения автомобиля. Подключив к шине Arduino и реле, можно управлять с приборной панели дополнительной парковочной камерой. Даже стартапы, работающие над беспилотными автомобилями, такие как Voyage, начинают создание прототипа с того, что в обычном серийном автомобиле подключаются к CAN и учатся имитировать сигналы от педалей и руля.

Для подключения к CAN в автомобиле обычно возле руля имеется разъем OBD-II (On-Board Diagnostics). https://commons.wikimedia.org/wiki/File:OBD_002.jpg Адаптеры OBD2-USB для подключения компьютера к CAN стоят от $5, и позволяют отслеживать весь трафик внутри автомобиля. Иногда разъем OBD-II защищен аппаратным фаерволом, позволяющим принимать пакеты от устройств, подключенных к CAN, но не позволяющим передавать пакеты обратно на шину. В этом случае достаточно вывинтить разъем, и подключиться к проводам CAN вместо него.



Каждый пакет, передаваемый по шине CAN, состоит из ID передающего устройства (11 либо 29 бит), и до 8 байт передаваемых данных. Трафик, проходящий по шине при включении зажигания, может выглядеть как-то так:



Для анализа трафика CAN существует большое число инструментов как коммерческих, так и OpenSource. Пакет can-utils для Linux включает утилиту cansniffer, которая отображает для каждого CAN ID только последний отправленный пакет, и тем самым позволяет отслеживать изменения показаний каждого датчика на шине:



Для реверс-инжиниринга трафика CAN сингапурские исследователи, из доклада которых я взял этот трейс, записали на видео приборную доску подопытного автомобиля, и затем соотнесли изменения на приборной доске с одновременными изменениями в трафике. Определив таким образом CAN ID датчика скорости и формат передаваемых им данных, они научились подделывать его пакеты, передавая на спидометр и на тахометр показания, не соответствующие действительности.

Надо понимать, что параллельно с передачей поддельных пакетов по шине продолжают передаваться и настоящие сигналы от датчика скорости. Чтобы тахометр показывал сфабрикованные показания, надо отслеживать передачу по шине настоящих показаний, и каким-либо образом их подавлять например, сразу после обнаружения передачи CAN ID датчика скорости физически глушить шину, закорачивая линии данных. Более простой, чисто программный метод подавления настоящих показаний сразу же после их передачи, пока тахометр еще не успел отреагировать, передавать поддельные пакеты. Например, следующий простой шелл-скрипт отслеживает передачу с CAN ID=0x0C9, и сразу же после нее передает сфабрикованный пакет при помощи утилиты cansend из состава все тех же can-utils:

candump can0 | grep " 0C9 " | while read line; do cansend can0 0C9#8021C0071B101000; done

Даже хотя все устройства в автомобиле подключены к CAN, далеко не все их функции управляются через CAN. Например, на CAN в Ford Escape передаются сигналы о степени нажатия педалей газа и тормоза но используются эти сигналы только блоком ABS, тогда как приводы дроссельной заслонки и тормозов соединены с педалями напрямую, минуя CAN.

C точки зрения безопасности ни о какой уязвимости в докладе сингапурцев речи не идет, потому что для передачи поддельных CAN-пакетов нужен физический доступ к шине. Кроме того, пакеты могут быть защищены контрольной суммой например, в автомобилях Toyota последний байт каждого пакета должен равняться сумме всех предыдущих (по модулю 256). Кроме этого, в Toyota для защиты от нежелательных пакетов используется фильтрация получателем например, игнорируются повороты руля более чем на 5% от текущего значения.

Тем не менее исследователям безопасности удавалось получить к CAN и удаленный доступ: вначале на небольшом расстоянии через уязвимости в Bluetooth-модуле, подключенном к той же самой шине; а затем через сотовую сеть Sprint, через которую внедорожники нескольких американских производителей получали данные о пробках на дорогах. Исследователи, продемонстрировавшие перехват управления Jeep Cherokee с расстояния в несколько миль, получили от Управления перспективных исследовательских проектов Министерства обороны США (DARPA) вознаграждение в 80 тысяч долларов. С тех пор многие автопроизводители объявили о собственных bounty-программах, обещающих выплаты от $1500 за каждую обнаруженную уязвимость. Таким образом, реверс-инжиниринг трафика на шине CAN может не только добавить вашему автомобилю новые возможности, но и существенно пополнить ваш кошелек.

Подробнее..

Умное не значит дорогое для smart-часов за 25 от Pine64 выпустили open-source прошивку

23.04.2021 16:06:54 | Автор: admin

Команда Pine64 часто выпускает интересные устройства ПО к ним. Об этих гаджетах на Хабре пишут достаточно часто. Например, вот статья о Linux-смартфоне PinePhone c KDE Plasma Mobile. Эта же команда разрабатывает одноплатник с RISC-V чипом, а вот еще один одноплатник, с процессором RK3566.

Но речь сейчас не обо всех этих классных девайсах, а об умных часах PineTime, которые выпущены еще в 2019 году. Большинство смарт-часов через пару лет уже считаются морально устаревшими и прекращают получать обновления. Но только не в этом случае разработчики выпустили для девайса open-source прошивку.

Справедливости ради стоит сказать, что после выхода часы были скорее экспериментальной аппаратной платформой для коммьюнити, представители которого упражнялись в создании самых разных приложений. Один из проектов, InfiniTime, получил очень активное развитие и именно его решили выбрать в качестве официальной прошивки.

И сейчас версия InfiniTime 1.0.0 уже доступна, это стабильная версия операционной системы для часиков. ОС включает все необходимые для работы и быта компоненты:

  • Пульсометр.
  • Шагомер.
  • Умные часы.
  • Таймер.
  • Навигационное приложение.
  • Трекер активности.
  • Игрушки вроде клона 2048 и Pong.
  • Управление воспроизведением музыки и видео на смартфоне.


Кроме того, новая версия получила такие возможности:

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


Экран сенсорный, есть и физические кнопки. Часы подключаются к ПК или смартфону при помощи беспроводного модуля Bluetooth Low Energy. Подключить можно к Android или Linux-смартфону. Для Android используется Gadgetbridge, а для Linux Siglo или Amazfish.

Характеристики девайса:

  • Дисплей 1.3 дюйма, с разрешением 240 x 240 пикселей. IPS LCD RGB display with 65K colors
  • Чип Nordic Semiconductor nRF52832 с ARM Cortex-M4F 64 мГц
  • Память: 512 КБ Flash, 64 КБ RAM
  • Дополнительно: SPI NOR 4 МБ Flash
  • Батарея: 170 -180 мАч LiPo


В целом, отличные часы за свою цену, если учесть, что у них есть Bluetooth 5, пульсометр, шагомер и вибромотор. Что касается батареи, то ее хватает на 3-5 дней работы. Стабильная версия прошивки позволяет теперь использовать все возможности часиков в полной мере.

Подробнее..

Из песочницы Запуск ОС Андроид с SD-карты для устройств на процессоре Amlogic S912

26.10.2020 18:07:34 | Автор: admin

В статье детально, с приведением исходного кода, описывается работа, проведенная по переносу и запуску с SD-карты программной прошивки с ОС Андроид для устройств на процессоре Amlogic S912.


Мне нравятся миниатюрные компьютеры, выполненные по технологии система на чипе (SOC). За крошечные размеры и небольшое энергопотребление по сравнению с персональными компьютерами. Используя такие устройства, можно решать широкий круг задач. На миникомпьютеры можно установить как ОС Android (так делает большинство производителей данных "игрушек"), так и различные дистрибутивы Linux или Chrome OS.


Моя текущая работа это разработка приложений для Андроид. В этой работе очень желательны тесты на реальных устройствах на различных версиях системы. Есть у меня пара миникомпьютеров от компаний Rockchip и Amlogic, на которых я также выполняю свои тесты. Андроид, как операционная система, довольно динамично развивается и сейчас на рынке используются ее модификации от 4.4 до 10 версии. А на подходе уже Андроид 11-й версии.


Многие компании, занимающиеся разработкой телеприставок на базе Андроид, вынуждены иметь недолгий срок сопровождения свои детищ в виду быстрого развития как аппаратных, так и программных средств. Один из моих основных рабочих инструментов для тестов это приставка KM8P на процессоре S912 с двумя гигабайтами ОЗУ и предустановленной операционной системой Андроид версии 7.1. Время идет, и за пару-тройку лет на рынке последовательно появились версии 8.1, 9.0 и 10.0 ОС Андроид.


Очень хотелось бы потестировать свое приложение под этими самыми версиями. Но что делать? Или нужно покупать зверушки на новых процессорах и версиях Андроид, или заниматься самостоятельной адаптацией новых версий Андроида на имеющихся устройствах. Первый путь легок и прост: заплатив не очень большую сумму, проблема легко решается. Но легких путей мы не ищем, поэтому выбираем второй путь. Второй путь гораздо труднее, но интереснее. К тому же, и сам чип S912 является отличным 8-ядерным процессором, не намного уступающим по производительности новейшим процессорам Amlogic на чипе S905x.


Итак, был выбран второй вариант, как более интересный и отвечающий моим потребностям. Встал вопрос: а каким путем пойти? Текущая версия Андроид 7.1 под капотом имеет ядро Linux 3.14.29 и ПЗУ NAND на чипе SK Hynix H27UCG8T2ETR, для которого Amlogic разработала собственный драйвер aml_nftl_dev.ko.


Все новейшие версии Андроид базируются на ядре 4.9. И желательно использовать именно его. Однако, политика Amlogic такова, что последние несколько лет SDK Android компания предоставляет только юридическим компаниям, занимающимся производством устройств на базе чипов Amlogic.


Тем не менее, на просторах github'а можно найти исходники ядра 4.9 на основе SDK Android от Amlogic 2017-18 года. Например, git-репозитарий компании Khadas. Однако, дело, в том, что драйвер aml_nftl_dev для версии ядра 4.9 отсутствует. Что делать? Адаптировать данный драйвер для ядра 4.9? Но помимо адаптации драйвера, придется также править так называемое дерево устройств ядра. Это трудный путь.


Множество устройств на процессоре S912 имеет более современное ПЗУ с контроллером EMMC. К счастью, для обладателей таких устройств совсем недавно (в июне-июле 2020 года) появились прошивки на Андроид 9, собранные энтузиастами (ознакомиться можно здесь и здесь). Я не мог воспользоваться данными прошивками в виду отсутствия на моем устройстве чипа EMMC. Однако, прекрасно понимал, что имея на приставке слот для SD-карточки, для работы с которым используется все тот же драйвер MMC, что и для работы с микросхемой EMMC, можно попытаться использовать SD-карту вместо ПЗУ.


К сожалению, ситуация осложнялась тем, что Amlogic изначально не предусмотрел старт системы с SD-карты. Тем не менее, кое-что было. Amlogic реализовала возможность обновления прошивок с SD-карты. Эта и другие возможности были достигнуты компанией Amlogic путем существенной доработки загрузчика u-boot под свои нужды. В частности, имеется возможность запустить ядро системы с FAT-раздела SD-карты. Итак, было принято решение выяснить, можно ли адаптировать драйвер MMC для возможности старта с SD-карты. Я погрузился в изучение исходного кода драйвера.


Изучая исходный код, я выяснил, во-первых, что драйвер для монтирования загрузочного раздела ограничивается работой только с микросхемой EMMC, а остальные устройства игнорирует. А такими устройствами как раз является SDMMC-слот и SDIO-порт. А почему бы не изменить код так, чтобы драйвер не пропускал устройство SDMMC, а продолжал бы с ним работать, как с EMMC?


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


Получается, что разрешив драйверу работать с SDMMC, как с EMMC и записав таблицу разделов по заранее известному адресу на SD-карте, я смогу, таким образом, сымитировать EMMC и загрузить систему с SD-карты! Подумал, почему бы не сделать утилиту, которая будет записывать таблицу разделов в нужном формате и при необходимости проверять ее корректность. Сказано сделано. Тем более, что сделать ее было несложно, благо практически вся инфраструктура уже была описана в исходном коде драйвера. Исходный код утилиты размещен на github'е, репозиторий amlpt. Утилита создана в ОС Ubuntu. Но, думаю, при необходимости, ее не сложно будет перенести и на Windows.


Для начала нужно заполнить параметры таблицы разделов в файле mmcparts_a9.c, указав там имена, смещения, размеры и тип разделов. Для обычных разделов указывается тип 0x1, для разделов типа cache 0x2, а для разделов типа data 0x4. За начальное смещение первого раздела я взял значение 0x2800000 (40Мб). Далее заполнил имена, размеры и типы разделов в структурах partitions согласно таблице разделов из дерева устройств. Для 9-го Андроида таких разделов насчиталось 17.


Заполнив данные в файле mmcparts_a9.c, создаем утилиту для записи таблицы разделов, запустив скрипт make_amlptwrt.sh. Данный скрипт создает исполняемый файл amlptwrt, с помощью которого можно сформировать двоичный файл mmc_parts.bin. Это и есть наша таблица разделов, которую читает драйвер MMC. Аналогично запускаем скрипт make_amlptrdr.sh для создания утилиты чтения таблицы разделов amlptrdr, с помощью которой мы можем проверить правильность заполнения данной таблицы. После запуска amlptrdr в консоли отобразится таблица разделов с именами, смещениями и размерами в мегабайтах. Примерно так:


Таблица разделов
@>:~/AML/amlpt$ ./amlptrdr
[mmc_verify_partition_tbl] mmc read partition OK!
show_mmc_partitions
[disk p01] logo offset 40 Mb, size 8 Mb
[disk p02] recovery offset 48 Mb, size 24 Mb
[disk p03] misc offset 72 Mb, size 8 Mb
[disk p04] dtbo offset 80 Mb, size 8 Mb
[disk p05] cri_data offset 88 Mb, size 8 Mb
[disk p06] rsv offset 96 Mb, size 16 Mb
[disk p07] metadata offset 112 Mb, size 16 Mb
[disk p08] vbmeta offset 128 Mb, size 2 Mb
[disk p09] param offset 130 Mb, size 16 Mb
[disk p10] boot offset 146 Mb, size 16 Mb
[disk p11] tee offset 162 Mb, size 32 Mb
[disk p12] vendor offset 194 Mb, size 130 Mb
[disk p13] odm offset 324 Mb, size 128 Mb
[disk p14] system offset 452 Mb, size 1350 Mb
[disk p15] product offset 1802 Mb, size 128 Mb
[disk p16] cache offset 1930 Mb, size 1120 Mb
[disk p17] data offset 3050 Mb, size 4050 Mb

Для того, чтобы драйвер MMC заработал с устройством SDMMC, я внес два небольших исправления в исходный код драйвера, в файл drivers/amlogic/mmc/emmc_partitions.c:


а) Во-первых, разрешаем драйверу работать с устройствами, отличными от EMMC. Для этого меняем функцию is_card_emmc следующим образом:


static int is_card_emmc(struct mmc_card *card) {     //struct mmc_host *mmc = card->host;     // emmc port, so it must be an eMMC or TSD      //if (!strcmp(mmc_hostname(mmc), "emmc"))         return 1;     //else     //    return 0;     //return mmc->is_emmc_port;}

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


б) Определяем смещение, по которому будет читаться таблица разделов. Правку делаем в функции mmc_read_partition_tbl:


 //start_blk = get_reserve_partition_off(card);         start_blk = MMC_BOOT_PARTITION_SIZE + MMC_BOOT_PARTITION_RESERVED;

Если посмотрим на исходный код драйвера, то сумма констант MMC_BOOT_PARTITION_SIZE + MMC_BOOT_PARTITION_RESERVED равна 36 Мб. Следует отметить, что данные правки подходят для моего варианта, когда в устройстве отсутствует чип EMMC или в дереве устройств он отключен. Для других случаев придется придумывать более корректный вариант правок.


Итак, смещение, по которому будет записана таблица разделов на SD-карте равна 36 Мб. Для того, чтобы разместить нашу таблицу разделов, созданную утилитой amlptwrt, на SD-карте достаточно выполнить команду:


// 36M = 37748736 bytes = 73728 sectors         sudo dd if=mmc_parts.bin of=/dev/sdb seek=73728 bs=512

При этом предполагается, что /dev/sdb это SD-карта.


Далее компилируем ядро, создаем boot.img с нулевым initrd и примерно такими параметрами ядра:


 root=/dev/mmcblk0p14 rootfstype=ext4 rootwait

Вспомним, что u-boot от Amlogic умеет стартовать ядро Linux c SD-карты с раздела FAT. Создаем на SD-карте в самом начале раздел FAT размером 32 Мб. Этого вполне достаточно для размещения нашего boot.img и dtb.img. В дереве устройств dtb.img необходимо отключить EMMC, чтобы нашей SD-карте было присвоено имя /dev/mmcblk0. Или не отключать, но тогда нужно будет изменить в boot.img параметры ядра, чтобы ядро смогло успешно подключить системный раздел, который в данном случае будет иметь имя /dev/mmcblk0p14.
И, как заключительная часть марлезонского балета, осталось записать разделы Андроид-прошивки на SD-карту. Для этого распаковываем прошивку и записываем на SD-карту подходящие разделы согласно смещениям в таблице разделов:


Запись разделов на SD-карту
// logosudo dd if=logo.PARTITION of=/dev/sdb bs=1M seek=40 conv=sync,fsync status=progress // recovery sudo dd if=recovery.PARTITION of=/dev/sdb bs=1M seek=48 conv=sync,fsync status=progress // misc sudo dd if=/dev/zero of=/dev/sdb bs=1M seek=72 count=8 conv=sync,fsync status=progress // dtbo sudo dd if=dtbo.PARTITION of=/dev/sdb bs=1M seek=80 conv=sync,fsync status=progress // cri_data sudo dd if=/dev/zero of=/dev/sdb bs=1M seek=88 count=8 conv=sync,fsync status=progress // rsv sudo dd if=/dev/zero of=/dev/sdb bs=1M seek=96 count=16 conv=sync,fsync status=progress // metadata sudo dd if=/dev/zero of=/dev/sdb bs=1M seek=112 count=16 conv=sync,fsync status=progress // vbmeta sudo dd if=vbmeta.PARTITION of=/dev/sdb bs=1M seek=128 conv=sync,fsync status=progress // param sudo dd if=/dev/zero of=/dev/sdb bs=1M seek=130 count=16 conv=sync,fsync status=progress // boot sudo dd if=boot.PARTITION of=/dev/sdb bs=1M seek=146 conv=sync,fsync status=progress // tee sudo dd if=/dev/zero of=/dev/sdb bs=1M seek=162 count=32 conv=sync,fsync status=progress// vendorsudo dd if=vendor.img of=/dev/sdb bs=1M seek=194 conv=sync,fsync status=progress // odmsudo dd if=odm.img of=/dev/sdb bs=1M seek=324 conv=sync,fsync status=progress // systemsudo dd if=system.img of=/dev/sdb bs=1M seek=452 conv=sync,fsync status=progress // productsudo dd if=product.img of=/dev/sdb bs=1M seek=1802 conv=sync,fsync status=progress

Те разделы, которые отсутствуют в прошивке, я просто заполнял нулями. Некоторые разделы, такие как system или vendor и некоторые другие, могут являться sparse-разделами. Их предварительно необходимо преобразовать в обычные разделы:


simg2img system.PARTITION system.img

С разделами cache и data нужно поступить немного по-другому. Смотрим нашу таблицу разделов, созданную утилитой amlptwrt, и с помощью программы fdisk создаем соответствующие разделы с нужными смещениями и размерами на SD-карте и форматируем их в файловую систему ext4:


sudo mkfs.ext4 /dev/sdb2 sudo mkfs.ext4 /dev/sdb3

После форматирования, с помощью той же утилиты fdisk, удаляем уже ненужные разделы /dev/sdb2 и /dev/sdb3.


Чтобы загрузчик u-boot распознал, что нужно загрузиться именно с SD-карты, размещаем в FAT-разделе файл aml_autoscript. Сам файл aml_autoscript может быть создан с помощью утилиты mkimage из простого текстового файла следующего содержания:


 if mmcinfo; then fatload mmc 0 ${loadaddr} boot.img; fatload mmc 0 ${dtb_mem_addr} dtb.img; bootm; fi;

Вот и все, что необходимо для переноса прошивки с Андроид на борту на SD-карту.


Несколько прошивок, которые были сделаны по данному методу, опубликованы в соответствующей теме на форуме 4PDA. Если что-то непонятно, задавайте вопросы в комментариях. Чем смогу помогу.


За сим позвольте откланяться и удачи всем в переносе прошивок!

Подробнее..

Перевод Linksys WRT54G роутер, случайно ставший легендарным

02.02.2021 12:18:59 | Автор: admin

В мире, где роутеры всё больше напоминают перевёрнутых пауков, чем предметы, которые бы хотелось видеть в своей гостиной, есть только несколько устройств, которые можно было бы назвать знаменитыми. Примерами подобного могут быть AirPort Стива Джобса и mesh-роутеры Eero. Но лавры победителя в этой категории получает модель роутера Linksys, которой уже исполнилось уже почти 20 лет, и всё благодаря изначально незадокументированной особенности, ставшей чрезвычайно популярной у определённой пользовательской базы. Сегодня мы поговорим о сине-чёрном образце маршрутизатора беспроводного доступа Linksys WRT54G. Именно этот роутер показал миру, на что должны быть способны беспроводные маршрутизаторы.

1988 год


Linksys был основан двумя иммигрантами из Тайваня Джени и Виктором Цао в 1988 году. По информации в профиле 2004 года на Inc., компания задумывалась как посредник между изобретателями и производителями на рынке Тайваня, но в 1990-х сама занялась производством оборудования, со временем придя к рынку домашних сетей и начав доминировать на нём в начале 2000-х.


Хотя сегодня он не особо впечатляет, однако роутер EtherFast помог Linksys стимулировать создание нового рынка домашних сетей. И это было ещё ДО того, как WiFi стал играть важную роль.

Как чёрный и синий стали неофициальными цветами домашних сетей в начале 2000-х


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

Однако в конце 1990-х о роутерах совершенно никто не знал, этого рынка ещё не существовало на радарах многих компаний-изготовителей сетевого оборудования, потому что необходимость сетей ограничивалась офисами. Это означало, что установка роутера была и чрезвычайно дорогой, и невозможной для простых смертных.

Подобное положение дел помогает компаниям, находящимся на периферии, недостаточно больших, чтобы ловить крупную рыбу, но достаточно мелких, чтобы увидеть для себя новые возможности. На протяжении первого десятка лет существования компании Джени и Виктор Цао пользовались такими возможностями, при сдвигах рынков улучшая позиционирование своего сетевого оборудования.

В начале 90-х оборудование Linksys приходилось продавать с собственными драйверами. Однако когда появилась Windows 95, сетевые возможности были уже встроены в неё. Это означало, что совершенно внезапно пропало основное препятствие к получению доли рынка компанией Linksys: возник увеличивающийся спрос на её сетевые адаптеры, устанавливаемые внутрь десктопов и ноутбуков.

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

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

Когда в конце 90-х начался постепенный расцвет широкополосного Интернета, имевшего гораздо большую цену, чем дайлап, Виктор понял, что люди захотят подключить все свои домашние компьютеры к одной линии, говорится к профиле Джени и Виктора на Inc. Для этого им бы понадобился роутер высокотехнологичный разветвитель, позволяющий подключать к одному модему несколько компьютеров.

Повторюсь, компании, с которыми конкурировала Linksys, были сосредоточены на рынке, где роутеры стоили почти столько же, сколько и сам компьютер. Однако Виктор нашёл идеальную нишу: роутер за 199 долларов, поставляемый с простым в настройке ПО и достаточно понятный для простых смертных. К тому же он имел уникальный дизайн, которым прославилась Linksys смесь синего и чёрного пластика с рядом крошечных светодиодов спереди.

В обзоре кабельного/DSL-роутера EtherFast PC Magazine замечает, что Linksys сделала гораздо больше, чем просили пользователи.

Цена в 200 долларов стала бы прорывом для роутера с двумя портами Ethernet, однако Linksys уместила в эту коробку гораздо больше возможностей, писал рецензент Крейг Эллисон. Роутер, способный работать со скоростями до 100 мегабит, может похвастаться четырьмя портами и теоретически способен работать с сотнями IP-адресов.

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

Роутер приобрёл огромный успех, благодаря которому Linksys поднялась на вершину зарождающегося рынка. На самом деле, единственной ошибкой в реализации роутера было отсутствие поддержки беспроводного соединения. Однако громкое имя Linksys означало, что как только она появится, у нового устройства будет готовая аудитория, которую порадует его низкая цена и простота пользования.

Особенно популярным стал один роутер, однако причины этого оказались для Linksys неожиданными.

500 миллионов долларов


За такую сумму гигант в производстве сетевого оборудования Cisco приобрёл Linksys в 2003 году. Поглощение произошло в то время, когда Linksys сама зарабатывала полмиллиарда долларов в год, и быстро росла в основном за счёт успеха своих роутеров. В интервью NetworkWorld Виктор Цао утверждал, что конфликтов между роутерами Linksys и сетевой инфраструктурой Cisco не существует. Они решали свои задачи по-разному, в чём Cisco вскоре убедится на собственном горьком опыте.


WRT54G был не просто дешёвым его можно было хакать.

Как случайная особенность беспроводного роутера Linksys превратила скучный роутер в устройство для фанатов


Во многих смыслах серия роутеров WRT54G стала чем-то вроде Nintendo Entertainment System мира беспроводных роутеров. Появившись примерно на заре истории популярности беспроводных роутеров, она продемонстрировала гораздо большую гибкость, чем задумывалось производителем. Хоть она и не была единственной, однако находилась в огромном количестве домов по всему миру.

Несмотря на гораздо меньшую славу, его успех был сравним с современным ему Motorola RAZR его можно было найти практически повсюду, в домах и мелких компаниях по всему миру. Несмотря на своё страшное название, WRT54G был тем роутером, который покупали люди, нуждающиеся в беспроводном роутере.

И высока вероятность того, что он по-прежнему используется во многих местах, несмотря на устаревшие стандарты безопасности и чрезвычайно древний внешний вид. (Вспоминается история компьютера Amiga, управлявшего системами отопления и вентиляции целого школьного округа.)

Однако причина, по которой серия WRT54G продержалась так долго, несмотря на использование беспроводного протокола, фактически устаревшего 12 лет назад, может заключаться в его особенности, которая изначально не была задокументирована. Эта особенность сохранилась, несмотря на все сложности, вызванные поглощением компании. Случайно или нет, но в WRT54G скрывалось нечто фундаментальное для встроенной прошивки роутера: ПО на основе Linux.

В этом и заключалась проблема Linksys должна была выпустить исходный код своей прошивки под лицензией GNU General Public License, требующей распространять производное ПО с теми же условиями, что и ПО, на основании которого оно было создано.

Эндрю Миклас, участвовавший в создании списка рассылки о ядре Linux, рассказал, что ему лично довелось связаться с сотрудником компании и убедиться, что ПО было основано на Linux но со временем этот сотрудник прекратил с ним общаться.

Миклас сообщил, что его интерес к файлу прошивки частично был вызван стремлением к улучшению поддержки в Linux относительно нового тогда стандарта 802.11g, который поддерживался устройством.

Я знаю, что некоторые компании-производители беспроводных устройств сомневались, стоит ли выпускать драйверы в open source, потому что беспокоились, что параметры их радиооборудования можно будет изменять вне пределов спецификации. Однако если драйверы уже написаны, разве есть какое-то техническое препятствие к тому, чтобы их нельзя было просто рекомпилировать под оборудование Intel и выпустить как бинарные модули?

Миклас обнаружил нечто интересное, то, чего в ПО быть не должно. Это был недосмотр со стороны Cisco, которую ожидал неприятный сюрприз, связанный с популярным продуктом, продававшимся всего несколько месяцев. По сути, произошло следующее: один из поставщиков, похоже, использовал прошивку на основе Linux в чипах, поставляемых Broadcom, и не сообщил об этом Linksys, которая в рамках поглощения передала это ПО Cisco.

В колонке 2005 года для Linux Insider юрист Хизер Микер, специализирующаяся на проблемах интеллектуальной собственности и ПО с открытым исходным кодом, сообщила, что Cisco было довольно трудно разобраться во всём этом самостоятельно:

Из этого дела можно сделать вывод о сложности контроля разработки ПО в нашу эпоху вертикальной разобщённости. Cisco ничего не знала об этой проблеме, несмотря на проверку интеллектуальной собственности Linksys перед покупкой. Однако Linksys, вероятно, тоже ничего не знала о проблеме, потому что покупала чипсеты у Broadcom, а Broadcom также, вероятно, не знала, поскольку, в свою очередь, вывела разработку прошивки чипсета на аутсорс иностранной компании.

Чтобы выявить проблему, Cisco пришлось бы провести расследование вглубь на три уровня интеграции продуктов. Любой специалист по слияниям и поглощениям скажет вам, что это попросту невозможно. Дело не в неряшливости или нерадивости, дело в непрозрачности.

Венчурный капиталист, активист open source и бывший лидер проекта дистрибутива Debian Linux Брюс Перенс рассказал LinuxDevices, что не стоит винить в произошедшем Cisco, однако она всё равно столкнулась с проблемами соответствия требованиям лицензии open source.

Обычно субподрядчики не особо усердно докладывают клиентам об их обязанностях по лицензии GPL, рассказывает Перенс. (Также он добавил, что, несмотря на предложение помощи Cisco, ответа он не дождался.)

Как бы то ни было, информация о роутере с прошивкой в open source всплыла на поверхность, и пост Микласа быстро привлёк внимание сообщества фанатов. Автор поста на Slashdot сразу смог увидеть открывшиеся возможности: Это может быть интересным: вероятно, появится возможность создания суперкрутой прошивки для точки доступа с IPsec, нативной поддержкой ipv6 и т.д.!

Когда читатели Slashdot узнали об этом, они начали выдвигать требования.

Примерно спустя месяц после выпуска поста на Slashdot компания без особого энтузиазма выпустила свою open-source-прошивку.


WRT54G без корпуса. Благодаря Linux-прошивке устройство стало мишенью как для программных, так и для аппаратных хаков.

Хакерам открылся целый мир возможностей, а сторонние разработчики быстро добавили в оригинальное оборудование функции, о которых никогда не задумывался производитель. По сути, это был бытовой роутер, который можно было взломать и заставить выдавать гораздо более мощный беспроводной сигнал, чем это допускалось Федеральной комиссией по связи, превратить его в SSH-сервер или в VPN для домашней сети. Был и ещё более яркий пример роутер можно было превратить в мозг робота.

Также он стал фундаментом для полезного открытого ПО, например, OpenWrt и Tomato. То есть возникла целая инфраструктура, позволявшая расширить возможности роутера намного больше, чем допускалось его производителем.

По сути, Cisco под угрозой судебного иска оказалась вынужденной выпустить прошивку на основе Linux под лицензией GPL, но не была в восторге от того, что устройство, успех которого позволил ей наконец попасть в дома пользователей, предоставляло им гораздо большие возможности.

Как писал Lifehacker в 2006 году, это был идеальный способ превращения своего роутера за 60 долларов в роутер за 600 долларов. То есть, теоретически, успех устройства на рынке обернулся для Cisco убытком.

Поэтому в результате компания провела апгрейд роутера, который по сути стал даунгрейдом: устранила Linux-прошивку, заменив её проприетарным аналогом, урезав объём ОЗУ и ПЗУ, что усложнило замену прошивки на сторонние версии. Это разгневало пользователей, и Cisco (вероятно, осознав свой провал) выпустила Linux-версию роутера под названием WRT54GL, в которой восстановила удалённые спецификации.

Эту модель и сегодня можно найти на Amazon, и она по-прежнему имеет страницу поддержки на сайте Linksys. Несмотря на то, что её максимум всего 54 мегабита/с по беспроводному каналу, довольно жалкий показатель по сравнению с современными роутерами по той же цене, она по-прежнему продаётся.

Вся неразбериха с GPL наносила урон ещё годы спустя после обнаружения проблемы с прошивкой по итогу Cisco пришлось заплатить Free Software Foundation. Однако это, в конечном итоге, создало имидж брэнду Linksys. Сегодня компания продаёт целую линейку чёрно-синих роутеров, сохраняющих поддержку открытых прошивок. (Однако стоят они намного дороже, чем WRT54G.)

Мы хотим, чтобы эта книга расширила аудиторию платформы WRT54G и использования встроенных устройств в целом, раскрывая потенциал, который способна предложить эта платформа, цитата из введения книги 2007 года Linksys WRT54G Ultimate Hacking. Авторам книги сыграло на руку то, что WRT54G был встроенной системой со возможность хакинга, при этом очень популярной и использующейся для множества различных целей, как развлекательных, так и практичных. Да, хакинг устройства стал настолько распространённым, что выпустили целую 400-страничную книгу, посвящённую этой теме.

Надо внести ясность большинство людей, покупавших WRT54G в Best Buy, скорее всего, не волновало то, что прошивка находится в open source. Но это решение создало своего рода культ устройства. Последователи этого культа помогали поддерживать длительный интерес к устройству и среди тех, кто был далёк от хакинга.

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


В статье 2016 года на Ars Technica сообщалось, что роутер по-прежнему приносил миллионы долларов в год компании Linksys, которая к тому времени была продана Belkin. Несмотря на то, что модель и близко не была столь же мощной, как её более дорогие аналоги, WRT54GL (да, именно версия с Linux) сохранила свою аудиторию и на втором десятке лет, потому что воспринималась как чрезвычайно надёжная и простая в использовании.

Мы продолжаем делать её, потому что люди продолжают её покупать, говорил в то время продакт-менеджер Винс ЛаДука, заявивший, что роутер продолжает продаваться потому, что детали для него продолжают производить.

Выше я сказал, что WRT54G во многих смыслах стал аналогом Nintendo Entertainment System для беспроводных роутеров. И я считаю, что особенно справедливо это в контексте его довольно впечатляющей загробной жизни, как и у NES. Несмотря на свой солидный возраст и неподходящий для гостиной внешний вид, он хорошо продавался многие годы после истечения срока годности, в немалой степени и из-за использования открытых драйверов.

Если ваша пользовательская база просит вас что-то сохранить, то вам стоит к этому прислушаться.



На правах рекламы


Виртуальные серверы с защитой от DDoS-атак, скоростью интернета в 500 Мегабит, новейшим железом и возможностью устанавливать ОС со своих ISO, даже MikroTik RouterOS. Всё это про наши эпичные серверы. Максимальная конфигурация 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe! Поспешите заказать.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru