RETRO MOBILE
3 поста
3 поста
Привет, Пикабу! Ищу один интересный ретро-смартфончик с корнями из Китая. В 2009-2011 году, еще до массового развития Android, китайцы делали подделки современных на тот момент смартфонов с процессорами HiSilicon K3v2 (зачастую в менюшке их маскировали под Marvell PXA312 или MSM7200A). В основном это были клоны HTC HD2, HTC Touch Diamond 2, iPhone 3GS и некоторых моторолл, но вариации бывали самые разные. Ключевая фича - дуалбут в Android и WM с завода. Если у вас есть такой китаец - напишите пожалуйста в комментах. Готов принять в дар или купить, хочу сделать видеоролик и написать статью ;)
Если вдруг не знаете о моем блоге, то вот пример статьи: Устройства, которые мы потеряли: редчайший японский ноутбук с MIPS-процессором
Пару лет назад я начал коллекционировать интересные гаджеты, в форм-факторе ноутбука. Особое место в моей коллекции занимают устройства на диковинных процессорных архитектурах — и нет, речь даже не об ARM, а о куда более редких MIPS и SH4. Недавно я исследовал китайский аналог Авито и наткнулся на очень интересный предсерийный прототип ноутбука Fujitsu Intertop CX300 всего за 3.000 рублей — и в сегодняшней ретроспективной статье, мы с вами посмотрим на это чудо японской инженерной мысли поподробнее!
Давным-давно, в конце 80-х годов, на рынке появился новый класс портативных устройств — карманные персональные компьютеры, также известные как HPC или Palmtop. До привычных нам КПК с резистивным тачскрином и Windows Mobile на борту оставалось ещё добрых лет 10, а первые палмтопы представляли из себя ни что иное как маленькие, но вполне полнофункциональные ноутбуки!
Поскольку выбор процессоров в те годы не был особо велик, а Z80 и 6502 устанавливать в портативные компьютеры было моветоном, нередко эти гаджеты были частично IBM-PC совместимыми, использовали производные от x86 процессоры (8088/80186) и более того, работали на специализированных версиях DOS, а порой имели и свои собственные UI-оболочки!
Однако эти гаджеты относились исключительно к бизнес-классу, стоили очень дорого и далеко не всегда позволяли расширить свой функционал за счет установки стороннего софта. Но время шло, вот уже и 486'ой стал одним из самых популярных процессоров, и первый Pentium вышел на рынок, и портативные гаджеты развивались семимильными шагами. Новая операционная система Windows 95 стала очень популярной на десктопных машинах и дабы не упускать мобильный рынок, Microsoft параллельно разрабатывает и выпускает свою первую мобильную операционную систему — Windows CE.
В отличии от привязанной к архитектуре IBM-PC Win9x и новомодной требовательной Windows NT, WinCE предназначалась для встраиваемых устройств с ограниченными характеристиками и, что немаловажно, поддержкой eXecute In Place памяти. Минимальные системные требования были очень скромными: процессор с поддержкой MMU и архитектурой MIPS/ARM/SH4 на частоте ~32МГц, 4Мб ROM-памяти для хранения образа системы и 2Мб оперативной памяти для запуска ядра и графической оболочки. При этом оболочка практически точь в точь повторяла интерфейс десктопной Windows и была во многом совместима с ней на уровне WinAPI, что позволяло легко портировать программы с одной системы на другую.
Производители портативных гаджетов сразу обратили внимание на новую систему и выпустили несколько десятков интересных гаджетов. Сначала выходили модели с монохромными дисплеями — HP 300LX, Casio Cassiopeia A-10 и NEC MobilePro 200, а уже через два года, в 1998 году, на рынок вышли легендарные HP Jornada 680 и 820 с мощными процессорами на архитектуре Hitachi SH4 и очень неплохими цветными дисплеями приличного разрешения — 640x240.
Особенно сильно Windows CE и устройства в формате миниатюрных ноутбуков полюбили в Японии. Там выходили десятки самых разных интересных и необычных моделей: начиная от молодежных портативных коммуникаторов с ярким дизайном, заканчивая очень серьезными моделями как, например, вся линейка Fujitsu Intertop. Несколько месяцев назад я искал интересные гаджеты на онлайн-барахолке Сяньюй, китайском аналоге Авито, и мой взгляд привлек Fujitsu Intertop CX300, который висел за 320 юаней — или около 3.500 рублей. Чуток подсобрав денег, я попросил у читателя Романа помочь с перевозкой гаджета в Россию и вот, спустя месяц — легендарный гаджет у меня в руках!
Продавец в описании упомянул одну очень интересную деталь: дело в том, что у моего экземпляра необычный серийный номер — 0123456789, а это значит что скорее всего в моих руках оказался редчайший предсерийный прототип устройства, который когда-то стоял на выставке или презентации!
По традиции рубрики, мы с вами разберем ноутбук и узнаем, что же у него находится «под капотом»! Разбирается гаджет относительно несложно: откручиваем несколько винтиков с обратной стороны и осторожно снимаем заднюю крышку. Особое внимание стоит обратить на шлейфы: три из них зафиксированы в коннекторе с помощью прижимных контактов и вынимаются путем осторожного расшатывания по горизонтали:
В глаза сразу бросается небольшая съёмная плашка памяти, которую читатель может посчитать за оперативную. На самом деле это специальный ROM-картридж с прожженной на заводе операционной системой. В те годы на КПК нельзя было обновить систему с помощью кабеля и уж тем более не было никаких установочных программ. Если пользователь хотел обновить систему — он писал производителю на почту и покупал модуль апгрейда ROM.
Причём сами чипы в картридже буквально были масочной ROM и не предполагали перезаписи или хранения пользовательских данных!
Но это ещё не всё: рядом со слотом для ПЗУ расположен ещё один проприетарный слот, используемый для установки дополнительной оперативной памяти. Даже в HPC 1999 года можно было прокачать память, не то что современные ноутбуки с распаянными чипами!
Под модулем ПЗУ скрывается сердце устройства и его главная гордость — процессор NEC VR4121. Внутри компактного чипа скрывается 64х-битное ядро MIPS R4000, работающее на частоте от 131 до 168МГц, 16Кб кэша инструкций и 8Кб данных, SDRAM-контроллер с MMU и множество разной периферии: контроллер питания, DMA, RTC, аппаратные таймеры, UART-контроллер, контроллер клавиатуры и тачскрина, АЦП и ЦАП. В общем, полноценная система на кристалле с техпроцессом в 250нм (почти как у Pentium II) — и это уже в 1998 году!
С обратной стороны платы расположился хаб NEC 4171A, который служит сопроцессором к VR4121. В его задачи входит работа с шиной PCMCIA, GPIO, а также простенький контроллер дисплея с фреймбуфером и аппаратным курсором.
Правее расположился очень большой чип ITE IT8181E. Некоторые читатели могут узнать этого производителя по мультиконтроллерам для десктопных плат, однако на данном ноутбуке именно он скорее всего выполняет роль контроллера дисплея и видеоадаптера. Дело в том, что рядом с ним расположилось ещё несколько чипов памяти EDO RAM производства Mitsubishi (такие же применялись в легендарных S3 ViRGE), которые скорее всего выполняют роль видеопамяти:
Внимательный читатель мог заметить следы флюса и большое количество перемычек на плате. В те годы техпроцесс для изготовления плат был ограничен и не всегда можно было уместить все линии в условные 7-8 слоев, поэтому во многих КПК (включая HP Jornada), сборщики прямо на заводе припаивали перемычки. Недостаточно было просто собрать гаджет, нужно было ещё и уметь паять на достойном уровне!
Пришло время смазать подуставшие петли и собрать наш прекрасный гаджет обратно. Подключаем блок питания, включаем и...
Нас встречает логотип Fujitsu, а затем окно с предложением откалибровать тачскрин и ввести информацию о владельце. Дело в том, что практически все HPC хранили пользовательские данные в оперативной памяти. Та самая CR2032 батарейка подпитывает не только RTC, но и контроллер оперативной памяти, дабы пользователь не потерял данные когда устройство разрядится или понадобится заменить аккумулятор.
После настройки нас встречает такой уютный и родной рабочий стол Windows, практически полностью повторяющий Win9x. Для установки программ предлагается использовать комплектный дата-кабель и программу ActiveSync, ИК-порт, либо же CF-карточки. Но вот нюанс: CF-карта то у меня есть, а вот софта под MIPS HPC в наше время почти не осталось, тем более для WinCE Professional!
Дело в том, что HPC с MIPS-процессорами были крайне редкими и продавались в основном на рынке Японии. В остальном мире были куда более распространены устройства с процессорами Hitach SH4 и ближе к 2000-ому году — ARM. Поэтому остаётся лишь довольствоваться тем софтом, что предустановлен в здесь из коробки.
Поскольку гаджет позиционировался для бизнес-пользователей, в нём предустановлено множество офисных программ: как от самой Fujitsu, так и от Microsoft. И что небезынтересно, здесь есть «младшие» версии привычных программ — PocketWord, PocketExcel, PocketAccess, PocketPowerPoint.
А ещё HPC могли свободно сёрфить полноценный веб 1.0 и даже чуточку веб 2.0! Во всех HPC на WinCE был предустановлен браузер PocketIE, так что если подключить CX300 к интернету через ИК-порт, то возможно даже OpenNet откроет!
Ну и конечно на WinCE были игры! Предустановлена всего одна — косынка, но энтузиасты портировали на HPC самые разные эмуляторы и опенсорсные игры. Но, поскольку у нас гаджет на MIPS'е, пока что остаётся играть лишь в косынку :)
Вот такой интересный гаджет разработала компания Fujitsu ни много, ни мало — 26 лет назад. И ведь столько лет прошло — а старичок всё ещё бодрый и даже не думает уходить на покой. Что-ж, думаю в моей коллекции крутых гаджетов прошлых лет ему будет гораздо лучше, чем в утиле!
Если вам интересна тема моддинга HPC и необычных ретро-ноутбуков, то жду от вас фидбека и в рамках одной из следующих статей, мы с вами портируем на него (а заодно и на NEC MobilePro) эмулятор IBM-PC, NES и GBA. Ну а в случае если вы хотите поддержать блог материально - ниже есть формочка, мне будет приятно (или как вариант - донат на Boosty):
А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статью) можно найти на моём YouTube канале.
Очень важно! Разыскиваются девайсы для будущих статей!
Друзья! Для подготовки статей с разработкой самопальных игрушек под необычные устройства, объявляется розыск телефонов и консолей! В 2000-х годах, китайцы часто делали дешевые телефоны с игровым уклоном — обычно у них было подобие геймпада (джойстика) или хотя бы две кнопки с верхней части устройства, выполняющие функцию A/B, а также предустановлены эмуляторы NES/Sega. Фишка в том, что на таких телефонах можно выполнять нативный код и портировать на них новые эмуляторы, чем я и хочу заняться и написать об этом подробную статью и записать видео! Если у вас есть телефон подобного формата и вы готовы его задонатить или продать, пожалуйста напишите мне в Telegram (@monobogdan) или в комментарии. Также интересуют смартфоны-консоли на Android (на рынке РФ точно была Func Much-01), там будет контент чуточку другого формата :)
А также я ищу старые (2010-2014) подделки на брендовые смартфоны Samsung, Apple и т. п. Они зачастую работают на весьма интересных чипсетах и поддаются хорошему моддингу, парочку статей уже вышло, но у меня ещё есть идеи по их моддингу! Также может у кого-то остались самые первые смартфоны Xiaomi (серии Mi), Meizu (ещё на Exynos) или телефоны Motorola на Linux (например, EM30, RAZR V8, ROKR Z6, ROKR E2, ROKR E5, ZINE ZN5 и т. п., о них я хотел бы подготовить специальную статью и видео т. к. на самом деле они работали на очень мощных для своих лет процессорах, поддавались серьезному моддингу и были способны запустить даже Quake!). Всем большое спасибо за донаты!
Статья подготовлена при поддержке @Timeweb.Cloud
Как грамотно вытащить замок на нивасе? 2009 год, замок похоже родной (не такой хрупкий как новодел), заклинила личинка, ключ тоже застрял и выломан. В следствии того, что инструмента маловато (киянка да пару зубил и отвертка, делаю не себе и не у себя дома), попытался зубилом раскурочить штифты, но пока что неудачно. Руль не блокируется. Дрели с собой нет, но в следующий раз возьму))
Недавно я исследовал китайские онлайн-барахолки и наткнулся на лот с продажей абсолютно новых КПК Sharp Zaurus за 4.500 рублей. Будучи прожженным гиком и ярым фанатом всего, что хоть как-то похоже на ноутбук и работает на ARM-процессоре, я не смог устоять и решил приобрести его в свою коллекцию необычных Linux-гаджетов. А поскольку устройство абсолютно новое и опечатанное, я решил оформить распаковку и ретроспективу в виде ламповой статьи!
В наше время нет никаких проблем купить себе интересный гиковский гаджет. То и дело небольшие компании по типу Planet Computers и Pine64 выпускают необычные устройства, по большей части предназначенные для доводки напильником и ковыряния ради самого процесса. Более того, в эпоху DIY, многие начинающие инженеры сами себе собирают гиковские штучки: я и сам являюсь одним из таких доморощенных маминых конструкторов.
Но в девяностых и нулевых всё было не так просто: Open Hardware-компьютеров вообще практически не существовало (кроме смартфона Neo Freerunner), а серийные Linux-устройства можно было пересчитать по пальцам. Но обширное коммьюнити не отчаивалось и пыталось портировать ядро на все гаджеты, где есть MMU и хоть какая-то документация на процессор. HP Jornada, Dingoo A320, HTC Magician, HTC Gene - на все эти устройства Linux был полноценно портирован исключительно силами коммьюнити!
Среди легендарных гиковских гаджетов, особенно выделяется серия портативных компьютеров Sharp Zaurus. Ещё в 2001 году, японская корпорация поверила в перспективы Linux и Qt и выпустила один из первых серийных КПК с «пингвином» на борту - SL-5000D. Модель отличалась полноценной QWERTY-клавиатурой, которая пряталась под выдвигающимся блоком системных клавиш, крупным цветным дисплеем с приличным разрешением 240x320, мощным процессором Intel StrongARM и наличием свободного SDK для разработки программ с использованием Qt.
Несмотря на высокую цену, устройство стало бестселлером среди гиков, которые старались выжать из устройства максимум. Кастомные прошивки, ядра с разгоном процессора, порты программ с ПК - всё это появилось задолго до Android-смартфонов! Попробуйте представить себе, насколько круто было запустить полноценный Wolfenstein3D в 2002 году на портативном гаджете...
Будучи коллекционером и одним из таких энтузиастов, мне тоже захотелось обзавестись легендарным японским КПК. Сначала я купил за копейки SL-5500D из утиля с эффектом, известным как «уксусный синдром» - когда из-за неправильного хранения поляризационная пленка дисплея начинает отслаиваться и из-за кристаллизации клея изображение начинает «плыть».
А затем мне попался лот с абсолютно новым SL-7500C для китайского рынка по весьма приятной цене в 4.500 рублей. Благодаря подписчику Роману и сервису YouCanBuy, я смог заказать гаджет и привезти в Россию, за что вам огромное спасибо!
Поскольку многие модели Zaurus продавались в основном на рынке Японии, в другие страны их нередко ввозили «серым» импортом. Китай, однако, был исключением - там ввозом устройств занималась корпорация CEC и буква 'C' в конце названия модели как раз говорит о том, что у нас версия для Китая. От японской она отличается упаковкой и языком прошивки.
Гаджет приехал ко мне в посылке, где находился фирменный пакет, коробка с аксессуарами и опломбированная отдельная коробка для самого гаджета. В коробке с аксессуарами лежат два огромных талмуда - один с инструкцией для устройства, а второй для внешнего CF-модема GC, который позволяет добавить устройству GPRS и даже возможность звонить! Самого модема в комплекте не было, зато был диск с софтом и драйверами, проприетарный дата-кабель, блок питания (5В с Barrel-jack, как на PSP и КПК HTC/HP), запасной стилус, аккумулятор и гарантийная информация. В общем, почти стандартный набор для тех лет.
А вот сам гаджет упакован особенно: отдельная коробочка с ленточной подпоркой, обшитая красной тканью, в которой гордо расположился SL-7500C. В подобных коробочках поставляются либо шедевры ювелирной работы... либо крутейшие гиковские гаджеты!
В качестве аккумулятора здесь используется литий-ионный элемент на 950мАч. Учитывая что АКБ хранится отдельно, мне было интересно остался ли в нём ещё хоть какой-то заряд спустя 21 год после выхода устройства. При первичном замере на клеммах было 0В (это на BMS, в самом аккумуляторе было ~2.6В), однако АКБ сразу же раскачался от лабораторного блока питания и подал признаки жизни.
На первый взгляд кажется, что литий-ионные АКБ не могут жить так долго, но при условии правильного хранения, аккумуляторы могут лежать и 10, и 15 лет, сохраняя заводской заряд. У меня лежат запечатанные аккумуляторы для сонериков и моторолл, которые всё ещё неплохо держат заряд и даже у SL-5500D, который я показывал чуточку выше, аккумулятор всё ещё жив спустя почти 25 лет!
Ну что-ж, пришло время подзарядить аккумулятор и впервые за 21 год включить нашего красавца...
Даже спустя 22 года после релиза этот красавец включается и работает как ни в чем не бывало, причём родной аккумулятор всё ещё держит заряд минимум несколько часов. При включении нас встречает консоль Linux, затем логотип Qtopia и рабочий стол устройства, который представляет из себя вариацию на тему Windows. Изначально интерфейс у большинства «Завриков» на японском или китайском языке и возможности сменить язык на английский нет - нужно прошивать кастомную прошивку.
У Zaurus есть своя консоль восстановления, откуда можно прошить кастом, сделать бэкап и отформатировать пользовательский раздел. Вызывается она включением с зажатой кнопкой «ОК», далее можно выбрать метод обновления: с CF-карточки, SD или через USB. «Завры» очень прихотливы к SD-картам, даже обычные MMC он не видит и нормально работает только с CompactFlash!
Самой популярной кастомной прошивкой была CackoROM, предположительно от разработчиков из СНГ. В довесок к стандартной Qtopia, CackoROM добавлял менеджер пакетов, позволяя устанавливать новый софт, терминал, порты различных программ на Qt с KDE и кастомное ядро. Даже Midnight Commander портировали. Буквально LineageOS в мире Zaurus!
После прошивки, printk начинает выводить логи на экран, что прибавляло к крутости владельца 100 очков... А ведь раньше даже во времена Android убирали бутанимацию и делали вывод сообщений ядра!
SL-7500 - кровный брат-близнец модели C750, работающий на идентичном железе. Под капотом у них флагманское для своих лет железо:
Процессор - Intel XScale PXA255 на частоте 400МГц с одним ARMv5-совместимым ядром собственной разработки Intel. Процессор набирает почти в два раза больше очков MIPS, чем Pentium MMX и идёт на равных с Pentium II 300 - уже в 2003 году!
ОЗУ - 64Мб типа SDRAM. Классика для КПК тех лет, хотя в 2003 году ещё выходили модели и с 32Мб памяти.
Постоянная память - 64Мб типа NAND, производства Samsung. Для расширения памяти есть слот для SD, а также для карт CompatFlash.
Дисплей - TN-матрица разработки CG-Silicon с огромным по меркам тех лет разрешением - 640x480, диагональю в 3.7" и отличной цветопередачей с глубиной пикселя в 16-бит. У компактного КПК дисплей был не хуже, чем у некоторых актуальных для тех лет десктопов!
Коммуникации - USB, COM-порт, Wi-Fi и ИК-порт. CF также можно использовать для расширения функционала устройства с помощью дополнительных модулей.
После загрузки нас встречает рабочий стол Qtopia, разделенный на несколько вкладок: основные приложения, Java-приложения, настройки и проводник. Есть также фирменное меню пуск и панель задач - у «Заврика», как и у любого уважающего себя Linux-гаджета, есть многоконность!
Также здесь есть поддержка Java, но не J2ME как на телефонах, а Jeode с профилем, близким к CDC (J2SE ~1.1). По сути, это почти полноценная Java-машина с поддержкой awt - а значит на ней можно запустить различный ретро-софт. Из коробки здесь есть демо-апплеты, а также игра крестики-нолики, да и в целом поверх этой JVM можно реализовать MIDP 1.0 и запускать игры и программы для ретро-телефонов.
Zaurus отличался очень неплохими мультимедийными возможностями. Уже из коробки был предустановлен MP3-плеер, а также видеоплеер с поддержкой формата 3gp. Конечно едва ли в те годы можно было посмотреть на нём фильм, SD-карточки были ещё слишком малого объёма, но вот счастливые обладатели CF-карт на 256Мб уже могли попробовать посмотреть сильно пережатый фильмец!
Помимо этого, у Zaurus был полноценный веб-браузер NetFront 3.1 от компании Access. Это вам не урезанные WAP-сайты: миниатюрный гаджет мог просматривать настоящие WEB 2.0 страницы, а двумя движениями ноутбук превращался... в компактный планшет! В SL-7500C к сожалению нет ни WLAN, ни Bluetooth, поэтому подключить его к сети я не смог. Но уверяю у вас, OpenNet он бы точно открыл!
Поскольку Zaurus - это ещё и органайзер, в нём предустановлен различный офисный софт. Заметки, клиент E-Mail, календарь, записная книжка - всё это входит в стандартный набор программ. В целом, Zaurus можно считать прямым конкурентом тех же самых HP Jornada, LG Phenom и других WinCE-субноутбуков тех лет.
Ну и какой-же Linux-КПК обходится без возможности зайти в консоль под рутом и управлять системой как вздумается? На Zaurus легко можно было запускать консольный софт вообще без особых изменений, а также GUI-софт. Причём Qt был необязателен: многие эмуляторы рисуют сами себя либо сразу в фреймбуфер, либо используют библиотеку SDL. Возможности моддинга гаджета были неограниченными!
❯ Заключение
Вот такой необычный Linux-гаджет разработали в Японии в далёком 2003 году. На первый взгляд кажется что у него совсем нет применений в современном мире, однако на практике это вполне достойный портативный терминал, печатная машинка, игровая консоль и... телефон, если конечно у вас есть CF-радиомодуль. Подытоживая, можно сказать что Zaurus - один из самых ярких представителей ушедшей эпохи карманных портативных компьютеров.
А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статью) можно найти на моём YouTube канале.
Очень важно! Разыскиваются девайсы для будущих статей!
Друзья! Для подготовки статей с разработкой самопальных игрушек под необычные устройства, объявляется розыск телефонов и консолей! В 2000-х годах, китайцы часто делали дешевые телефоны с игровым уклоном — обычно у них было подобие геймпада (джойстика) или хотя бы две кнопки с верхней части устройства, выполняющие функцию A/B, а также предустановлены эмуляторы NES/Sega. Фишка в том, что на таких телефонах можно выполнять нативный код и портировать на них новые эмуляторы, чем я и хочу заняться и написать об этом подробную статью и записать видео! Если у вас есть телефон подобного формата и вы готовы его задонатить или продать, пожалуйста напишите мне в Telegram (@monobogdan) или в комментарии. Также интересуют смартфоны-консоли на Android (на рынке РФ точно была Func Much-01), там будет контент чуточку другого формата :)
А также я ищу старые (2010-2014) подделки на брендовые смартфоны Samsung, Apple и т. п. Они зачастую работают на весьма интересных чипсетах и поддаются хорошему моддингу, парочку статей уже вышло, но у меня ещё есть идеи по их моддингу! Также может у кого-то остались самые первые смартфоны Xiaomi (серии Mi), Meizu (ещё на Exynos) или телефоны Motorola на Linux (например, EM30, RAZR V8, ROKR Z6, ROKR E2, ROKR E5, ZINE ZN5 и т. п., о них я хотел бы подготовить специальную статью и видео т. к. на самом деле они работали на очень мощных для своих лет процессорах, поддавались серьезному моддингу и были способны запустить даже Quake!) и устройства на Windows Mobile. Всем большое спасибо за донаты!
Осторожно: в данной серии статей я рассказываю о реверс-инжиниринге и хакинге простых кнопочных звонилок. Цель простая: расширить скудный функционал телефонов ценой до 1 000 рублей и сделать их привлекательной моддинг-платформой для самых разных гиков. Если вы когда-нибудь слышали про эльфы и патчи, и вам интересно узнать, как происходит процесс взлома и изучения прошивок, а также написания новых программ для кнопочников — приглашаю вас под кат!
Недавно я познакомился с Ilya_ZX, человеком-легендой в моддинг сцене телефонов из нулевых. Илья рассказал мне забавную историю: ещё будучи студентом, он увидел как одногруппник играет на своём LG G1800 в легендарную мобильную игру нулевых — «Змейку». Его тогдашний Siemens A60 не умел ничего кроме игрушки Stack Attack, даже Java-игры не поддерживались, а молодому парню очень хотелось сыграть в Змейку на скучных парах!
Казалось бы, на дворе 2005 год, можно просто пойти на рынок и купить уже изрядно подешевевшую Б/У 3310 и поиграть в «трушную» змейку именно там. Но Илья был не просто студентом технаря, он с юности интересовался программированием, реверс-инжинирингом и телефонами! И он решил поспорить с одногруппником — сможет ли он реализовать Змейку на своём A60? Всего за один месяц он умудрился исследовать прошивку телефона на диковинной процессорной архитектуре, найти необходимые функции для работы с дисплеем, вводом и окнами и написать ту самую змейку. Попробуйте теперь представить лицо его одногруппника, который проиграл спор молодому реверсеру :)
Сначала Илья написал игру на Паскале для самопального «симулятора» A60, а затем переписал её на ассемблере для C166s!
На момент написания статьи мне 23 года, я лишь чуточку старше тогдашнего Ильи. После рассказанной истории, я подумал «А чем я хуже?» и принялся реверсить прошивку бюджетного кнопочника 10-й давности - Explay B240. В прошлой статье, мы с вами проделали первые шаги по хакингу телефона: загрузка прошивки в IDA Pro и поиск системных функций, хакинг файлового менеджера для запуска программ с MicroSD-флэшки, разработка загрузчика исполняемых файлов и организация таблицы функций. В целом, это весьма неплохая поучительная статья для новичков в реверс-инжиниринге.
Однако итоговый результат в виде заливки экрана желтым цветом может показаться незначительным. Поэтому в сегодняшней статье мы с вами напишем первую действительно полезную программу!
Напомню, что загрузчик внешних программ работает по очень простому принципу: мы нашли в дизассемблере функцию обработки сообщений окна встроенной игры и хукнули её, дабы при открытии окна она загружала программу с MicroSD-флэшки в ОЗУ и передавала ей управление. При этом загрузчик сразу интегрирован в проводник: при запуске файла с расширением .app, патч кладет строку с абсолютным путем к нему в одну из «угнанных» глобальных переменных, открывает хукнутое окно игры, а далее бинлоадер транслирует все сообщения от ОС в загруженную программу.
Наглядная демонстрация работы
Таким образом, жизненный цикл приложений значительно упрощается по сравнению с "эльфами" на тех же Motorola и Siemens: по сути, нам остаётся лишь проинициализировать состояние программы в MSG_CREATE и освободить динамическую память в MSG_CLOSE. Читателям, которые хоть раз писали программы под Windows, такой подход может показаться очень знакомым!
Для реализации змейки, нам необходимо уметь обрабатывать кнопки и рисовать что-то на дисплей. С кнопками проблем никаких не возникает: система шлёт сообщения типа MSG_KEYDOWN_KEY и MSG_KEYUP_KEY на каждое событие с клавиатурой. А вот с графикой чуточку сложнее: поскольку встроенные в прошивку функции завязаны на работу с вшитыми ресурсами, мы напишем нужные функции сами.
UI-подсистема телефона реализована по принципу «грязных зон». Вместо перерисовки всего экрана, система хранит массив с координатами прямоугольников, где что-то изменилось с момента прошлой перерисовки: это позволяет сэкономить такты процессора на тяжелых операциях по типу альфа-блендинга.
Таким образом, сначала нам нужно получить указатель на буфер кадра, затем сделать весь экран «грязным» путем отрисовки полноэкранного прямоугольника и только потом поверх него рисовать графику нашей игры. На первый взгляд листинг ниже кажется дичью, но чуток отрефакторить — и выглядит как типичный код эмбедщика!
void Paint(LoaderContext* context)
{
LcdId lcd = { 0, 0 };
uint16* fb = ((uint16*(*)(LcdId* id)) LcdGetFrameBuffer)(&lcd); // Get framebuffer for primary screen
uint16 startEnd[4] = { 0, 0, 240, 320 }; // Rect
((void(*)(LcdId* lcdId, uint32 start, uint32 end, uint16 col)) LcdDrawRectPtr)(&lcd, ((uint32*)&startEnd[0])[0], ((uint32*)&startEnd[0])[1], 0x0); // Draw fullscreen rectangle
((void(*)()) LcdUpdateRect)(); // Update rect
}
Далее я реализовал функцию для отрисовки текста на экране. Шрифты самые примитивные — 8x8, побитовые, примерно как в знакогенераторе оригинального IBM PC. Принцип отрисовки прост: каждый символ (глиф) хранится в виде 8 байт. В каждом байте один бит представляет из себя пиксель по координате Y, если он равен нулю — значит пиксель прозрачный, в обратном же случае он должен быть закрашен нужным цветом.
Алгоритм для отрисовки шрифтов выглядит так:
int LcdDrawChar(LoaderContext* context, uint16* frameBuffer, char chr, uint32 x, uint32 y, uint16 color)
{
if(x >= 0 && y >= 0 && x + FONT_WIDTH < LCD_WIDTH && y + FONT_HEIGHT < LCD_HEIGHT)
{
int i, j;
unsigned char* glyph = (unsigned char*)(GLOBAL(context) + &embedded_font[chr * 8]);
for(i = 0; i < FONT_HEIGHT; i++)
{
short* fb = &((short*)frameBuffer)[(y + i) * LCD_WIDTH + x];
for(j = 0; j < FONT_WIDTH; j++)
{
if((*glyph >> (FONT_WIDTH - j)) & 0x1)
*fb = color;
fb++;
}
glyph++;
}
return true;
}
return false;
}
void LcdDrawString(LoaderContext* context, uint16* frameBuffer, char* str, uint32 x, uint32 y, uint16 color)
{
if(x >= 0 && y >= 0)
{
unsigned int i;
for(i = 0; i < strlen(str); i++)
{
if(!LcdDrawChar(context, frameBuffer, str[i], x, y, color))
return; // Out of screen
x += FONT_WIDTH;
}
}
}
Наверняка вы заметили страшный костыль в локальной переменной glyph с арифметикой над указателями. Дело в том, что на момент написания статьи, программа представляет из себя сырую склейку секций .text, .data, .bss и .rodata, поэтому на данный момент в ней нет релокаций, которые помогли бы сделать программу перемещаемой в памяти. В arm-none-eabi все вызовы функций без явного указателя — относительные, но при этом обращения к глобальным переменным и константам (например, строковым литералам) — абсолютные. Если попытаться напрямую использовать глобальную переменную по адресу 0x18 — программа будет пытаться читать или портить память в таблице векторов прерываний, что неизбежно приведет к HardFault. Поэтому для получения настоящего адреса переменной, к ней необходимо прибавить базовый адрес загрузки программы:
Этот костыль можно избежать, если в конец программы дописать сведения о релокациях, которые можно вытянуть путем парсинга промежуточного эльфа, а при особом желании — можно сделать так, что программа сама себя будет патчить «на лету»!
Далее мы рисуем нашу строку с текстом:
LcdDrawString(context, fb, SCONST(context, "Ya lyublu AvtoVAZ"), 0, 0, 0xFFFFFF);
И получаем следующий результат:
Для змейки, если она не ASCII, этого всё равно мало. Поэтому нам нужна функция для вывода картинок на дисплей. Написать загрузчик tga или bmp не составляет труда, но хотелось бы чтобы программа была самодостаточной и несла с собой все необходимые ресурсы. Поэтому для конвертации картинок я использую вот этот инструмент: выбираем файл, формат ставим в 16-бит 565 и преобразовываем в C-массив.
Процесс отрисовки изображения называется блиттингом, а его суть заключается в копировании пикселей с одной поверхности на другую. В нашем случае, исходная поверхность — само изображение, вторая — фреймбуфер. Также к пикселям могут применяться дополнительные операции: поворот и скейлинг (на фиксированные углы, либо же с аффинными преобразованиями), альфа-блендинг и колоркей.
void LcdDrawBitmap(uint16* frameBuffer, short* bitmap, uint32 width, uint32 height, uint32 x, uint32 y)
{
if(bitmap)
{
int i, j;
short* bmp = bitmap;
// Slow debug version
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
LCD_PLOT_565(clamp(x + j, 0, LCD_WIDTH), clamp(y + i, 0, LCD_HEIGHT), bmp[i * width + j]);
}
}
}
}
А отрисовать нашу картинку можно вот так:
LcdDrawBitmap(fb, (short*)(GLOBAL(context) + (uint32)&lada_bmp), LADA_WIDTH, LADA_HEIGHT, 0, 0);
Почему бы не спрятать дескриптор изображения в структуру?
Потому что в таком случае придется резолвить глобальный указатель два раза — первый раз на сам дескриптор, второй раз — на массив пикселей в дескрипторе, при всём этом необходимо необходимо будет разделить рантайм-изображения и ресурсы, что значительно переусложняет итоговую кодовую базу.
И вот наш результат. Не удивляйтесь тестовому изображению, просто я — прирожденный ТАЗовод!
Переходим к геймплею. Сама по себе «Змейка» в реализации — простая игра, где каждый уровень представляет из себя примитивную сетку. Алгоритм работы заключается в том, что раз в n-миллисекунд вызывается один игровой тик, который двигает игрока в текущем выбранном направлении. Если в момент тика нажата одна из кнопок-стрелок — направление движения меняется — тут всё очевидно:
Сама змея представляет из себя массив сегментов, который хранит свою текущую позицию в сетке уровня:
Для продвижения змейки по направлению, необходимо в обратном порядке обойти массив сегментов, переставляя текущий крайний сегмент на позицию предыдущего сегмента и так до самой головы. Позиция головы будет инкрементироваться относительно выбранного направления:
Для того, чтобы проверить скушали ли мы яблочко — достаточно сравнить координаты головы и объекта. Если они идентичны, то прибавляем очко и переносим яблоко на другую позицию:
if(state->Segments[SEGMENT_HEAD].X == state->AppleX && state->Segments[SEGMENT_HEADER].Y == state->AppleY)
{
state->Score++;
MoveApple(state);
}
Для респавна яблочка можно использовать два подхода: параметрические таблицы с заранее прописанными координатами объекта (эдакая псевдослучайность) и обычный PRNG-генератор, который путем реверса можно найти в прошивке.
Благодаря дипсику удалось определить, что в прошивке используется LCG. Вообще, нейронки очень сильно помогают при реверсе и могут легко анализировать стандартные алгоритмы: я тестировал от простых по типу memcpy, до относительно сложных как например программное деление по модулю и программная растеризация треугольника по Scanline-алгоритму.
unsigned int rand()
{
int v0; // r3
int v1; // r4
int v2; // r1
v0 = MEMORY[0x4710E80] - 1;
v1 = *(_DWORD *)(4 * MEMORY[0x4710E84] + 0x4710E88) + *(_DWORD *)(4 * MEMORY[0x4710E80] + 0x4710E88);
*(_DWORD *)(4 * MEMORY[0x4710E84] + 0x4710E88) = v1;
MEMORY[0x4710E80] = v0;
v2 = MEMORY[0x4710E84] - 1;
if ( v0 >= 0 )
{
--MEMORY[0x4710E84];
if ( v2 < 0 )
MEMORY[0x4710E84] = 54;
}
else
{
--MEMORY[0x4710E84];
MEMORY[0x4710E80] = 54;
}
return (unsigned int)(2 * v1) >> 1;
}
Если же голова оказывается в одном из сегментов или же за полем — игра окончена. Полный вес собранного приложения - 5 килобайт 644 байта! А ниже - демонстрация его работы:
Вот такой интересный моддинг бюджетного кнопочника у нас с вами сегодня получился. От слов к делу мы с вами написали первые действительно рабочие программы, которые может быть и не самые полезные, но поверьте, для гика важен сам процесс и объём получаемого от этого эндорфина...
А что ещё нужно парню в 23 года? Правильно: чтобы мотор бодро тянул любимую десятку и чтобы реверсилось всё легко и понятно! Исходный код и все что необходимо для установки бинлоадера есть в на моем гите.
А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статью) можно найти на моём YouTube канале.
Важно: друзья! Я уверен, что статью будут читать выходцы с форумов моддеров и возможно даже ребята, связанные с прошивочными боксами. Если у вас есть исходный код или объектные файлы для телефонов Siemens (S-Gold или E-Gold — не имеет значения) и вы хотели бы помочь общему моддерскому делу — напишите пожалуйста мне в Telegram. Несмотря на то, что этот код уже давно никому не нужен и E-Gold/S-Gold уже более 15 лет снят с производства, гарантирую полную анонимность и крутой контент :)
Очень важно! Разыскиваются девайсы для будущих статей!
Друзья! Если вам понравилась сегодняшняя статья про разработку эльфов, то спешу объявить: для подготовки будущих материалов с разработкой самопальных игрушек под необычные устройства, объявляется розыск телефонов и консолей! В 2000-х годах, китайцы часто делали дешевые телефоны с игровым уклоном — обычно у них было подобие геймпада (джойстика) или хотя бы две кнопки с верхней части устройства, выполняющие функцию A/B, а также предустановлены эмуляторы NES/Sega. Фишка в том, что на таких телефонах можно выполнять нативный код и портировать на них новые эмуляторы, чем я сейчас занимаюсь, а затем написать об этом подробную статью и записать видео! Если у вас есть телефон подобного формата и вы готовы его задонатить или продать, пожалуйста напишите мне в Telegram (@monobogdan) или в комментарии. Также интересуют смартфоны-консоли на Android (на рынке РФ точно была Func Much-01), там будет контент чуточку другого формата :)
А также я ищу старые (2010-2014) подделки на брендовые смартфоны Samsung, Apple и т. п. Они зачастую работают на весьма интересных чипсетах и поддаются хорошему моддингу, парочку статей уже вышло, но у меня ещё есть идеи по их моддингу! Также может у кого-то остались самые первые смартфоны Xiaomi (серии Mi), Meizu (ещё на Exynos) или телефоны на Linux (например Motorola EM30, RAZR V8, ROKR Z6, ROKR E2, ROKR E6, ZINE ZN5 и т. п., о них я хотел бы подготовить специальную статью и видео т. к. на самом деле они работали на очень мощных для своих лет процессорах, поддавались серьезному моддингу и были способны запустить даже Quake!). Всем большое спасибо за донаты!
А ещё я держу все свои мобилы в одной корзине при себе (в смысле, все проекты у одного облачного провайдера) — Timeweb. Потому нагло рекомендую то, чем пользуюсь сам — вэлкам:
В сегодняшней статье мы продолжим с вами ретроспективную рубрику о том, на каких аппаратных и программных платформах работали легендарные устройства из нулевых. В прошлой статье мы с вами посмотрели на Siemens M55 и его аппаратную платформу E-Gold, а сегодня я хотел бы рассказать об уникальном смартфоне 2002 года от малоизвестной тайваньской компании HTC, который обогнал iPhone на целых 5 лет.
Если вам интересно узнать как выглядел самый мощный смартфон 2002 года, что у него было под капотом и причём здесь Intel — добро пожаловать под кат!
В далёком 1997 году, в Тайване появилась корпорация High Tech Computer — или сокращенно HTC. С самого начала своего пути, компания занималась разработкой портативных компьютеров и, как бы странно это сейчас не звучало, была одним из десятков почти неизвестных ODM и OEM производителей электроники в Азии. При этом несмотря на инновации (уже в 1998 году компания выпустила первое устройство с тачскрином), первые продукты компании были финансовым провалом и найти о них какую-либо информацию очень сложно, а все фотографии в веб-архиве утеряны.
ODM — это когда компания выполняет полный цикл разработки и производства устройства: от проектирования платы и корпуса, до написания драйверов и адаптации прошивки. На ODM-устройство обычно наносится логотип нужного бренда и затем выпускается на рынок под видом собственной разработки. Примеры: Fly, Explay, RoverPC, QTek, O2 и т.п.
OEM же включает в себя только производственный цикл, без разработки устройства. Например, сборка iPhone на заводах Foxconn — это OEM.
С момента основания, HTC решила сделать ставку на новую и перспективную операционную систему от Microsoft для портативных компьютеров — Windows CE, а основными продуктами компании были классические КПК (которые тогда называли Palm-Sized PC) и тонкие клиенты на базе процессоров с архитектурой ARM. Из-за ODM бизнес-модели тех лет, мир знал устройства компании не как HTC, а как один из множества брендов: QTek для рынка Европы, Dopod для Азии, i-Mate для США, а также T-Mobile и O2 в качестве брендированных устройств для операторов мобильной связи. Также HTC делала устройства для HP и её суббренда Compaq.
В 2000 году Microsoft представила отдельную ветку Windows CE, адаптированную специально для КПК — PocketPC 2000, а уже в 2001 году выпустила следующую версию — PPC2002, где добавила поддержку GSM-радиомодулей, превратив карманный компьютер в полноценный смартфон! Ну, или как тогда называли — коммуникатор.
Действительно, ранее смартфоном называли кнопочный телефон с полноценной многозадачной операционной системой, которая умеет выполнять нативные приложения (есть и исключения — например BlackBerry OS, почти полностью написанная на Java). За примерами далеко ходить не надо — легендарная Symbian, а до WM5.0, Microsoft выпускала отдельную редакцию Windows Mobile for Smartphone.
Коммуникатором же назывался предок современных смартфонов: с управлением, ориентированным на пальцы или стилус и с минимальным количеством аппаратных кнопок. Впрочем, были коммуникаторы-слайдеры и с полноценными QWERTY-клавиатурами.
Будучи одним из самых важных партнеров Microsoft в сфере Windows CE, HTC не медлила и уже в 2002 году разработала и представила свой первый коммуникатор под кодовым именем Wallaby, а в 2003 году он поступил в продажу под именем QTek 1010, Siemens SX56 и O2 Xda. Стоил HTC Wallaby как крыло от Боинга: от 899 фунтов стерлингов или около 1348$ в 2003 году, а с учетом инфляции — ~2200$ в 2025 году...
Несмотря на огромный ценник, коммуникатор пользовался большим успехом среди гиков. Легендарный форум XDA-Developers изначально был посвящен именно O2 Xda и по сути именно с него началась история разработки кастомных прошивок на смартфоны.
Некоторое количество Wallaby ввезли и в Россию, мои экземпляры достались мне от читателя Андрея, за что ему огромное спасибо! Один из моих экземпляров не подавал никаких признаков жизни и скачав сервис-мануал, я принялся за ремонт...
Внутри Wallaby представляет из себя маленькое инженерное чудо, при этом несмотря на отсутствие нормальной схемы и скудный сервисмануал — весьма ремонтопригодное. Компоновка корпуса, платы, используемое железо — всё это вызывает изумление и восторг у гика даже сейчас...
В качестве сердца устройства, Wallaby использовал флагманский ARM-чипсет Intel SA-1110 2000 г.в, который берёт свои корни ещё с середины 90-х. В одном кристалле уместилось ARMv4-совместимое ядро, работающее на частоте 206МГц, контроллер SDRAM-памяти, PCMCIA-карт, дисплея, GPIO и множества шин общего назначения. При всём этом, чипсет изготавливался по техпроцессу 350нм — как первый Pentium и даже немного его обгонял (версии 133 и 166, 200 — уже на пару десятков баллов быстрее SA-1110).
Откуда у Intel ARM?
Здесь история забавная. В 1997 году, Intel судилась с DEC из-за нарушения патентных прав и дабы уладить спор, DEC продала своё подразделение StrongARM. Процессоры StrongARM базировались на своей микроархитектуре и были значительно быстрее сопоставимых ядер от самой ARM.
Например, ARM7TDMI (используемый в GBA, а также телефонах Motorola и многих других) работал на частоте до ~104МГц, в то время как SA работали на 208МГц и возможно также хорошо разгонялись, как и их последователи — XScale.
В 2002 году, Intel представила новую линейку — XScale, которая реализовывала набор инструкций ARMv5 и работала на частоте до 624МГц. Во всех флагманских коммуникаторах начала 2000-х стояли исключительно процессоры Intel PXA, они считались самыми производительными... пока в 2006 году Intel не продала XScale компании Marvell и не отказала Apple в разработке процессора для iPhone 2G.
Закончилось это тем, что Intel одумалась и выпустила Atom, который затем адаптировала для планшетов и смартфонов (например, Lenovo K900). Атомы отличались не самой плохой производительностью, но заметно грелись и не отличались низким энергопотреблением, поэтому в ~2016 году мобильную линейку Atom свернули. Досадно.
Рядом с процессором находится две «банки» оперативной памяти типа SDRAM общим объемом 64Мб, а также чип TRF6053 от Texas Instruments — предположительно, RF-фронтэнд или трансивер.
С верхней части платы расположился проприетарный чип от самой HTC, вероятнее всего это что-то типа контроллера питания или SMC. Предположительно чип занимается обработкой кнопки включения, управлением модулем зарядки, возможно выполняет роль аудиокодека, усилителя и контроллера тачскрина. Справа расположился Baseband-процессор HERCROM 200C от компании Texas Instruments — как раз та самая телефонная часть, которая обычно подключена к процессору через UART и определяется в системе как COM-порт. Рядом расположена небольшая флэшка на 4Мб с отдельной прошивкой для модема, а также отдельный контроллер питания TWL3011.
Если у вас есть 1010 с отвалом модема и очень хочется его восстановить — можно переставить КП и процессор из донорских плат для Sony CMD J, LG G1200, LG G1300 и Motorola T191.
С обратной стороны платы расположились два чипа NOR памяти по технологии StrataFlash от Intel общим объёмом в 64Мб, контроллер дисплея от Sony, остальные части GSM-радиотракта и большое количество самых разных маленьких чипов для логики!
Дисплей здесь производства Sony, выполненный по технологии TFT-TN с разрешением 240x320, диагональю 3.5" (как у первого iPhone), 12-битной глубиной пикселя (4096 цветов) и резистивным тачскрином. Сам дисплей довольно качественный, с неплохой цветопередачей, но малыми углами обзора из-за конструкции подсветки (скорее всего стоит лишь один рассеиватель). Для коммуникатора тех лет, дисплей был как... 4K OLED в наше время :)
Перейдем к ремонту: с обратной стороны коммуникатора виднеется 3 оголенных пина для зарядки аккумулятора от крэдла или «лягушки»!
АКБ здесь сделали несъемным аж за 5 лет до выхода iPhone, хотя при желании заменить его можно за пару минут: даже паять ничего не нужно. После расталкивания аккумулятора, коммуникатор всё так же не подавал признаков жизни. Открыв сервисман, я прочитал что помимо обычной кнопки Reset, в коммуникаторе есть вторая скрытая кнопка для аппаратного включения и отключения транзисторной защелки, которая отвечает за разрешение подачи питания на все остальные модули устройства. Это очень помогает сохранить ёмкость АКБ, если устройство нужно надолго отложить на полочку.
После нажатия на кнопку, коммуникатор начал подавать признаки жизни и показал логотип Windows Mobile, а затем через 5 секунд отключился. Будучи фанатом всего, что работает на Windows CE, я сразу понял в чём проблема: в концевом выключателе!
Дело в том, что в HTC Wallaby за 5 лет до iPhone реализовали сим-лоток. Только для его открытия не нужна скрепка, достаточно лишь снять специальную крышку, которая нажимает на тот самый выключатель. Когда он размыкается — коммуникатор полностью отключается, дабы не «спалить» радиотракт в процессе горячей замены SIM-карты. У меня эта самая крышка была утеряна, поэтому я просто поставил перемычку:
И коммуникатор снова заработал! Несмотря на повреждения и немалый возраст, HTC Wallaby прошёл проверку временем и продолжает работать как ни в чем не бывало...
HTC Wallaby производил впечатление не только своим конструктивом и используемым железом, но и ОС PocketPC 2002. В отличии от Symbian, для Windows Mobile писать программы было очень просто и, что самое важное, API системы был близок к десктопной версии системы. Если разработчик уже писал программу или игру для условной Windows 98 - он без особых проблем сможет её портировать и на WM!
Самый ближайший пример - мобильная Age Of Empires, порт полноценной RTS с ПК уже в 2002 году. А компания Astraware выпустила множество адаптаций популярных "шароварок" - например Bejeweled или Zuma.
Уже в 2002 году, HTC Wallaby мог сёрфить полноценный веб 2.0 через PocketIE. Никакого дорогущего WAP-трафика, никаких бедных на контент WML-страниц: хочешь почитать linux.org.ru со своего КПК? Пожалуйста, подключай GPRS и наслаждайся пусть и медленным, но зато полноценным интернетом!
Windows Mobile отлично поддавалась моддингу. Благодаря тому, что исходный код системы и SDK для сборки были свободно доступны в виде демки Platform Builder, энтузиасты быстро изучили формат образов nb0 и написали программы для работы с ними - так называемые кухни. Практически под каждый популярный коммуникатор выходили кастомные прошивки и далеко не всегда они состояли исключительно из патчей или полезного софта: энтузиасты портировали драйвера с других устройств и даже более свежие версии Windows Mobile на 5-6-7 летние коммуникаторы!
Как и десктопная система, Windows Mobile не налагал никаких ограничений на доступ к файловой системе. Хочешь закинуть исправленную dll в папку Windows (если dll была не XIP)? Пожалуйста, никакого рута или джейлбрейка не нужно. Нашел интересную программу или игру? Её даже устанавливать не нужно: можно просто закинуть .exe файл в любую папку и запустить прямо из проводника. Вот это была свобода!
Сейчас объём ОЗУ в 64Мб кажется смешным, но в те годы его более чем хватало! Даже на бюджетном коммуникаторе можно было одновременно запустить с десяток программ и все они работали параллельно и система не выгружала их сама. Никаких "скриншотов" в диспетчере задач как на iOS и Android! Но был и нюанс: в ранних версиях WinCE было жесткое ограничение на 32 процесса.
Чаще всего, WinCE хранила пользовательские данные в ОЗУ на специальном рамдиске (из за медленной NOR-памяти), поэтому к коммуникатору настоятельно рекомендовалось докупать флэшку. В стандартной конфигурации, пользователю доступно чуть меньше 32Мб ОЗУ для программ.
А ещё Windows Mobile отличался крутыми мультимедийными возможностями. Уже в стоке был установлен порт Windows Media Player, который распознавал многие форматы видео и аудио. При этом из коробки поддерживался mp3 с битрейтом 320Кбит/с, что было доступно далеко не каждому портативному устройству в те годы.
Вот так в далёком 2002 году, малоизвестный ODM-производитель HTC сделал смартфон, практически ни в чём не уступающий первому iPhone. Да и по правде сказать, не так уж и сильно он отличался от современного смартфона, ведь у владельца в кармане был полноценный портативных компьютер. И ведь устройство было не только функционально-богатым, но ещё и действительно прочным и надёжным... А как же он был продуман «под капотом»!
А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статью) можно найти на моём YouTube канале.
Очень важно! Разыскиваются девайсы для будущих статей!
Друзья! Для подготовки статей с разработкой самопальных игрушек под необычные устройства, объявляется розыск телефонов и консолей! В 2000-х годах, китайцы часто делали дешевые телефоны с игровым уклоном — обычно у них было подобие геймпада (джойстика) или хотя бы две кнопки с верхней части устройства, выполняющие функцию A/B, а также предустановлены эмуляторы NES/Sega. Фишка в том, что на таких телефонах можно выполнять нативный код и портировать на них новые эмуляторы, чем я и хочу заняться и написать об этом подробную статью и записать видео! Если у вас есть телефон подобного формата и вы готовы его задонатить или продать, пожалуйста напишите мне в Telegram (@monobogdan) или в комментарии. Также интересуют смартфоны-консоли на Android (на рынке РФ точно была Func Much-01), там будет контент чуточку другого формата :)
А также я ищу старые (2010-2014) подделки на брендовые смартфоны Samsung, Apple и т. п. Они зачастую работают на весьма интересных чипсетах и поддаются хорошему моддингу, парочку статей уже вышло, но у меня ещё есть идеи по их моддингу! Также может у кого-то остались самые первые смартфоны Xiaomi (серии Mi), Meizu (ещё на Exynos) или телефоны Motorola на Linux (например, EM30, RAZR V8, ROKR Z6, ROKR E2, ROKR E5, ZINE ZN5 и т. п., о них я хотел бы подготовить специальную статью и видео т. к. на самом деле они работали на очень мощных для своих лет процессорах, поддавались серьезному моддингу и были способны запустить даже Quake!). Всем большое спасибо за донаты!
А ещё я держу все проекты у одного провайдера — Timeweb. Потому рекомендую то, чем пользуюсь сам — вэлкам.
Осторожно: Помните ли вы, как в вашем телефоне Siemens, Motorola и Sony поселились маленькие программы - "эльфы"? В рамках этой статьи мы во всех деталях исследуем прошивку бюджетного кнопочника, разберемся в её архитектуре, хакнем и напишем загрузчик тех самых эльфов с MicroSD-флэшки. При этом я постараюсь объяснить всё максимально простым и доступным языком!
Недавно я познакомился с легендой форума allsiemens.ru — Ilya_ZX, который известен своим огромным вкладом в тему реверса и моддинга телефонов на платформе E-Gold и S-Gold. Илья поведал мне интересную историю о том, как в начале нулевых, будучи студентом, поспорил с одногруппником, сможет ли он добавить «змейку» в свой Siemens A60. И спор он этот выиграл, путем бессонных ночей ковыряния прошивки в IDA Pro! Я подумал — «а чем я хуже?». Взял в руки кнопочный телефон на платформе Spreadtrum, сдампил прошивку и загрузил в дизассемблер...
Если вам интересен подробный процесс реверса различных модулей прошивки, как они взаимодействуют между собой, как я написал программу для применения патчей к фуллфлэшу и, собственно, бинлоадер с первой программой — жду вас под катом!
В прошлой статье я рассказал краткую предысторию того, как энтузиасты из нулевых годов превращали простые кнопочные телефоны в почти полноценные смартфоны с вытесняющей многозадачностью и поддержкой нативных программ. Казалось бы, на пути было множество преград: отсутствие исходного кода прошивок и какой либо документации, заблокированные загрузчики без возможности разблокировки и общая сложность такого процесса, как реверс-инжиниринг.
Но общими усилиями сообщество моддеров делало невозможное. Люди искали уязвимости и патчили загрузчики на телефонах Motorola для обхода проверки подписи RSA, резали тест-поинты и разбирались в BootROM'е процессоров S-Gold в телефонах Siemens, чтобы написать генератор BootKEY для возможности прошивки кастомов и немного ковыряли телефоны Samsung, где не только не было никакого секьюрбута, но ещё и прошивки утекали со всей информацией о символах (файлы .lst).
Но что самое интересное — эльф-сцена до сих пор живая и в профильных чатах уже повзрослевшие ребята до сих пор обсуждают то, как им ускорить порт эмулятора NES путем перемещения кода в IRAM, разогнать процессор Freescale Argon LV и... кто бы мог подумать — написать эмулятор периферии S-Gold для запуска прошивки Benq-Siemens E71 в QEMU. И хотя форумы по Siemens'ам уже давно не работают, MotoFan всё ещё жив и хранит кладезь полезной информации для моддеров и реверсеров!
Одним из таких парней был и @ILYA_ZX, который сделал большой вклад в моддинг-сцену телефонов Siemens. Например, именно благодаря его исследованиям звуковой подсистемы, в S65 и M65 добавили полноценную поддержку MP3, чего не смогла сделать даже сама Siemens. Когда я услышал его историю о том, как он на спор с одногруппником отреверсил и написал «змейку» для своего Siemens A60, я сразу же вдохновился и понял... что нужно обязательно что-нибудь пореверсить и повторить успехи Ильи на какой-нибудь неисследованной платформе, причём желательно достаточно свежей, которую можно встретить в новых бюджетных кнопочниках...
Я начал с поиска в своей коллекции телефонов цели для будущего моддинга. Одними из главных критериев были: относительно быстрая флэш-память для того, чтобы не поседеть в процессе заливки софта и поддержка прошивки через обычный USB без необходимости покупки отдельных кабелей и прошивочных боксов. У меня нашлись несколько телефонов на разных процессорах: MediaTek, Spreadtrum, а также Coolsand (похож на MTK и Spreadtrum, но MIPS, а не ARM). Я поочередно вычитывал с них прошивки с помощью специального сервисного софта, а затем ковырял их в дизассемблере и подбирал подходящую модель.
Моё внимание привлёк телефон Explay B240, который за пару дней до начала процесса мне подарил подписчик Павел, за что ему огромное спасибо.
После загрузки прошивки в IDA Pro, я сразу же полез смотреть строки и искать самые первые необходимые функции: printf, аллокатор динамической памяти, функции libc для работы со строками, а также ABI-функции по типу деления (в ARM аппаратного деления нет).
Большинство функций libc найти очень просто, если иметь представление об их оригинальных сигнатурах. Например, у аллокатора первый аргумент — всегда размер выделяемой памяти. Смотрим, что предполагаемой функции поступает на вход, если похоже на константный размер структуры от оператора sizeof — значит это скорее всего то, что нам нужно.
И вот тут я приметил кое-что очень интересное, что опытный читатель уже мог заметить на скриншоте выше: огромное количество дебажных строк, трейсы почти на каждый чих, а в ассертах есть названия функций и строки, позволяющие легко определить список аргументов. Поискав строчку DEBUG в фуллфлэше, я обнаружил, что производитель вообще не парился и просто заливал в телефон отладочную версию прошивки, что в мире телефонов можно встретить достаточно редко...
Изначально код после загрузки в дизассемблер выглядел странно: и тут и там указатели на несуществующую память, побитые данные и очень малое количество прямых референсов на ROM. И тут Илья взял фулл, поковырял его и сказал — «да это ж Big-Endian, я нутром чую!». И как оказалось — действительно, телефон использовал BE порядок байт.
Для тех, кто не в курсе — в мире компьютеров есть два варианта представления одного и того же многобайтового числа (то есть полуслова, слова, длинного слова): Big Endian и Little Endian. В Little Endian байты числа исчисляются от младшего к старшему, а в Big Endian — от старшего к младшему. Таким образом, если программа, например, захочет загрузить BMP-картинку, ей необходимо будет перевернуть порядок байт в каждом машинном слове заголовка, чтобы получить правильные данные о размере изображения.
Существует также сетевой порядок байт — это Big Endian, он нужен для унификации протокола общения между компьютерами разной архитектуры!
ARM умеет работать в обеих режимах, но до ARMv6 BE и LE аппаратно переключался в процессорном ядре на этапе синтеза или, например, внешним пином. Как раз таки из-за этого перед дизассемблирование ARM-прошивки необходимо сначала узнать её Endianness: например вместо LE-инструкции FE B5 в Thumb у нас будет B5 FE.
Для меня это стало неожиданностью, поскольку из примеров BE на телефонах я знал только легендарные Motorola. После этого я выяснил, что телефон работает на чипсете Spreadtrum SC6500L 2010 года выпуска, который представляет из себя:
Одно ядро ARM9EJ-S на частоте 208МГц в паре с DSP для обработки GSM-радиоканала.
4МБ интегрированной оперативной памяти типа PSRAM и 4МБ NOR-памяти.
Контроллеры LCD-дисплеев и различной периферии, включая SPI, I2C, I2S и GPIO.
Встроенный контроллер питания вместе с модулем чарджера.
И это очень достойные для простого телефона характеристики. Такой чипсет может потянуть не только змейку или Java-игры, но даже эмуляторы ретро-консолей! И 4Мб оперативной памяти для этого хватит с головой. Перспективы дальнейшего моддинга уж точно были!
В реверс-инжиниринге полезно всё: промежуточные elf'ы с прошивкой (axf), таблица символов и тем более исходный код. В поисках слитых исходников прошивки, я наткнулся на архив для гораздо более свежего чипсета — SC6531 (который до сих пор используется в 90% кнопочных телефонов, которые сейчас можно купить в условном DNS до 2.000 рублей), и для общего понимания архитектуры принялся его изучать.
Поскольку кодовая база Spreadtrum тянется из нулевых, прошивка написана по «эмбеддерски» олдскульно: весь код на Plain-C, практически везде глобальные переменные (для экономии RAM, т. к. флэшка поддерживает XIP и маппится в адресное пространство процессора напрямую, а также во избежание фрагментации), UI-построен на модели сообщений как в Windows — то есть, огромные свич-кейсы. Вкратце, архитектуру можно описать так:
В основе лежит RTOS ThreadX, которая также называется Nucleus. В задачи ОСРВ входит реализация вытесняющей многозадачности, включая примитивы синхронизации — мьютексы, семафоры, системного аллокатора, обработчика аппаратных исключений и некоторых других низкоуровневых подсистем.
Nucleus также использовался в телефонах на процессорах MediaTek, Coolsand/RDA, Infineon (Siemens, Panasonic), Freescale (Motorola) и многих других.
Над RTOS реализованы драйверы для работы с железом. Дисплей, звук, коммуникация с DSP, клавиатура — всё это тоже низкоуровневые подсистемы.
Далее идёт UI-подсистема MMI — Man Machine Interface. MMI представляет из себя менеджер окон, служб (например воспроизведение музыки в фоне), GUI-фреймворк для построения интерфейса и апплетов — встроенных в телефон приложений, а также менеджер ресурсов. При этом MMI оперирует жестко-прописанными в прошивке набором окон, где каждая структура содержит строковой идентификатор и указатель на функцию-обработчик событий, что заметно упрощает реверс-инжиниринг этой части прошивки.
Для того, чтобы запустить код с внешнего носителя, необходимо сначала найти функции для работы с файловой системой и пропатчить уже существующую часть прошивки, дабы она могла вызывать наш код в ответ на какое либо действие. С функциями для работы с ФС проблем не возникло. Поскольку трейсов много, я практически сразу нашел необходимый минимум — SFS_OpenFile, SFS_GetFileSize, SFS_SetFilePointer/GetFilePointer, SFS_ReadFile/SFS_WriteFile и SFS_CloseFile.
На вход SFS_OpenFile принимает указатель wchar_t на строку с полным путем к файлу с учетом диска (C:/ — системное хранилище, D:/ — внутренняя память, E:/ — MicroSD), числовой идентификатор с режимом открытия файла и два дополнительных параметра для атрибутов.
Имейте ввиду, что на некоторых мобильных ОС работа с файлами только асинхронная и на коллбэках!
Как я уже говорил ранее, у каждого окна в системе есть функция для обработки сообщений — концепция такая же, как и WndProc на Windows. Если эту самую функцию пропатчить, можно сразу «угнать» контекст MMI и использовать для того, чтобы писать свои собственные GUI-приложения. В качестве вектора атаки я решил использовать какое-нибудь не сильно нужное в повседневной жизни приложение. Например, встроенную игру «Сокобан».
Поскольку реализация игры на моей версии прошивки значительно отличалась от той, что есть в исходном коде, то пришлось искать функцию «по наитию». Сначала нашел функции для управления таймером подсветки, затем от неё несколько WndProc и анализировав одну из функций (в частности то, что она вызывает функции для движения персонажа, а вектор задается значениями -1 и 1 для X и Y), понял, что это скорее всего то, что мне нужно.
Далее я написал небольшой Makefile, ld-скрипт и первый патч, который должен приостанавливать отключение подсветки по таймеру при запуске игры...
Момент заливки прошивки в телефон — самый рисковый, когда все 280 секунд процесса ты лихорадочно изучаешь листинг ассемблера патча в прошивке... чтобы обнаружить, что ты где-то упустил прибавление единицы к адресу функции, поскольку у тебя Thumb (инструкция BX/BLX изменяет режим процессора с ARM на Thumb, если в первом бите адреса функции единица, а в момент прыжка — устанавливает первый бит на ноль и получает таким образом корректный адрес), и получаешь ребут на ровном месте :)
И вот! Спустя несколько перепрошивок всё запустилось! Моей радости просто не было предела! Далее я немного усложнил патч и вызывал функции для работы с файловой системой, дабы понять, какие буквы «диска» используются. Всё заработало и я получил файл "Privet5.txt"!
Поскольку вручную патчить прошивку неудобно, а Vi_Klay не хватает скриптинга, я написал свой редактор патчей с поддержкой С#. Скрипты автоматизируют выполнение многих руинных задач: ищут функции по паттернам, формируют таблицу функций и скрипт линкера, а также патчат фуллфлэш.
using System;
using System.IO;
using MonoPatcher.Scripting;
public static class Script
{
public static void Run()
{
string baseDir = "D:/windows-arm-none-eabi-master/bin/fasolim/";
byte[] firmware = File.ReadAllBytes(baseDir + "firmware.bin");
Patcher.CopyFile(baseDir + "firmware.bin", baseDir + "patched.bin");
if(!File.Exists(baseDir + "bin/binloader.bin"))
{
Patcher.Log.WriteLine("binloader.bin does not exist");
return;
}
byte[] binloader = File.ReadAllBytes(baseDir + "bin/binloader.bin");
using(FileStream strm = File.OpenWrite(baseDir + "patched.bin"))
{
Patcher.Log.WriteLine("Patching game window handler function...");
int handlerOffset = FindWindowHandlerFunction(firmware);
int fmOffset = FindFileManagerFunction(firmware);
if(handlerOffset == -1)
{
Patcher.Log.WriteError("Window handler function not found");
return;
}
if(fmOffset == -1)
{
Patcher.Log.WriteError("FileManager function not found");
return;
}
//Patcher.Log.WriteLine(string.Format("P{0:X}", handlerOffset));
long firmwareEnd = strm.Length;
//Patcher.Append(strm, binloader);
if(firmwareEnd % 4 != 0)
{
Patcher.Log.WriteLine("Please align fullflash to border of 4");
return;
}
// Apply skip boot animation patch
//byte[] skipAnim = File.ReadAllBytes(baseDir + "patches/nopoweronanim.bin");
Patcher.Patch(strm, 0x252FE8, baseDir + "bin/nopoweronanim.bin");
Patcher.InsertNOP(strm, 0x9DC3C4); // Alignment
Patcher.Patch(strm, 0x9DC3C4, baseDir + "bin/fmpatch.bin");
PatchFileAssociation(strm, firmware);
Patcher.InsertNOP(strm, handlerOffset - 2); // Alignment
Patcher.Log.WriteLine("Function address: {0:X}", handlerOffset);
Patcher.Patch(strm, handlerOffset, binloader);
//Patcher.HookFunction(strm, handlerOffset, (int)firmwareEnd | 1, true); // Remember about THUMB!
}
}
}
На данный момент мы уже умеем загружать эльфы с флэшки в ОЗУ и передавать им управление. Однако очень хотелось бы иметь возможность запускать программы из проводника без использования внешнего загрузчика, а значит, пришло время хукать файловый менеджер!
За открытие файлов отвечает функция MMIAPIFMM_OpenFile, которая получает из расширения его внутренний числовой тип. Сначала я думал что у менеджера файлов есть ассоциация расширений с MIME-типами и ассоциативный массив с обработчиками для разных типов файлов, но как оказалось, здесь у нас был большой свич-кейс, что одновременно и плохо с точки зрения красоты и производительности кода, и хорошо для реверс-инжиниринга (есть прямые референсы на функции).
PUBLIC void MMIAPIFMM_OpenFile(wchar *full_path_name_ptr)
{
uint16 full_path_name_len = 0;
uint16 suffix_len = MMIFMM_FILENAME_LEN;
wchar *suffix_wstr_ptr = PNULL;
MMIFMM_FILE_TYPE_E file_type = MMIFMM_FILE_TYPE_NORMAL;
MMIFILE_FILE_INFO_T file_info = {0};
full_path_name_len = MMIAPICOM_Wstrlen(full_path_name_ptr);
case MMIFMM_FILE_TYPE_EBOOK:
{
MMIFMM_ShowTxtContent(full_path_name_ptr);
}
В телефоне есть читалка электронных книг, но пользы от неё немного — кодировок поддерживает мало, выглядит невзрачно. Если захотим, то сами напишем эльф для чтения книг в .txt. Разработчики прошивки очень удачно написали функцию MMIFMM_ShowTxtContent, куда передается указатель на полный путь к нашему файлу, а значит, именно её мы и будем с вами хукать... но сначала сменим ассоциацию файлов с txt на app:
/* Patch description: Replace file association from .txt to .app to make possible hooking EBook with our code */
public static void PatchFileAssociation(FileStream strm, byte[] firmware)
{
int offset = Patcher.PatternSearch(firmware, "01 00 00 00 74 78 74 00");
byte[] ext = { (byte)'a', (byte)'p', (byte)'p' };
if(offset == -1)
{
Patcher.Log.WriteError("Failed to apply file-extension patch");
return;
}
Patcher.Patch(strm, offset + 4, ext);
}
Суть хука простая: мы «воруем» глобальную переменную (массив символов) у какой-то другой, неактивной в данный момент программы и храним в ней строку с путём к нашему эльфу, а затем запускаем окно хукнутой игры. Эльфлоадер стартует, берёт указатель на программу и загружает её, перенаправляя все события ей. Такой вот незамысловатый хук:
В процессе реверса функций для открытия окон в прошивке я нашел скрытое меню... с дополнительной игрой, которая есть в прошивке, но штатными способами до неё невозможно добраться!
Далее я адаптировал бинлоадер на новый лад и по итогу у меня всё заработало...
...но до получения результата мне пришлось два дня подряд не спать всю ночь и сидеть до 5 утра ;)
uint32 readBytes = 0;
uint32 handle;
void** loadAddr = (void**)LOAD_ADDRESS_VARIABLE; // Also filemanager put absolute path to binary here
unsigned int* stateVariable = (unsigned int*)STATE_VARIABLE;
if(msgId == MSG_CLOSE_WINDOW || msgId == MSG_KEYDOWN_CANCEL || msgId == MSG_CTL_CLOSE)
{
MMKCloseWin(window);
*stateVariable = 0;
}
// FIT IN 294 BYTES!!!
if(*stateVariable != STATE_NUMBER)
{
// Initialization state: Load runtime from E:/rt.so to memory, store it's address into some global variable.
wchar_t* str = (wchar_t*)loadAddr;
handle = FileOpen(str, 0x31, 0, 0);
if(!handle)
goto err;
uint32 size = 0;
FileGetSize(handle, &size);
*loadAddr = Alloc(size, "m", 1);
if(!(*loadAddr))
goto err;
FileRead(handle, *loadAddr, size, &readBytes);
if(readBytes == 0)
goto err;
*stateVariable = STATE_NUMBER;
}
else
{
// Program state: MMI keep sending our hooked function events, we pass them directly to loaded program.
// The program can also pass execution to another program by swapping WindowFunc with pointer to loaded program.
LoaderContext ctx = {
__api_table,
loadAddr
};
WindowFunc func = (WindowFunc)(*loadAddr + 1); // Beware of THUMB
func(&ctx, window, msgId, dparam);
}
return 1;
err:
CreateDebugFile(u"D:/E");
return 1;
Далее я решил попробовать вывести что-нибудь на экран и начал реверсить функции для работы с дисплеем. Подсистема графики в телефоне завязана на ROM и вшитые с прошивкой ресурсы, поэтому решил найти функции для получения указателя на фреймбуфер, чтобы иметь возможность отрисовывать произвольную графику и для обновления так называемых «грязных» зон (дабы перерисовывать не весь экран, а только то, что обновилось). Тут пришлось пореверсить и другие игры и программы, поскольку трейсов в этих функциях не было, а в исходниках прошивки графическая подсистема очень сильно отличалась, однако пользуясь дедукцией, я за пару часов нашёл обе функции.
И залил экран желтым цветом:
Поскольку в разных телефонах функции расположены по разным адресам, для унификации программ между ними необходимо реализовать таблицу функций. Саму таблицу можно составить по паттернам одной из уже изученных донорских прошивок и автоматизировать их поиск среди разных телефонов на одном процессоре. Для этого я написал другой скрипт, который экспортирует специальный заголовочный файл с таблицей функцией и макросами для их вызова:
public static ImportedFunction[] Functions = new ImportedFunction[]{
// File IO
new ImportedFunction("Alloc", "B5 F7 1C 07 25 00 37 19 B0 82", "void*", "unsigned int size, char* where, unsigned int lineNumber"),
new ImportedFunction("wstrlen", "1C 01 D1 00 47 70 88 0A", "uint32", "wchar_t* str"),
new ImportedFunction("FileOpen", "B5 FE 1C 05 09 08", "uint32", "wchar_t* fileName, uint32 accessMode, uint32 shareMode, uint32 fileAttributes"),
new ImportedFunction("FileRead", "B5 FF 1C 06 1C 17 1C 1D B0 85 9C 0E 21 00 A0 86 F7 FF F8 2F 1C 23", "uint32", "uint32 handle, void* buffer, uint32 bytesToRead, uint32* bytesRead"), // FileRead as well as FileWrite are similiar due to identical arguments
new ImportedFunction("FileWrite", "B5 FF 1C 06 1C 17 1C 1D B0 85 9C 0E 21 00 A0 8D F7 FF F8 09 1C 23", "uint32", "uint32 handle, void* buffer, uint32 bytesToWrite, uint32* bytesWritten"),
new ImportedFunction("FileClose", "B5 10 1C 04 A0 8A 21", "uint32", "uint32 fileHandle"),
new ImportedFunction("FileGetSize", "B5 B0 1C 05 1C 0C 21 00", "uint32", "uint32 fileHandle, uint32* fileSize"),
new ImportedFunction("MMKCloseWin", "B5 70 25 00 F1 A7", "uint32", "uint32 windowHandle"),
/*new ImportedFunction("TurnOffBacklight", "49 1D B5 10 20 02 60 C8", "void", "uint32 value"),
new ImportedFunction("AllowTurnOffBacklight", "B5 F1 B0 92 24 00 94 11", "void", "uint32 value"),
new ImportedFunction("SetKeypadBacklight", "B5 10 1C 04 1C 01 A0 F4", "void", "uint32 value"),
new ImportedFunction("AllowBacklight", "B5 B0 1C 04 1C 02 48 BF 4D A5", "void", "uint32 value")*/
};
Саму таблицу функций можно расположить в конце прошивки или в теле какой-нибудь BMP-картинки... Например так делали с телефонами Motorola:
Вот такой программный моддинг у нас с вами получился. Надеюсь, вам было интересно! На самом деле ничего сложного в такой модификации нет: у меня были на руках не совсем актуальные, но всё же исходники, а прошивка была собрана в дебаге и в ней было достаточно строк для подробного анализа. Более опытные реверсеры умудряются раскапывать прошивки с куда меньшим количеством документации и без дебаггера, а это значит, что есть куда расти!
И хотя в рамках сегодняшней статьи мы не успели с вами написать реальную программу, задел уже есть и через недельку-другую выйдет вторая часть статьи со змейкой и возможно с эмулятором какой-нибудь ретро-консоли :)
А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статью) можно найти на моём YouTube канале.
Отдельное спасибо: @ILYA_ZX и @Andy51 за мотивацию, @Azq2и @EXL за советы, а также авторам IDA Pro и Ghidra за крутые инструменты! Без вас этой статьи бы не вышло.
Важно: друзья! Я уверен, что статью будут читать выходцы с форумов моддеров и возможно даже ребята, связанные с прошивочными боксами. Если у вас есть исходный код или объектные файлы для телефонов Siemens (S-Gold или E-Gold — не имеет значения) и вы хотели бы помочь общему моддерскому делу — напишите пожалуйста мне в Telegram. Несмотря на то, что этот код уже давно никому не нужен и E-Gold/S-Gold уже более 15 лет снят с производства, гарантирую полную анонимность и крутой контент :)
Очень важно! Разыскиваются девайсы для будущих статей!
Друзья! Если вам понравилась сегодняшняя статья про разработку эльфов, то спешу объявить: для подготовки будущих материалов с разработкой самопальных игрушек под необычные устройства, объявляется розыск телефонов и консолей! В 2000-х годах, китайцы часто делали дешевые телефоны с игровым уклоном — обычно у них было подобие геймпада (джойстика) или хотя бы две кнопки с верхней части устройства, выполняющие функцию A/B, а также предустановлены эмуляторы NES/Sega. Фишка в том, что на таких телефонах можно выполнять нативный код и портировать на них новые эмуляторы, чем я сейчас занимаюсь, а затем написать об этом подробную статью и записать видео! Если у вас есть телефон подобного формата и вы готовы его задонатить или продать, пожалуйста напишите мне в Telegram (@monobogdan) или в комментарии. Также интересуют смартфоны-консоли на Android (на рынке РФ точно была Func Much-01), там будет контент чуточку другого формата :)
А также я ищу старые (2010-2014) подделки на брендовые смартфоны Samsung, Apple и т. п. Они зачастую работают на весьма интересных чипсетах и поддаются хорошему моддингу, парочку статей уже вышло, но у меня ещё есть идеи по их моддингу! Также может у кого-то остались самые первые смартфоны Xiaomi (серии Mi), Meizu (ещё на Exynos) или телефоны на Linux (например Motorola EM30, RAZR V8, ROKR Z6, ROKR E2, ROKR E6, ZINE ZN5 и т. п., о них я хотел бы подготовить специальную статью и видео т. к. на самом деле они работали на очень мощных для своих лет процессорах, поддавались серьезному моддингу и были способны запустить даже Quake!). Всем большое спасибо за донаты!
А ещё я держу все свои мобилы в одной корзине при себе (в смысле, все проекты у одного облачного провайдера) — Timeweb. Потому нагло рекомендую то, чем пользуюсь сам — вэлкам.