Небольшая Модификация Прошивки Кнопочного Телефона На Платформе Rda8826 (Sc6533, Mips): Отключить Funbox, Взломать Игры



Введение Несмотря на чрезвычайную популярность смартфонов, обычные функциональные телефоны не потеряли своей актуальности среди людей, которым необходимы лишь базовые функции связи.

Российский рынок наполнен множеством моделей разных характеристик, размеров, форм-факторов и цветов: от миниатюрных телефонов размером с автомобильный брелок для удобной доставки на зону, до моделей а-ля 90-е, способных убить младенца.



Небольшая модификация прошивки кнопочного телефона на платформе RDA8826 (SC6533, MIPS): отключить Funbox, взломать игры

Инои 102 и Страйк F10 Купил телефон Inoi 101: дешевый, но функционально достойный даже по сравнению с более дорогими моделями.

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

  • Пробные игры при покупке полной версии по SMS , а статус покупки сбрасывается при полной перезагрузке устройства;
  • Встроенное меню для СМС-подписок «Funbox» : гороскопы, анекдоты, новости, прочая платная ерунда.



Небольшая модификация прошивки кнопочного телефона на платформе RDA8826 (SC6533, MIPS): отключить Funbox, взломать игры

Платные игры и меню Funbox Попробуем устранить недостатки путем анализа и модификации прошивки.



Чипсет

Современные кнопочные устройства построены на платформах трёх производителей: RDA Microelectronics, Spreadtrum, Mediatek. Первой компании больше не существует: ее купила компания Spreadtrum в середина 2015 года .

Обе компании провели ребрендинг под названием Unisoc в 2018 году.

Рассматриваемый телефон работает на новейшем чипе «классического» RDA семейства Gallite и изготовлен после покупки компании, поэтому чип имеет два названия: RDA8826C (RDA’s) и SC6533g (Spreadtrum’s).

В Интернете не только даташиты, но и общедоступной информации об этой модели почти нет. Архивный Страница сайта rdamicro.com 2017 год скупо рассказывает нам о ключевых возможностях SoC:

Общее описание RDA8826C — это высокопроизводительная, высокоинтегрированная система на кристалле для недорогого, маломощного мобильного телефона GSM/GPRS. Объединив все основные электронные компоненты, включая основной диапазон, четырехдиапазонный радиочастотный приемопередатчик, систему управления питанием, FM-приемник, Bluetooth в единой системе на кристалле, RDA8826C предлагает лучшее в своем классе количество материалов, требования к пространству и соотношение цены и функциональности для полноценных телефонных трубок.

Ключевая особенность 1. Процессор MIPS 312 МГц 2.GSM/GPRS-модем 3. Интегрированная флэш-память 32 МБ и PSRAM 64 МБ.

4. Разрешение 320x480 (HVGA)

Современные телефоны построены в основном на процессорах Spreadtrum и Mediatek на базе архитектуры ARM. Inoi 101 — не только «последний из могикан» на чипе ныне несуществующей компании, но и работает на непопулярной сейчас архитектуре, с не очень известным набором команд. MIPS16e , в котором инструкции закодированы в 2 байта вместо четырех, чтобы уменьшить размер прошивки, что жизненно важно для устройства всего с 4 МБ (32 Мбит) флэш-памяти.

Печальный факт : Производители современных звонилок агрессивно экономят на флеш-памяти.

Объем, доступный пользователю, обычно выражается как десятки килобайт .

Вы не сможете использовать диктофон или камеру без карты MicroSD. Количество контактов и СМС-сообщений в памяти телефона ограничено, как и длина поля «имя» и общее количество полей в адресной книге.

Для сравнения, в Samsung X100, выпущенном в 2003 году, у пользователя была доступный Памяти 9 мегабайт, в Siemens C65 2004 года - 6 мб.

Это цена за дешевизну: X100 — $230 на старте продаж, Inoi 101 — $9.

SoC RDA8826 содержит центральный процессор RDA8809e2, процессор основной полосы CT8851C, модули Bluetooth и FM rdabt_8809 и rdafm_8809. В Интернете не предоставлена достоверная информация обо всех компонентах.



Получение прошивки

Чтобы изменить прошивку, вы должны сначала владеть ею.

Самый простой вариант — поискать на сайте производителя.

Иной загружает прошивку ко всем ее моделям, но они не всегда самые последние - оказалось, что в версии с сайта нет набора Т9 и игры Тетрис.

Ну телефон уже прошит, придется купить второй и скачать с него последнюю прошивку.

Сделать это можно, в случае с RDA, только сторонними программами, т.н.

«коробочки» — аппаратно-программные комплексы для прошивки и восстановления от сторонних разработчиков.

Обычно нужно купить саму «коробочку» (устройство с набором кабелей) и подписку на софт, но к счастью уже есть взломанная версия подходящего софта, не подключенная и от коробки, и от подписки — Miracle Thunder 2.82 от Gsm_X_Team. Относитесь к этому ПО как к трояну - установите его на отдельный компьютер, без интернета (в виртуальной машине он не работает).



Небольшая модификация прошивки кнопочного телефона на платформе RDA8826 (SC6533, MIPS): отключить Funbox, взломать игры

Чудо-гром Официальная прошивка поставляется в текстовом формате .

lod. Этот формат описывает процесс прошивки поблочно, в соответствии с размерами блоков флэш-памяти, в виде загрузочного адреса и двоичных данных, закодированных в 4 байта с прямым порядком байтов.

Формат нестандартный, но простой, без особенностей.

Единственное, что нужно учитывать при написании конвертера, это то, что файл описывает не все флеш-блоки; часть блоков не программируются (есть «дырки»).

  
  
  
  
  
   

#$mode=flsh_spi32m #$sectormap=(16 x 4k, 57 x 64k, 96 x 4k) #$base=0x08000000 #$spacesize=0x08000000 #$XCV_MODEL=xcv_8809e2 #$PA_MODEL=pasw_hs8292u #$FLSH_MODEL=flsh_spi32m #$FLASH_SIZE=0x00400000 #$RAM_SIZE=0x00800000 #$RAM_PHY_SIZE=0x00800000 #$CALIB_BASE=0x003FA000 #$FACT_SETTINGS_BASE=0x003FE000 #$CODE_BASE=0x00000000 #$USER_DATA_BASE=0x00380000 #$USER_DATA_SIZE=0x0007A000 #$PM_MODEL=pmu_8809 #$FM_MODEL=rdafm_8809e @08000000 d9ef0045 00000000 00000000 00000000 27bdffd0 afb10028 00808821 3c0481e0 …

Открываем флэш-дамп или конвертированный файл прошивки в любимом дизассемблере, начинаем анализировать и быстро разочаровываемся: строк мало, сегментация памяти непонятна, IDA пытается неправильно определить код MIPS32/MIPS16, тут и там странные указатели 0x82xxxxxx в оперативную память, в которую никто не пишет.

Небольшая модификация прошивки кнопочного телефона на платформе RDA8826 (SC6533, MIPS): отключить Funbox, взломать игры



Давайте почистим дно бочки

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

Поиск приводит к двум репозиториям: https://github.com/jprothwell/sc-fix И https://github.com/cherryding1/RDA8955_W17.44_IDH По первой ссылке вы можете скачать старые, но вполне актуальные исходники загрузчика, ХАЛ , пользовательский интерфейс и всё железо для чипов старого семейства RDA, а по второй ссылке доступна раскладка памяти [ 1 ], [ 2 ] для нашего процессора.

Из заголовочных файлов мы узнаем самые основные вещи:

  • Вспышка расположен по адресу 0x88000000 (4 МБ)
  • БАРАН - по адресу 0x82000000 (8 МБ)
  • СРАМ - 0x81C00000 (64 КиБ)
  • Загрузочный ПЗУ - 0x81E00000
Пользовательский интерфейс на моем устройстве построен на форке MMI (человеко-машинный интерфейс) от Pixtel — CoolMMI. Подобный фреймворк также используется в ОС для кнопочных телефонов Mediatek MAUI под названием PlutoMMI. Фреймворк создан в лучшие годы кнопочных телефонов, с соответствующим качеством кода — всё завязано на глобальные переменные, глобальные состояния, магические константы, массивы строк, массивы функций-обработчиков кнопок.

Монолитная архитектура без какой-либо модульности (даже минимальной) не позволяет писать красивый код — в унифицированных *.

c файлах для всех случаев активируется различная функциональность, что затрудняет чтение кода.

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



/* Get current screen to gui buffer for history purposes*/ guiBuffer = GetCurrGuiBuffer( SCR_CALL_TIME_SETUP_MAIN ); /* Retrieve no of child of menu item to be displayed */ nNumofItem = GetNumOfChild( MENU_CALL_TIME_SETUP ); /* Get attribute of menu to be displayed */ //nDispAttribute = GetDispAttributeOfItem( MENU_CALL_TIME_SETUP ); /* Retrieve string ids in sequence of given menu item to be displayed */ GetSequenceStringIds( MENU_CALL_TIME_SETUP, nStrItemList ); /* Set current parent id*/ SetParentHandler( MENU_CALL_TIME_SETUP ); /* Register highlight handler to be called in menu screen */ RegisterHighlightHandler( ExecuteCurrHiliteHandler ); /* Construct hint for menu items */ ConstructHintsList(MENU_CALL_TIME_SETUP, displayBuffer); /* Display Category1 Screen */ ShowCategory52Screen( STR_MENU_CALL_TIME_SETUP, IMG_MENU_CALL_TIMES, STR_GLOBAL_OK, IMG_GLOBAL_OK, STR_GLOBAL_BACK, IMG_GLOBAL_BACK, nNumofItem, nStrItemList, (U16 *)gIndexIconsImageList, displayBuffer, 0, 0, guiBuffer ); /* Register function with right softkey */ SetKeyHandler( GoBackHistory,KEY_LEFT_ARROW, KEY_EVENT_DOWN); SetRightSoftkeyFunction( GoBackHistory, KEY_EVENT_UP ); return;

Первичную информацию об основных функциях PlutoMMI от Mediatek можно почерпнуть из файла Структура и архитектура mmi.pdf .

Архитектура CoolMMI и PlutoMMI достаточно схожа, чтобы можно было использовать (столь же скудную) документацию конкурирующих производителей.



Поиск сжатых ресурсов

Итак, память размечена правильно, но принципиальных изменений не видно — многие функции продолжают вызывать код из ОЗУ, но сразу найти, кто пишет по этим адресам, невозможно.

И ресурсов подозрительно мало.

После краткого анализа выявляются три особенности: Повторное использование функций из BootROM Для максимальной экономии места во флэш-памяти производитель реализовал наиболее популярные функции библиотеки C непосредственно в ПЗУ чипа: строковые функции (strlen, strcmp, strcpy, strcat, strtok), функции сравнения и копирования памяти (memcmp, memcpy , memmem, memchr), форматирование и вывод (sprintf, vsprintf), поиск и сортировка (bsearch, qsort) вызываются из памяти ПЗУ, и не содержатся в коде прошивки, экономя драгоценные килобайты.

Сжатие кода и ресурсов с использованием алгоритма LZMA Код наиболее объемных «модулей» (WAP-браузер, мультимедийный плеер, приложение FM-радио, инженерное меню) хранится в сжатом виде и распаковывается один раз при запуске телефона.

Ничего дополнительного после распаковки не происходит: код устроен так, как будто эти модули всегда находятся в оперативной памяти по фиксированным адресам.

Текстовые строки распаковываются аналогично, но только для одного, текущего языка.

Копирование несжатого кода в оперативную память Самый архитектурно важный код ОС копируется в оперативную память и выполняется из нее.

Вероятно, это сделано для максимального увеличения скорости выполнения основных функций ОС.

Сжатые ресурсы легко найти через пешеходная дорожка .

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



Удаление оперативной памяти

Оказалось, что протокол прошивки не только прост, но и позволяет читать произвольные адреса без какой-либо подготовки, прямо во время работы телефона.

Готовая программа для чтение прошивки через UART , который после модификации использовался для чтения всех 8 МБ ОЗУ через USB. 2 минуты – и никакой ручной работы! Чтобы получить командный порт через USB, вы можете использовать модуль usb-serial в Linux. Достаточно просто «научить» модуль работать с RDA:

$ echo 1e04 0900 | sudo tee /sys/bus/usb-serial/drivers/generic/new_id



Небольшая модификация прошивки кнопочного телефона на платформе RDA8826 (SC6533, MIPS): отключить Funbox, взломать игры

Несжатая функция в оперативной памяти Отныне нам доступны все распакованные функции и ресурсы в оперативной памяти, что позволяет легко их анализировать.



«Мы покупаем» игры

В рассматриваемом телефоне установлены 3 платные игры производства Gameloft: Опасный рывок , Ниндзя вверх , Тетрис.

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

Каждая игра запускается всего 5 раз, затем вам предлагается заплатить за них.

Игры стоят по 99 рублей каждая - половина цены телефона - плагиат! С точки зрения пользователя покупка совершается так: нажимаем на кнопку «купить», телефон отправляет платное СМС, пользователь получает ответный код, который необходимо ввести в окно регистрации.

Но если вы купите игру, запомните код ответа, перезагрузите телефон и попытаетесь ввести тот же код еще раз, то, скорее всего, это не сработает. Как же так? Алгоритм следующий:

  1. Генератор псевдослучайных чисел инициализируется текущей минутой;
  2. Генерируется псевдослучайное число от 1000 до 9999;
  3. Случайное число отправляется по SMS и сохраняется в NVRAM;
  4. Код ответа проверяется с учетом сохраненного случайного числа.

Ссылка запрос-ответ уникальна для каждой модели и зависит от минуты нажатия кнопки «купить»:

game_response_code = (1000 * (game_random % 10) + game_random / 1000 + 100 * (game_random / 10 % 10) + 10 * (game_random / 100 % 10)) ^ 0x1D6B; game_code_temp = game_response_code; game_response_code = atoi("28060") + game_code_temp; return game_response_code == input_code;

Где 28060 — это идентификатор телефона Inoi 101. Этот простой алгоритм можно легко реализовать в виде генератора ключей, что я и сделал: http://gameloft-keygen.valdikss.org.ru/ Кстати, на телефонах с Медиатеком алгоритм регистрационного кода точно такой же, но алгоритм генерации псевдослучайных чисел другой.

Самый простой способ зарегистрировать игры навсегда — это пропатчить код инициализации, заменив переменное количество запусков демо на переменные для покупки игры.

Поскольку эта функция находится в несжатой области кода, ее изменение не составит труда.



Небольшая модификация прошивки кнопочного телефона на платформе RDA8826 (SC6533, MIPS): отключить Funbox, взломать игры

Замена переменных в функции инициализации Вы можете найти функции, отладив строки, содержащие характерное имя файла:

Небольшая модификация прошивки кнопочного телефона на платформе RDA8826 (SC6533, MIPS): отключить Funbox, взломать игры

Функция для отображения номера строки файла src/gameloft_billing.c

Отключить Funbox

Меню платных СМС-подписок — ожидаемая, но неуместная послепродажная функция для заработка производителя.

Один неловкий клик и вам гарантировано минимум 5 рублей в день со счета.

Такие вещи позволяют нам держать цены на кнопочные телефоны на очень низком уровне, но в моем аппарате им нет места.

Как и в играх, функции Funbox имеют отладочный номер строки с именем файла «src/gmb_smart_sms_win.c».

Из этих строк можно «подняться» к функции-обработчику подсветки элемента главного меню (в CoolMMI они называются hilite, что, очевидно, означает подсветка), в котором находится иконка.

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



Коррекция громкости

Компонент аудиоусилителя телефона имеет 15 уровней усиления, но для мультимедиа прошивка телефона допускает только 7 уровней громкости с большим шагом между ними.

Это неудобно: на «раз» телефон еле слышно, а на «два» сразу ОРИТ.

Попробуем исправить эту проблему.

В файлах заголовков регистр CONFIG_REGS быстро располагается по базовому адресу.

0x01A24000 , структура которого описывается следующим образом:

#define REG_CONFIG_REGS_BASE 0x01A24000 #define hwp_configRegs ((HWP_CFG_REGS_T*) KSEG1(REG_CONFIG_REGS_BASE)) typedef volatile struct { REG32 CHIP_ID; //0x00000000 /// This register contain the synthesis date and version REG32 Build_Version; //0x00000004 /// Setting bit n to '1' selects GPIO Usage for PAD connected to GPIOn. Setting /// bit n to '0' selects Alt. REG32 GPIO_Mode; //0x00000008 REG32 Alt_mux_select; //0x0000000C REG32 IO_Drive1_Select; //0x00000010 REG32 IO_Drive2_Select; //0x00000014 REG32 audio_pd_set; //0x00000018 REG32 audio_pd_clr; //0x0000001C REG32 audio_sel_cfg; //0x00000020 REG32 audio_mic_cfg; //0x00000024 REG32 audio_spk_cfg; //0x00000028 REG32 audio_rcv_gain; //0x0000002C REG32 audio_head_gain; //0x00000030 } HWP_CFG_REGS_T; //audio_spk_cfg #define CFG_REGS_AU_SPK_GAIN(n) (((n)&15)<<0) #define CFG_REGS_AU_SPK_MUTE_N (1<<4)

Регистр используется через сегмент КСЭГ1 , минуя MMU и кеши.

Полный адрес audio_spk_cfg, вызовы к которому нужно искать в дизассемблере — 0xA1A24028 .

После недолгих поисков обнаруживается функция, преобразующая уровень усиления (видимо, в децибелах) в значение SPK_GAIN:

int __fastcall volume_maps(int a1) // 0x88038184 { int result; // $v0 result = 0; if ( a1 >= 5 ) { result = 2; if ( a1 >= 14 ) { result = 4; if ( a1 >= 18 ) { result = 6; if ( a1 >= 20 ) { result = 8; if ( a1 >= 22 ) { result = 10; if ( a1 != 22 ) { result = 12; if ( a1 != 23 ) return 14; } } } } } } return result; }

Изменяя уровни с [0, 2, 4, 6, 8, 10, 12, 14] на [0, 1, 2, 3, 5, 6, 8, 10], мы получаем более плавное управление за счет снижения максимальную громкость, которая по-прежнему лишь перегружала маломощный динамик телефона.

Хотя положительный эффект очевиден при воспроизведении файлов MP3, громкость FM-радио по-прежнему регулируется с недостаточной степенью детализации.

Вероятно, это аппаратная проблема с подключением FM-чипа.



Неожиданные трудности

Для MIPS существует два стандарта 16-битных инструкций: MIPS16e и microMIPS. Первый — это расширение архитектуры MIPS32: код может использовать оба набора инструкций одновременно, процессор может переключаться между режимами выполнения MIPS32 и MIPS16e в любой момент, перейдя на нечетный адрес инструкции.

Не все инструкции и возможности MIPS можно выразить с помощью инструкций MIPS16e — иногда переключение в режим MIPS32 просто необходимо.

microMIPS — это полноценная архитектура с полным набором 16-битных инструкций.

Вот что говорится в официальной брошюре:

Тесты показывают, что архитектура microMIPS обеспечивает такую же экономию памяти, как и MIPS16e ASE, но с гораздо большей производительностью.

Вопрос в том, как? В список причин входят новые оптимизированные 16- и 32-битные инструкции, оптимизированная перекодировка инструкций MIPS32, а также оптимизированный формат кода операции и использование регистров.

Ранее заявленный факт, что microMIPS представляет собой законченную архитектуру, а не расширение, также является ключевым.

И MIPS16e, и, если уж на то пошло, технологии ARM Thumb с аналогичной направленностью, являются расширениями.

И microMIPS, и эти расширения основаны на концепции новых 16-битных версий регулярно используемых инструкций для минимизации размера кода.

И все это обеспечивает сокращение размера кода.

Но только microMIPS обеспечивает 32-битную производительность.

Режим microMIPS может обрабатывать все операции, такие как обработка исключений, и предлагает расширенный набор MIPS32 ISA. В MIPS16e программисту приходилось менять режимы, чтобы использовать ASE, такие как MIPS DSP. Режим microMIPS обеспечивает беспрепятственный доступ к ASE. Необходимость запуска устаревшего двоичного кода — действительно единственная причина, которая побуждает программиста использовать режим MIPS32.

Проблема в том, что обычные встроенные утилиты сборки кода для исправления программы, такие как rasm2 от Радаре2 и стул от KeyStone не поддерживают режим MIPS16e. Они либо собирают 32-битные инструкции, даже если выбран 16-битный режим, либо выводят коды операций, которые явно не совместимы с MIPS16e. К счастью, ассемблер gcc поддерживает режим MIPS16e, и работать с ним почти так же удобно, как с rasm2/kstool. Есть, пожалуй, одна особенность: он выравнивает блок по нопам.



$ echo 'jr $ra' | mips64-linux-gnu-as -o /dev/null -al -mips16 -32 GAS LISTING page 1 1 0000 E8206500 jr $ra 1 65006500 1 65006500 1 65006500



Заключение

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

Эти дешевые, но полнофункциональные телефоны с двумя SIM-картами и доступом в Интернет, доступные в любом магазине, просто умоляют хакеров подобрать их для адаптации не только к базовым потребностям связи.

Как оказывается, нет ничего сложного в том, чтобы минимально изменить функциональность таких устройств.

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

Готовую модифицированную прошивку для Inoi 101 можно скачать на GSMForum.ru: https://gsmforum.ru/threads/inoi-101-modificirovannaja-proshivka.337775/ Теги: #Гаджеты #Сотовая связь #обратное проектирование #модификация #функциональный телефон #кнопочные телефоны #keygen #rda8826 #sc6533

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.