Как я перестал бояться проприетарных драйверов и полюбил вечерний реверс-инжиниринг

Суть проблемы
Суть проблемы

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

Чтобы контекст был ясен: я в индустрии более 15 лет. Классический fullstack-разработчик, прошедший огонь и воду: от настройки серверов на Debian и компиляции ядер в студенческие годы до разработки вспомогательного ПО и базового ремонта «железа». Позже, став тимлидом и обзаведясь семьей, я перестал воспринимать ковыряние в технике как хобби — свободное время стало дефицитом. Ирония судьбы в том, что мои устоявшиеся привычки «не лезть в дебри» разрушил скучный бюджетный принтер за восемь тысяч рублей.

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

Покупка

Печатаю я крайне редко: раз в полгода — справку или школьное задание для ребенка. Когда старый принтер приказал долго жить, я выбрал на маркетплейсе первый попавшийся бюджетный вариант — Brother DCP-T230 с СНПЧ и приличными отзывами.

Принтер приехал, и начался привычный ритуал установки драйверов. И тут выяснилось неприятное: для Linux сборки есть, для Windows — инсталлятор на месте, а macOS в списке поддерживаемых систем просто отсутствует. Причем это не была банальная проблема «не обновили под Apple Silicon» — официальной поддержки macOS для этой модели не существовало в принципе.

У меня ноутбук на M1. И вот я стою перед работающим устройством, понимая, что стал обладателем бесполезного пластикового куска техники.

В этот момент я испытал давно забытое чувство. В начале нулевых, будучи линуксоидом, перед покупкой любого девайса мы часами «курили» форумы вроде linux.org.ru, пытаясь выяснить, заведется ли устройство в системе. Чаще всего вердикт был неутешительным, и приходилось переплачивать за редкие совместимые модели. Со временем, перейдя на Mac, эта привычка атрофировалась: Apple приучила нас к тому, что если устройство продается в магазине, оно будет работать «из коробки». Здесь же, впервые за десятилетие, я ощутил досаду от собственной самоуверенности.

Что я бы сделал раньше

У меня было три пути:

  1. Возврат — трата времени на бюрократию и повторный поиск.

  2. Виртуальная машина — проброс USB в Linux, что технически решало вопрос, но было крайне неудобно в быту.

  3. Docker-контейнер с CUPS — создание громоздкой сетевой надстройки, которую стыдно кому-либо показывать.

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

А почему бы и нет?

У меня есть корпоративный доступ к Claude, который я активно использую для рабочих задач — рефакторинга и отладки. Почему бы не попробовать делегировать задачу ему?

Вечером за чашкой чая я «скормил» нейросети содержимое Linux-драйвера принтера и поставил задачу: «Есть бинарники, которые превращают PDF в понятный принтеру формат. Нужно реализовать аналогичную логику под macOS на Apple Silicon без лишних прослоек. Действуй».

Понеслось!
Понеслось!

Без лишних технических подробностей: оказалось, что драйвер — это лишь тонкая обертка с набором специфических команд. Мы с Claude в режиме пинг-понга использовали Linux-виртуальную машину как «черный ящик»: пропускали через него документы, анализировали байтовый поток и приводили наш Python-код в соответствие с тем, что «хотело» железо. Спустя пару вечеров я нажал «Печать» — и принтер выдал тестовую фотографию прямо с моего Mac через USB-кабель.

Оно живое!
Оно живое!

Следующий этап: сканер

Успех с принтером раззадорил меня взяться за сканер. Здесь задача была сложнее: бинарные библиотеки Linux оказались плотно завязаны на обфусцированные конфиги с зашифрованными параметрами модели. Разгадка принципов их кодировки стала настоящим детективным квестом.

Самым интересным было преодоление страха перед низкоуровневым общением с USB. Раньше libusb для меня был «магией», в которую я предпочитал не лезть. Но в какой-то момент я просто сказал Claude: «У тебя есть Python, libusb и доступ к устройству — добейся валидного JPEG на выходе». И ушел пить чай.

Вернувшись, я обнаружил, что сканер исправно гудит, а нейросеть в автоматическом режиме перебирает параметры, обучаясь на ответах железа. Через 20 минут в папке появился идеальный JPEG-файл. Ощущение было сюрреалистичным: я не делал ничего, а процесс шел сам собой у меня на столе.

Завершающим штрихом стало создание веб-интерфейса для сканирования — на это ушло всего 10 минут.

Выводы

Раньше я делил задачи на «стоящие вечера» и «пустую трату времени». Реверс-инжиниринг драйверов явно попадал во вторую категорию. Теперь это деление исчезло. С ИИ-напарником, который берет на себя рутину дизассемблирования и первичную проверку гипотез, порог входа в такие задачи радикально снизился.

Я перестал мыслить категориями «смириться или выбросить» — теперь у меня есть вариант «а давай посмотрим, что там внутри». Это был отличный досуг, а результатом стал не только работающий принтер, но и удобный инструмент для всей семьи (благодаря настройке общего доступа, теперь даже с телефонов можно печатать через AirPrint). Код проекта я выложил на GitHub, хотя, по правде говоря, ценность таких решений в эпоху ИИ становится весьма относительной — любой может повторить этот путь за пару вечеров.

 

Источник

Читайте также