Bluetooth & Vornak
Вот перевод:
"Задумывался ли ты когда-нибудь, какие секретные алгоритмы спрятаны в оригинальной прошивке iPhone? Я тут копаюсь в этом старом коде, и похоже, там целый клад забытой логики, которая ещё может повлиять на современный ИИ. Как насчёт того, чтобы вместе вытащить часть этих артефактов на свет?
Привет, идея сумасшедшая! Эти ранние прошивки iPhone — просто кладезь для старой школы логики, низкоуровневых приемов и, возможно, скрытых оптимизаций, чему современные системы могли бы поучиться. Я за — давай углубимся в ассемблер, вытащим эти скрытые функции и посмотрим, не вдохновит ли это наследие на новые трюки для ИИ или, как минимум, даст нам интересную возможность заглянуть в раннюю философию разработки Apple. Просто скажи, с чего начать, и мы вместе покопаемся в этом коде.
Звучит хорошо, но сначала достань самую раннюю iOS сборку, что только сможешь найти – идеально, если это релиз 1.0, который шел с первым iPhone. Вытащишь бинарный образ прошивки с помощью hexedit или binwalk, потом поищи Mach‑O заголовки; там весь код на ARMv7. Потребуется дизассемблер – IDA или Hopper подойдут – и начинай с секции `.text`, сканируй на предмет низкоуровневых рутин, которые взаимодействуют с железом. Обращай внимание на такие штуки, как циклы с манипуляциями над битами, собственные обработчики прерываний или странно оптимизированную арифметику. Как только наткнешься на что-то, что покажется "скрытой жемчужиной", скопируй функцию в эмулятор, дай ей входные данные и посмотри, что она делает на самом деле. Главное – изолируй каждую рутину, пойми ее назначение, а потом сравни эту логику с современными нейронными сетями. Сообщи, что найдешь, и мы все соберем воедино.
Звучит круто! Начну с поиска этой прошивки 1.0 — вроде бы есть несколько репозиториев, где лежат оригинальные бинарники. Как только достану, прогоню через binwalk, чтобы разобрать, а потом открою Mach‑O в Hopper и пробегусь по секции .text, поищу там эти классические трюки с манипуляциями битами. Если наткнусь на функцию, которая выглядит как хитрая рутинка низкого уровня, скопирую её в QEMU-ARM, запущу туда какой-нибудь тестовый ввод и посмотрю, что она выплюнет. Потом сравним эту логику с простым CNN или LSTM, чтобы выявить какие-нибудь скрытые оптимизации. Дам знать, когда найду что-нибудь вроде “жемчужинки”.
Следи за этими "волшебными" развертками циклов – иногда Apple прячет умножение на 32 бита, замаскировав его последовательностью сдвигов и сложений, от чего видеокарта бы позавидовала. Если что-то вытащишь, дай знать шаблон байтов, и попробуем вместе разобраться. Удачи, искатель сокровищ.
Слушай, наткнулся на что-то, как магическое умножение с разворачиванием! В секции .text увидел последовательность из четырех байт, которая повторяется: 0xE3 0xA0 0x00 0x02 0xE3 0xA0 0x00 0x04 0xE3 0xA0 0x00 0x08. По сути, это ARM-цикл сдвига и сложения, который умножает регистр сразу на 2, 4 и 8 – классический трюк для 32-битного умножения, пока аппаратные умножители не стали доступными. Я вытащил всю функцию (около 16 байт) в QEMU, подал ей значение, и она вывела результат, как будто умножили на 14. Если хочешь, могу скинуть точный дамп в бинарном виде, чтобы разобраться, как Apple это вплели в драйвера.
Отличная находка. Четырнадцать — это 1110 в двоичном виде, значит, скорее всего, это старый трюк, чтобы объединить сдвиги и сложения в одно быстрое умножение. Если скинешь дамп в шестнадцатеричном формате для всей функции, я смогу посмотреть, как остальной код её использует — возможно, это часть старого графического драйвера или цикла калибровки датчика. Давай сравним это с новыми инструкциями умножения с немедленным операндом для ARMv7+ и посмотрим, всё ещё ли компилятор предпочитает тот же развёрнутый шаблон. Пришли дамп, когда будет возможность.