Motorola, Siemens... Как я хакнул бюджетный кнопочный телефон и научил его запускать "эльфы" - нативные программы на C

Примечание: Вы помните, сколько маленьких программ — «джиннов» — в мобильных телефонах Siemens, Motorola и Sony? В этой статье мы подробно рассмотрим прошивку дешевых кнопочных телефонов, разберемся в ее архитектуре, взломаем ее и напишем загрузчик для этих спрайтов с помощью флешки MicroSD. При этом я постараюсь объяснить все максимально простым и понятным языком!

недавно я познакомился с одной из легенд форума allsiemens.ru - Ilya_ZX, который известен своим большим вкладом в тему мобильного реверс-инжиниринга и моддинга на платформах E-Gold и S-Gold. Илья рассказал мне забавную историю о том, как, будучи студентом в начале 2000-х, он поспорил с однокурсником, сможет ли он добавить «змейку» к своему Siemens A60. Он выиграл спор, проведя бессонные ночи, возясь с прошивкой в ​​IDA Pro! Я подумал: «Разве я могу быть еще хуже?» Я взял кнопочный телефон Spreadtrum, скинул прошивку и загрузил ее в дизассемблер...

если вам интересен подробный процесс реверса различных модулей прошивки, как они взаимодействуют друг с другом, как я написал программу для применения патча к полной прошивке и как на самом деле использовать бинлоадер первой программы - жду вас ниже под клипом!

❯ Предисловие

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

Поиск SKey и HASH в адресном пространстве телефона через уязвимости Java-машины

Но благодаря совместным усилиям сообщества моддеров невозможное стало возможным. Люди находили уязвимости в телефонах Motorola и исправляли загрузчик, чтобы обойти проверку подписи RSA, вырезали контрольные точки и разбирались в BootROM процессора S-Gold в телефонах Siemens, чтобы написать генератор BootKEY для включения пользовательской прошивки, а проведя некоторые исследования на телефонах Samsung, обнаружили, что не только не было безопасной загрузки, но и прошивка также содержала всю информацию о символах (файлы .lst).

Разр V3i

Но самое интересное, что эльфийская сцена до сих пор жива, в специализированных чатах взрослые ребята до сих пор обсуждают, как ускорить порт эмулятора 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 во всей прошивке я обнаружил, что производитель просто не удосужился загрузить на телефон только отладочную версию прошивки, что довольно редко встречается в мире мобильных телефонов...

Какой подарок для специалистов по реверс-инжинирингу!

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

Для тех, кто не знает, в компьютерном мире существует два способа представления одного и того же многобайтового числа (т е полуслова, слова, длинного слова): прямой порядок байтов и обратный порядок байтов. В формате Little Endian номер байта числа вычисляется от меньшего к большему; В Big Endian номер байта числа вычисляется от большего к меньшему. Так, например, если бы программа хотела загрузить изображение BMP, ей пришлось бы поменять местами байты в каждом машинном слове заголовка, чтобы получить правильные данные о размере изображения.

Существует также сетевой порядок байтов — Big Endian, который необходим для унификации протокола связи между компьютерами разной архитектуры!

ARM может работать в обоих режимах, но до ARMv6 BE и LE переключались аппаратно на ядре процессора во время синтеза или, например, через внешний вывод. Из-за этого перед дизассемблированием прошивки ARM необходимо сначала узнать ее порядок байтов: например, в Thumb инструкция LE — это не FE B5, а B5 FE.

Это меня удивило, поскольку единственные известные мне примеры BE на мобильных телефонах — это легендарные телефоны Motorola. Позже я узнал, что телефон работает на чипсете Spreadtrum SC6500L 2010 года, который:

  • Ядро ARM9EJ-S 208 МГц работает в паре с DSP для обработки радиоканалов GSM.

  • 4 МБ интегрированной памяти PSRAM и 4 МБ памяти NOR.

  • ЖК-дисплей и периферийные контроллеры, включая SPI, I2C, I2S и GPIO.

  • Встроенный контроллер питания и зарядный модуль.

Все это очень хорошие функции для среднестатистического телефона. Такой чипсет может справиться не только с играми «Змейка» или Java, но даже с эмуляторами ретро-консолей! 4 МБ оперативной памяти более чем достаточно. Определенно есть перспектива для дальнейших доработок!

в обратном проектировании полезно все: промежуточное программное обеспечение с прошивкой (axf), таблица символов и особенно исходный код. В процессе поиска слитых исходников прошивки я наткнулся на архив более нового чипсета SC6531 (этот чипсет до сих пор используется в 90% кейсовых телефонов и сейчас его можно купить в условных DNS по цене до 2000 рублей), и чтобы полностью понять его архитектуру, я начал его изучать.

Поскольку кодовая база Spreadtrum восходит к 2000-м годам, прошивка написана в старомодном «встроенном» стиле: весь код написан на Plain-C, глобальные переменные присутствуют практически везде (для экономии оперативной памяти, поскольку флэш-накопитель поддерживает XIP и напрямую отображается в адресное пространство процессора, а также для избежания фрагментации), пользовательский интерфейс построен на основе модели сообщений в стиле Windows, т е гигантских переключателей. Вкратце архитектуру можно описать следующим образом:

  • Он основан на ThreadX RTOS, также известной как Nucleus. Задача ОСРВ заключается в реализации вытесняющей многозадачности, включая примитивы синхронизации — мьютексы, семафоры, системные распределители, аппаратные обработчики исключений и некоторые другие низкоуровневые подсистемы.

    Nucleus также используется в мобильных телефонах на базе процессоров MediaTek, Coolsand/RDA, Infineon (Siemens, Panasonic), Freescale (Motorola) и т д.

  • Драйверы, работающие с оборудованием, реализованы поверх ОСРВ. Дисплей, звук, связь с DSP, клавиатура — все это также подсистемы низкого уровня.

  • Далее следует подсистема MMI UI — человеко-машинный интерфейс. MMI — это оконный менеджер, менеджер служб (например, для воспроизведения музыки в фоновом режиме), графический фреймворк для создания интерфейсов и апплетов (приложений, встроенных в телефон) и проводник. При этом MMI работает через набор окон, жестко закодированных в прошивке, где каждая структура содержит строковый идентификатор и указатель на функцию обработки событий, что значительно упрощает обратную разработку этой части прошивки.

❯ «Угоняем» окно MMI

Чтобы запустить код с внешнего диска, необходимо сначала найти функции, используемые для работы с файловой системой, и исправить существующую часть прошивки, чтобы она реагировала на любое действие, вызывающее наш код. Проблем с использованием функций FS не возникает. Поскольку трассировок очень много, необходимый минимум я нашел практически сразу - SFS_OpenFile, SFS_GetFileSize, SFS_SetFilePointer/GetFilePointer, SFS_ReadFile/SFS_WriteFile и SFS_CloseFile.

SFS_OpenFile получает на вход указатель wchar_t на строку, содержащую полный путь к файлу с учетом диска (C:/ — системное хранилище, D:/ — внутренняя память, E:/ — MicroSD), числовой идентификатор с режимом открытия файла и два дополнительных параметра для атрибутов.

Обратите внимание, что в некоторых мобильных ОС обработка файлов выполняется только асинхронно и требует обратного вызова!

Реализация SFS_OpenFile

Как я уже упоминал ранее, каждое окно в системе имеет функцию, обрабатывающую сообщения — та же концепция, что и WndProc в Windows. Если вы исправите эту функцию, вы сможете немедленно «перехватить» контекст MMI и использовать его для написания собственных приложений с графическим интерфейсом. В качестве вектора атаки я решил использовать некоторые приложения, которые не очень полезны в повседневной жизни. Например, встроенная игра «Толкай ящик».

Улитка должна переместить ящик туда, где находятся фекалии

Так как реализация игры на моей версии прошивки сильно отличалась от той, что была в исходном коде, пришлось искать функцию «на ощупь». Сначала я нашел функцию, которая управляет таймером подсветки, затем нашел пару WndProcs из нее, и проанализировав одну из них (конкретно, она вызывала функцию, которая перемещает персонажа, а вектор был задан со значениями -1 и 1 для X и Y), я понял, что это, скорее всего, то, что мне нужно.

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

Самый опасный момент — когда вы загружаете прошивку в телефон, в течение 280 секунд всего процесса вы жадно изучаете ассемблерный листинг патча в прошивке..

Обратите внимание: Кнопочный телефон с большим экраном, камерой, батареей больше чем у некоторых смартфонов..

только чтобы обнаружить, что вы где-то забыли прибавить единицу к адресу функции, потому что вы используете Thumb (инструкции BX/BLX меняют режим процессора с ARM на Thumb, если первый бит адреса функции равен 1, а при переходах они устанавливают первый бит в ноль, давая вам правильный адрес), и вы внезапно перезагружаетесь :)

Прямо здесь! После пары обновлений прошивки все заработало нормально! Я так счастлива! Далее я немного усложнил патч и вызвал функции для работы с файловой системой, чтобы понять, какие буквы дисков используются. Все прошло отлично, и я получил файл «Privet5.txt"!

Первый патч!

Так как вручную патчить прошивку неудобно, а в Vi_Klay отсутствуют скрипты, я написал свой собственный редактор патчей с поддержкой C#. Скрипт автоматизирует множество деструктивных задач: поиск функций по шаблону, формирование таблиц функций и скриптов компоновщика, а также полную прошивку флэш-памяти.

Используйте систему;
Используйте system.io;
Используйте MonoPatcher.Scripting;

Публичный статический класс Script
{

публичный статический void run()
{
string baseDir = "D:/windows-arm-none-eabi-master/bin/fasolim/";

byte прошивка = File.ReadAllBytes(baseDir + "firmware.bin");
Patcher.CopyFile(baseDir + "firmware.bin", baseDir + "patched.bin");

Если (!Файл.Exists(baseDir + "bin/binloader.bin"))
{
Patcher.Log.WriteLine("binloader.bin не существует");

возвращаться;
}

byte binloader = File.ReadAllBytes(baseDir + "bin/binloader.bin");

Использование (FileStream strm = File.OpenWrite(baseDir + "patched.bin"))
{

Patcher.Log.WriteLine("Упаковка функции обработчика игрового окна...");
int handlerOffset = FindWindowHandlerFunction(прошивка);
int fmOffset = FindFileManagerFunction(прошивка);

если (handlerOffset == -1)
{
Patcher.Log.WriteError("Функция обработки окна не найдена");

возвращаться;
}

если (fmOffset == -1)
{
Patcher.Log.WriteError("Функция FileManager не найдена");

возвращаться;
}

//Patcher.Log.WriteLine(string.Format("P{0:X}", handlerOffset));

длинный конец прошивки = strm.length;
//Patcher.Append(strm,binloader);

если (FirmwareEnd%4!=0)
{
Patcher.Log.WriteLine("Пожалуйста, выровняйте полную вспышку по границе 4");

возвращаться;
}

//Применить патч, чтобы пропустить анимацию запуска
//byte skipAnim = File.ReadAllBytes(baseDir + "patches/nopoweronanim.bin");
Patcher.Patch(strm, 0x252FE8, baseDir + "bin/nopoweronanim.bin");
Patcher.InsertNOP(strm, 0x9DC3C4); // Альянс
Патчер.Патч(strm, 0x9DC3C4, baseDir + "bin/fmpatch.bin");

АссоциацияФайлаПатча(strm, firmware);
Patcher.InsertNOP(strm, handlerOffset-2); // Альянс
Patcher.Log.WriteLine("Адрес функции: {0:X}", handlerOffset);
Patcher.Patch(strm, handlerOffset, binloader);

//Patcher.HookFunction(strm, handlerOffset, (int)firmwareEnd | 1, true); // ПОМНИ БОЛЬШОЙ ПАЛЕЦ!
}
}
}

❯ Разбираемся в подсистемах телефона

До сих пор мы видели, как загружать спрайты с флешки в оперативную память и передавать им управление. Однако мне очень хочется иметь возможность запускать программы из Проводника без использования внешнего загрузчика, а значит, пришло время подключить файловый менеджер!

Функция MMIAPIFMM_OpenFile отвечает за открытие файла; он получает внутренний числовой тип из расширения. Сначала я думал, что у файлового менеджера есть расширения, связанные с типами MIME, и ассоциативный массив с различными обработчиками типов файлов, но оказалось, что там есть большой switch case, что плохо с точки зрения эстетики кода и производительности, но хорошо для обратного проектирования (есть прямые ссылки на функции).

Public void MMIAPIFMM_OpenFile(wchar *full_path_name_ptr)
{
uint16 длина полного имени пути = 0;
uint16 suffix_len = MMIFMM_FILENAME_LEN;
wchar *suffix_wstr_ptr = PNULL;
Тип файла MMIFMM_FILE_TYPE_E = MMIFMM_FILE_TYPE_NORMAL;
Информация о файле MMIFILE_FILE_INFO_T = {0};

full_path_name_len = MMIAPICOM_Wstrlen(full_path_name_ptr);


Дело MMIFMM_FILE_TYPE_EBOOK:
{
MMIFMM_ShowTxtContent(fullpathname_ptr);
}

в телефоне есть электронная книга, но она не очень полезна — поддерживает очень мало кодеков, да и внешний вид у нее непривлекательный. Если мы захотим, мы можем написать своего собственного маленького волшебника, который будет читать книги в формате .txt. Разработчики прошивки вполне успешно написали функцию MMIFMM_ShowTxtContent, куда передается указатель на полный путь к нашему файлу, а это значит, что именно его мы и будем перехватывать.. но сначала давайте изменим ассоциацию файла с txt на app:

/* Описание патча: Заменить ассоциацию файлов с .txt на .app, чтобы подключить электронную книгу к нашему коду */
publicstaticvoid PatchFileAssociation(FileStream strm, byte прошивка)
{
int offset = Patcher.PatternSearch(Firmware, "01 00 00 00 74 78 74 00");
байт расширенный = { (байт)'a', (байт)'p', (байт)'p' };

если (смещение == -1)
{
Patcher.Log.WriteError("Не удалось применить исправление расширения файла");

возвращаться;
}

Patcher.Patch(strm, offset+4, ext);
}

суть хука проста: мы «крадем» глобальную переменную (массив символов) из другой, в данный момент неактивной программы и сохраняем в ней строку, содержащую путь к нашему спрайту, после чего запускаем окно привязанной игры. Запускается elfloader, получает указатель на программу и загружает ее, перенаправляя все события на нее. Вот простой крючок:

При отмене функционала открытия окна в прошивке я обнаружил скрытое меню... В прошивке была дополнительная игра, но она не была доступна стандартными методами!

затем я настроил binloader по-новому и, наконец, у меня все заработало...

...но мне пришлось не спать до 5 утра в течение двух дней, прежде чем я получил результаты ;)

uint32 readByte = 0;
дескриптор uint32;

void** loadAddr = (void**)LOAD_ADDRESS_VARIABLE; // Файловый менеджер также помещает сюда абсолютный путь к двоичному файлу
беззнаковое целое* stateVariable = (беззнаковое целое*)STATE_VARIABLE;

если (msgId == MSG_CLOSE_WINDOW || msgId == MSG_KEYDOWN_CANCEL || msgId == MSG_CTL_CLOSE)
{
MMKCloseWin(окно);
*переменная статуса = 0;
}

// Умещается в 294 байта!!!
если (*переменная_состояния != НОМЕР_СОСТОЯНИЯ)
{
// Состояние инициализации: загрузить среду выполнения из E:/rt.so в память и сохранить ее адрес в глобальной переменной.
wchar_t* str = (wchar_t*)loadAddr;

Дескриптор = FileOpen(str, 0x31, 0, 0);

если (!процесс)
Перейти к ошибке;

размер uint32 = 0;
FileGetSize(дескриптор,&размер);
*loadAddr = Alloc(размер, "m", 1);
если (!(*loadAddr))
Перейти к ошибке;

FileRead(handle, *loadAddr, size, &readBytes);

если (readBytes == 0)
Перейти к ошибке;

*переменная состояния = номер состояния;
}
Другой
{
// Состояние программы: MMI продолжает отправлять события нашей функции-ловушки, мы передаем их напрямую загруженной программе.
// Программа также может передать выполнение другой программе, обменяв WindowFunc с указателем на загруженную программу.
контекст загрузчика ctx = {
__api_table,
Загрузить адрес
};
Функция WindowFunc = (WindowFunc)(*loadAddr + 1); // Будьте осторожны с THUMB

func(&ctx, window, msgId, dparam);
}

возврат 1;
Ошибки:
create_debug_file(u"D:/E");
возврат 1;

Затем я решил попробовать отобразить что-нибудь на экране и начал инвертировать функционал для работы с дисплеем. Графическая подсистема в телефоне привязана к ресурсам, заложенным в ПЗУ и прошивке, поэтому я решил найти функции, которые получают указатель кадрового буфера, чтобы я мог рисовать произвольную графику и обновлять так называемые «грязные» области (чтобы не перерисовывать весь экран, а только то, что было обновлено). Здесь мне пришлось заняться обратным проектированием других игр и программ, так как в исходном коде прошивки не было никаких следов этих функций, а графическая подсистема сильно отличалась, но методом дедукции я нашел эти две функции за несколько часов.

Экран залит желтым цветом:

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

Публичные статические ImportedFunction функции = new ImportedFunction{
// Файловый ввод и вывод
New ImportedFunction("Alloc", "B5 F7 1C 07 25 00 37 19 B0 82", "void*", "размер беззнакового целого числа, char* где, беззнаковое целое число lineNumber"),
Новая импортированная функция("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 и FileWrite похожи, поскольку имеют одинаковые параметры
Новая 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, буфер void*, uint32 байтов для записи, uint32* байтов для записи"),
Новая 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"),
Новая 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"),
Новая ImportedFunction("AllowTurnOffBacklight", "B5 F1 B0 92 24 00 94 11", "void", "uint32 value"),
Новая импортированная функция("SetKeypadBacklight","B5 10 1C 04 1C 01 A0 F4","void","uint32 value"),
Новая импортированная функция("AllowBacklight","B5 B0 1C 04 1C 02 48 BF 4D A5","void","uint32 value")*/
};

Саму таблицу функций можно поместить в конец прошивки или в тело какого-нибудь BMP-изображения... Например, для телефонов Motorola они делают следующее:

❯ Заключение

Это тот тип модификации программного обеспечения, который мы получаем. Надеюсь, вам будет интересно! На самом деле, такая модификация несложная: у меня под рукой есть исходный код прошивки, пусть и не последней, скомпилированной в отладке, и строк для детального анализа там достаточно. Более опытные специалисты по реверс-инжинирингу могут разобраться в прошивке, имея меньше документации и отладчиков, а это значит, что есть куда расти!

Хоть в рамках сегодняшней статьи мы и не успели написать настоящую программу, но задел уже есть и через неделю-другую во второй части статьи будет змейка и, возможно, какие-нибудь эмуляторы ретро-консолей :)

Если вам интересна тема ремонта, модификации и программирования гаджетов последних нескольких лет, подписывайтесь на мой Telegram-канал «Happiness Fan Club», где я выкладываю закулисье статей, ссылки на новые статьи и видео, а иногда выкладываю полезные посты и заблокированные посты. Видеоролики (не всегда являющиеся повторами статей) можно найти на моем канале YouTube.

Особая благодарность: @ILYA_ZX и @Andy51 за мотивацию, @Azq2 и @EXL за советы, а также авторам IDA Pro и Ghidra за крутые инструменты! Без вас эта статья не была бы опубликована.

Важное примечание: Друзья! Я уверен, что это прочитают люди с форумов по моддингу и даже те, кто связан с прошивками приставок. Если у вас есть исходный код или объектные файлы для телефонов Siemens (S-Gold или E-Gold - неважно) и вы хотите помочь общему делу моддинга - напишите мне, пожалуйста, в Telegram. Несмотря на то, что код больше никому не нужен, а E-Gold/S-Gold не выпускаются уже более 15 лет, я обещаю полную анонимность и крутой контент :)

Всего голосов:
Всего голосов:

Очень важно! Необходимое оборудование для будущих статей!

Друзья! Если вам понравилась сегодняшняя статья о разработке эльфов, то спешу объявить: с целью подготовки будущих материалов для разработки самодельных игрушек для необычных устройств объявляется поиск телефонов и консолей! В XXI веке китайцы часто выпускают дешевые телефоны, в центре которых — игры. Обычно они оснащены каким-то геймпадом (джойстиком) или, по крайней мере, двумя кнопками на верхней панели устройства, которые выполняют функции 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. Вот почему я беззастенчиво рекомендую то, чем пользуюсь сам — добро пожаловать.

[Мой] Голосование за покупку мобильных телефонов, гаджетов, программирование, обратная разработка, модификация полета, взлом смартфона, Gif, длинный пост 64

Больше интересных статей здесь: Гаджеты.

Источник статьи: Motorola, Siemens... Как я хакнул бюджетный кнопочный телефон и научил его запускать "эльфы" - нативные программы на C.