Восстановление D-link DVG-N5204SP через UART
Тема прошивок роутеров через UART интерфейс сильно изъезжена, изжевана, но я не смог найти информации именно по своему роутеру, поэтому думаю, что данная тема будет полезна, тем более, что на форумах есть несколько вопросов по этому поводу, так и оставшиеся без ответа.
Попал мне в руки сабжевый роутер, попал на халяву, так как «что-то не работало».
Принеся домой, обнаружил, что роутер наотрез отказывается поднимать LAN порты, при том, что остальными индикаторами при загрузке он подмаргивает, и WAN порт поднимает. Сброс кнопкой Reset не помог, хотя лампочки вели себя так же, как при ресете.
Ну что-ж, халява есть халява, и уж очень хотелось использовать этот роутер для выхода в интернет через 3G\4G операторские флэшки в загородном доме. Да ещё и с возможностью поднятия на нём SIP Мегафона ради интереса.
Начитавшись мануалов, понял, что ни один из описанных способов входа в Emergency mode не работал, хотя при включении питания и удержании кнопки Reset роутер явно входил в какой-то режим, в котором нормально поднимались LAN порты, но описанные в мануалах сети 192.168.80.20/24, 192.168.1.2/24, 192.168.0.2/24, 192.168.8.10/24 не подходили, ни один адрес не отвечал (192.168.80.21, 192.168.1.1, 192.168.0.1, 192.168.8.254).
Я подумал, что настало время открыть эту железку, чтобы посмотреть на внутренности:
Был замечен уже распаянный UART, в нижнем левом углу, над светодиодом WAN, оставалось только подцепить адаптер и использовать.
В местном магазине был куплен DCU-15 кабель на PL2303 за 30р, разобран и припаян к нужным пинам (на пайку не ругаться, всё делалось китайским газовым паяльником за 150р, который еле греет, просто захотелось дать и ему шанс прожить жизнь не зря):
Мануалов по подключению телефонных дата-кабелей к портам UART полно, поэтому не буду ещё раз описывать.
Для соединения использовал Putty, адекватная передача завязалась на скорости 38400 бод, её необходимо выставлять и в Putty и в настройках USB-COM порта:
При включении, роутер бодро выдал список, спрашивая меня, что я хотел бы сделать:
DDR DRAM 32 MB @ 195 MHz,SPI FLASH 8 M
—Octtel(RTL89xxB)at 2011.05.16-13:42+0800 version 1.1.26.0 [16bit](390MHz)
—Wireless regDomain—MAC Address: 84:c9:b2:xx:xx:xx
Press ‘i’ to update system image.
Press ‘k’ to update kernel image.
Press ‘r’ to update root fs image.
Press ‘l’ to update loader.
Press ‘c’ to change target IP
Press ‘t’ to change TFTP server IP
Press ‘z’ to change network MAC number config.
Press ‘m’ to change MAC and SN config.
Press ‘y’ to change wireless regDomain config.
В сети много мануалов по обновлению\восстановлению прошивок для D-link DIR-300 и подобных, там описывается восстановление прошивки непосредственно загружая с tftp сервера, но ни один пункт апдейта этого роутера не запрашивал нужный файл (файл прошивки, скачанный с FTP D-link’a имеет расширение .pack, и уже ждал закачки на tftp сервере).
Впал я временно в уныние, и подумал, может смогу чего выудить из логов начальной загрузки роутера. Если кто хочет посмотреть, выкладываю на известный ресурс:
Спойлер для лога почему-то не захотел работать, если кто подскажет почему, буду благодарен, и перенесу его в статью.
В логах не нашел ни какого упоминания о доступных сетях.
После полной загрузки устройства появилась возможность пользоваться вводом команд, что и было реализовано:
# ifconfig
br0 Link encap:Ethernet HWaddr 84:C9:B2:XX:XX:XX
inet addr:192.168.8.254 Bcast:192.168.8.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:64
TX packets:41 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:23275 (22.7 KiB) TX bytes:0 (0.0 B)
eth0 Link encap:Ethernet HWaddr 84:C9:B2:XX:XX:XX
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:41 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:128
RX bytes:0 (0.0 B) TX bytes:1722 (1.6 KiB)
Interrupt:15
eth1 Link encap:Ethernet HWaddr 84:C9:B2:XX:XX:XX
inet addr: 192.168.8.254 Bcast:192.168.8.255 Mask:255.255.255.252
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6320 errors:0 dropped:0 overruns:0 frame:0
TX packets:1562 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:128
RX bytes:1176595 (1.1 MiB) TX bytes:1301150 (1.2 MiB)
Interrupt:15
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:14 errors:0 dropped:0 overruns:0 frame:0
TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1100 (1.0 KiB) TX bytes:1100 (1.0 KiB)
Как видно, интерфейсы br0 и eth1 имеют одинаковые IP, но в случае с eth1 сконфигурирована обычная линковая сеть \30.
Решено было подключить кабель к WAN порту для проверки этой сети. Роутер поднял порт, а в консоли весело вывел:
NCS: Connection WAN established, IP = 192.168.8.254 Subnet Mask = 255.255.255.252
С мыслями «ну уж теперь ты ни куда от меня не спрячешься», я полез забивать в сетевую карту 192.168.8.253/30
Все 4 отправленных пакета не вернулись живыми, но роутер в консоли откликнулся:
NCS: Icmp-Smurf attack detected, SA=192.168.8.253 DA=192.168.8.254
NCS: Icmp-Smurf attack detected, SA=192.168.8.253 DA=192.168.8.254
NCS: Icmp-Smurf attack detected, SA=192.168.8.253 DA=192.168.8.254
NCS: Icmp-Smurf attack detected, SA=192.168.8.253 DA=192.168.8.254
Следующая попытка по-привычке зайти через telnet увенчалась успехом, сразу же полез в браузер запускать веб-морду. Запустилась. Радости не было предела. Теперь предстояло попытаться отресетить его через интерфейс, прошивку эти роутеры соглашаются заливать через tftp только с IP 192.168.8.56, поэтому на данном этапе думать о прошивке было рано.
Что странно, так это настройки его WAN интерфейса, которые он светил:
После ресета через веб-морду роутер перестал светиться через WAN, и LAN интерфейсы тоже не поднимались. Зато поднялся WLAN.
Было решено пустить ему в лоб:
# ifconfig br0 down
# ifconfig br0 up
После подключения кабеля в LAN порт лампочка весело заморгала.
Роутер был успешно прошит, подключен к интернету через 3G модем. На нём был поднят SIP Мегафона, мечты сбываются.
Потом его ждёт пожизненный отдых на чистом воздухе за городом, будет охранять участок веб-камерой.
Спасибо за внимание! Буду рад адекватной критике.
Прошивка роутера через uart
Процедура обновления
Обновление устройств XM было рассмотрено в отдельной статье, здесь же я поделюсь дополнительными сведениями, которые могут оказаться полезными при восстановлении, когда что-то пошло не так (отключили свет в процессе обновления, была залита несовместимая прошивка или был другой сбой).
Обновление устройства можно произвести двумя способами: устройство самостоятельно скачивает прошивку и обновляется, или пользователь находит свежую версию, загружает через Web-интерфейс или CMS, и далее обновление идёт по тому же сценарию.
Для минимизации проблем, в прошивке содержится специальный файл-описатель InstallDesc в котором содержится идентификатор платформы «Hardware», по которому устройство проверяет, подходит ли ему загружаемая прошивка, сравнивая его содержимое с файлом ProductDefinition внутри прошивки.
Также есть отдельное поле «Vendor», которое обычно содержит «General».
Поле «Vendor» введено для производителей оборудования, которые помимо собственно сборки, добавляют также дополнительные функции, особые параметры работы или просто меняют заводское распределение памяти. Таким образом, осуществляется простейшая защита копирайта, а также от заливки несовместимой прошивки.
Если совпали оба этих поля, запускается процедура обновления, в противном случае выдаётся сообщение об ошибке.
Прошивка представляет из себя переименованный .zip архив, который содержит несколько .img файлов — разделов дампа со специальным заголовком в 64 байта, а также уже упоминаемый файл-описатель InstallDesc. Пример типового содержимого прошивки:
InstallDesc
u-boot.bin.img
u-boot.env.img
romfs-x.cramfs.img
user-x.cramfs.img
web-x.cramfs.img
custom-x.cramfs.img
У регистраторов ещё есть раздел с логотипом logo-x.cramfs.img
Обновление осуществляется по разделам, поэтому в случае прерывания процедуры обновления, повреждённым оказывается лишь один раздел.
u-boot.bin — это сам загрузчик u-boot, прошивается первым и почти всегда остаётся целым благодаря малым размерам. Помимо процедуры запуска, u-boot содержит также процедуры вывода на экран логотипа (у регистраторов), а также — самое важное — скрипты восстановления модулей прошивки.
Именно поэтому мы и видим на экране сбойного устройства «матрас» или логотип производителя.
Если логотип не пропадает, а устройство не переходит в рабочий режим, значит повреждён один из блоков прошивки, но сам загрузчик цел, и устройство можно относительно просто и недорого восстановить.
При повреждённом загрузчике мы получаем полный «кирпич», описываемый здесь метод уже не применим, восстанавливать придётся на программаторе, в данной статье его рассматривать не будем.
Подключаем UART
Общение с загрузчиком производится из консоли командами, которые подаются через специальный отладочный интерфейс — UART. В качестве консоли (терминала) удобнее использовать Putty (Kitty), хотя сгодится даже встроенный в Windows гипертерминал.
Чтобы иметь возможность слать команды из терминала, нам понадобится USB-UART преобразователь.
Самый распространённый — это преобразователь на базе микросхемы Prolific PL-2303HX. Для восстановления одного устройства его будет достаточно, но если вы профессионально занимаетесь ремонтом, лучше приобрести преобразователь на базе микросхемы FTDI FT232R, он более надёжный и не так подвержен помехам в линии.
Подключив UART преобразователь, получим в системе дополнительный последовательный COM порт, номер которого нужно узнать в диспетчере устройств. Этот номер указываем в программе-терминале, а также задаём другие параметры порта: скорость 115200, чётность нет, стоп. бит 1.
Для подключения соединяем минусовой («земляной») провод устройства с общим (GND) проводом преобразователя, RX устройства соединяем с TX преобразователя, а RX, соответственно, с TX.
Включаем устройство и наблюдаем такую картинку:
Это лог загрузки. На короткое мгновение на экране мелькнёт приглашение Press Ctrl+C to stop autoboot. Нужно поймать этот момент и нажать комбинацию клавиш Ctrl+C, после чего мы попадаем в командный интерфейс загрузчика.
Даём команду printenv , это выведет на экран переменные окружения загрузчика и сообщит нам дополнительную информацию о подопытном.
Нас пока интересуют два параметра:
ipaddr=192.168.1.10 — IP адрес устройства
serverip=192.168.1.107 — IP адрес нашего компьютера
их можно изменить командой setenv или подставить компьютеру IP адрес из serverip на время восстановления.
TFTP сервер
Поиграв с командами, вероятно, вы захотите пойти дальше и восстановить устройство.
Для этого нам понадобится ещё одна программа — TFTP сервер, я рекомендую tftpd32.
Устанавливаете его и настраиваете согласно картинке.
Бэкап — наше всё
Теперь подключаем нашу многострадальную камеру/регистратор сетевым кабелем к той же сети, что и компьютер с программой терминала и TFTP сервером, запускаем tftp сервер
Перед экспериментами обязательно нужно сделать резервную копию (дамп). Для этого нужно узнать размер flash памяти устройства. В этом нам поможет команда sf probe 0 .
xmtech # sf probe 0
8192 KiB hi_fmc at 0:0 is now current device
Отсюда видно, что размер флеши — 8192кб, что составляет 0x800000h в шестнадцатеричной системе. (Для флеши 16384кб это число будет 0x1000000h).
Ещё понадобится узнать адрес доступной оперативной памяти, чтобы скопировать дамп в память или загрузить туда блоки. Дайте команду printenv и посмотрите переменную bootcmd= . В самом конце всегда присутствует команда bootm и адрес памяти. В нашем случае bootm 0x82000000 (бывают также 0x42000000)
Тогда команды для резервной копии будут такими:
| setenv serverip 192.168.1.101 | установка IP адреса нашего компьютера (не обязательно, если уже задали ему IP из serverip) |
| setenv ipaddr 192.168.1.10 | изменение IP адреса устройства (не обязательно, если находится в той же подсети, что и комп) |
| sf probe 0 | Обращение к SPI флеши |
| sf read 0x82000000 0x0 0x800000 | Копирование содержимого flash в оперативную память |
| tftp 0x82000000 dump.bin 0x800000 | Передача дампа на tftp сервер |
После чего в папке tftp сервера появится файл dump.bin, содержащий полную резервную копию.
Восстановление
Теперь понадобится файл прошивки под наше устройство. Надеюсь, вы записали номер устройства из окошка Info, когда устройство ещё работало? Если нет, подобрать подходящую прошивку можно по фото устройства, написав комментарий к статье или написав в наш канал в Telegrem.
Скачиваем прошивку, открываем архиватором и извлекаем все файлы в папку tftp сервера (у меня r:\tftp).
Теперь осталось немного, даём в консоли следующие команды:
run dc
run du
run dr
run dw
После чего перезагружаем командой reset .
Обычно это позволяет восстановить работоспособность в случае порчи одного из модулей. Также может понадобится стереть все настройки (см. следующий абзац)
Если файлы не грузятся с tftp сервера (в консоли циклические попытки), то скорее всего мешает брандмауэр Windows — отключите его или добавьте tftpd32 в исключения.
Сброс пароля
Бывают ситуации, когда пароль администратора утерян, но нужно получить доступ к устройству с целью изменения его настроек. В этой ситуации тоже поможет преобразователь USB-UART, с той лишь разницей, что в этом случае не требуется tftp сервер.
Повторяем те же действия из раздела «Подключаем UART», включая команду printenv.
Внимательно изучаем её вывод, обратив внимание на содержимое переменной bootargs
В нашем примере это будет вывод от камеры 00018510
bootargs=mem=39M console=ttyAMA0,115200 root=/dev/mtdblock1 rootfstype=cramfs mtdparts=hi_sfc:320K(boot),3520K(romfs),2560K(user),1152K(web),320K(custom),320K(mtd)
320K(boot),3520K(romfs),2560K(user),1152K(web),320K(custom),320K(mtd)
Запускаем калькулятор Windows, переводим его в режим программиста и начинаем подсчёт. Для этого переключаем калькулятор в режим dec, переводим мегабайты и килобайты в байты (килобайты умножаем на 1024, а мегабайты — на 1048576), складываем полученные значение и переключаем калькулятор в режим hex.
Получаем следующие таблички:
Размеры mtd разделов
320K(boot) 327680 50000h
3520K(romfs) 3604480 370000h
2560K(user) 2621440 280000h
1152K(web) 1179648 120000h
320K(custom) 327680 50000h
320K(mtd) 327680 50000h
Адреса mtd разделов
0x000000-0x050000 : «boot»
0x050000-0x3c0000 : «romfs»
0x3c0000-0x640000 : «user»
0x640000-0x760000 : «web»
0x760000-0x7b0000 : «custom»
0x7b0000-0x800000 : «mtd»
Из таблицы нас интересует последний раздел — mtd. Как видно из bootargs, его размер 320кб, что составляет 50000h в шестнадцатеричной системе, а начальный адрес — 0x7b0000.
Здесь хранятся настройки устройства, и, самое важное, пароли пользователей. Если его стереть, то система пересоздаст этот раздел заново с настройками по умолчанию, и, соответственно, с пустыми паролями.
даём следующие команды:
sf probe 0
sf erase 0x7b0000 0x50000
reset
В новых прошивках появилась защита флешки от записи, поэтому сразу после sf probe 0 нужно давать ещё команду sf lock 0 , чтобы снять защиту.
Внимательный читатель может обратить внимание, что раздел mtd последний, и для его вычисления достаточно вычесть размер mtd 0x50000 из размера флешки 0x800000, получим те же 0x7b0000. Так даже проще, если нас интересует только один раздел.
Хочу ещё раз напомнить, что это только пример, у вас будут другие цифры. Использование неправильных значений обязательно приведёт к порче устройства!
Слишком сложно!
Не каждый пользователь осилит установку и настройку tftp сервера, не говоря уж про вычисления размеров и смещений для сброса настроек, поэтому мы разработали удобную программу с дружественным интерфейсом, упрощающую действия пользователя. Программа позволяет производить четыре основных операции:
1. Создание резервной копии (дампа) устройства
2. Восстановление камеры/регистратора из созданного дампа
3. Восстановление устройства с помощью файла прошивки
4. Стирание настроек/сброс пароля
Эти возможности предоставляются бесплатно. К пользователю есть лишь одна просьба — для новых устройств по возможности сделать фото устройства и прислать их вместе со слитым дампом по одному из контактов сайта. Пожертвования автору программы приветствуются.
Программу XMDeviceExplorer можно скачать тут.
Дополнительные видео по ремонту на Youtube.

















