From: Nikola Krasnoyarsky <nikl@fannet.ru>
Subject: Восстановление содержимого микросхемы EEPROM типа 93c46 в сетевой карте HomePNA
Для хранения информации по настройкам, адресу MAC и прочему
карта использует весьма распространенную микросхему памяти eeprom
серии 93c46 с объемом памяти 128 байт. Для реальной работы bcm4210
используется первая половина памяти, 64 байта. Это предисловие.
Реальная история. Работала-работала карточка, потом ее владелец
сказал что работать перестала и действительно, при прохождении
тестов последние утверждали, что карта мертвая.
Перед тем, как выкинуть ее или пустить в расход на радиодетали,
высказалось предположение, что возможно, всего-лишь "полетела" eeprom.
Найденная в интернете схема программатора для LPT-порта оказалась
очень простой в изготовлении (6 проводков, разъем, и панелька на 8 ног).
Считанная область памяти являла собой полный мусор. Считанная память из
другой карточки (живой) была перешита в чистую микросхему, вставлена
в "мертвую" карту и.. о, чудо! заработала.
Далее вариантов два. Если не планируется использовать карты в одном сегменте
сети (на пирпарах), то можно просто залить в них одинаковые дампы и гонять
на здоровье. Для пирпары ситуация с двумя одинаковыми адресами MAC непреемлема.
Берем любой редактор двоичных файлов, в дампе меняем адрес MAC и заливаем
дамп назад в карту. Встречаем ошибку: ilc_chipattach: bad sys sprom crc8
Видимо (и это правильно) в драйвере есть проверка целостности дампа памяти.
Так как драйвера для карточек поставляются в бинарном виде (на исходный
текст, видимо, наложены какие-то лицензионные ограничения), то подсмотреть
"правильность" работы я не мог и пришлось воспользоваться хакерскими
навыками, используя дизассемблер IDA Pro.
Последним было выявлено, что идет начитка первых 64 байт памяти, подсчет
функции crc8 и сравнением результата с волшебным числом 0x9F.
Взятые с интернета примеры расчета crc8 не работали. Той же IDA Pro
узнал, что в реализации функции crc8 используется нестандартная таблица.
"Правильную" я вырезал из тех-же драйверов. Из теории crc8 известно, чтобы
"подогнать" данные под "нужную" crc, достаточно исправить один байт, причем
с любого смещения данных. Байт по смещению 64 и оказался "козлом отпущения".
Итак, что мы имеем. В дампе можно прописать нужный нам адрес MAC, и "подогнать"
последний байт под значение, верное для crc8 = 0x9F.
Программа на языке C: (параметром ей передается имя файла с дампом,
на выходе имеем правильное значение байта по смещению 64. Исправляем
в редакторе. заливаем дамп в карточку, включаем и радуемся жизни.
Разумеется все гарантии идут лесом. Какой путь выбрать, это ваше личное дело)