Введение Несмотря на чрезвычайную популярность смартфонов, обычные функциональные телефоны не потеряли своей актуальности среди людей, которым необходимы лишь базовые функции связи.
Российский рынок наполнен множеством моделей разных характеристик, размеров, форм-факторов и цветов: от миниатюрных телефонов размером с автомобильный брелок для удобной доставки на зону, до моделей а-ля 90-е, способных убить младенца.
Инои 102 и Страйк F10 Купил телефон Inoi 101: дешевый, но функционально достойный даже по сравнению с более дорогими моделями.
Все бы ничего, если бы не нежелательный функционал, присущий большинству недорогих звонилок:
- Пробные игры при покупке полной версии по SMS , а статус покупки сбрасывается при полной перезагрузке устройства;
- Встроенное меню для СМС-подписок «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 предлагает лучшее в своем классе количество материалов, требования к пространству и соотношение цены и функциональности для полноценных телефонных трубок.Современные телефоны построены в основном на процессорах Spreadtrum и Mediatek на базе архитектуры ARM. Inoi 101 — не только «последний из могикан» на чипе ныне несуществующей компании, но и работает на непопулярной сейчас архитектуре, с не очень известным набором команд. MIPS16e , в котором инструкции закодированы в 2 байта вместо четырех, чтобы уменьшить размер прошивки, что жизненно важно для устройства всего с 4 МБ (32 Мбит) флэш-памяти.Ключевая особенность 1. Процессор MIPS 312 МГц 2.GSM/GPRS-модем 3. Интегрированная флэш-память 32 МБ и PSRAM 64 МБ.
4. Разрешение 320x480 (HVGA)
Печальный факт : Производители современных звонилок агрессивно экономят на флеш-памяти.SoC RDA8826 содержит центральный процессор RDA8809e2, процессор основной полосы CT8851C, модули Bluetooth и FM rdabt_8809 и rdafm_8809. В Интернете не предоставлена достоверная информация обо всех компонентах.Объем, доступный пользователю, обычно выражается как десятки килобайт .
Вы не сможете использовать диктофон или камеру без карты MicroSD. Количество контактов и СМС-сообщений в памяти телефона ограничено, как и длина поля «имя» и общее количество полей в адресной книге.
Для сравнения, в Samsung X100, выпущенном в 2003 году, у пользователя была доступный Памяти 9 мегабайт, в Siemens C65 2004 года - 6 мб.
Это цена за дешевизну: X100 — $230 на старте продаж, Inoi 101 — $9.
Получение прошивки
Чтобы изменить прошивку, вы должны сначала владеть ею.Самый простой вариант — поискать на сайте производителя.
Иной загружает прошивку ко всем ее моделям, но они не всегда самые последние - оказалось, что в версии с сайта нет набора Т9 и игры Тетрис.
Ну телефон уже прошит, придется купить второй и скачать с него последнюю прошивку.
Сделать это можно, в случае с RDA, только сторонними программами, т.н.
«коробочки» — аппаратно-программные комплексы для прошивки и восстановления от сторонних разработчиков.
Обычно нужно купить саму «коробочку» (устройство с набором кабелей) и подписку на софт, но к счастью уже есть взломанная версия подходящего софта, не подключенная и от коробки, и от подписки — Miracle Thunder 2.82 от Gsm_X_Team. Относитесь к этому ПО как к трояну - установите его на отдельный компьютер, без интернета (в виртуальной машине он не работает).
Чудо-гром Официальная прошивка поставляется в текстовом формате .
lod. Этот формат описывает процесс прошивки поблочно, в соответствии с размерами блоков флэш-памяти, в виде загрузочного адреса и двоичных данных, закодированных в 4 байта с прямым порядком байтов.
Формат нестандартный, но простой, без особенностей.
Единственное, что нужно учитывать при написании конвертера, это то, что файл описывает не все флеш-блоки; часть блоков не программируются (есть «дырки»).
Открываем флэш-дамп или конвертированный файл прошивки в любимом дизассемблере, начинаем анализировать и быстро разочаровываемся: строк мало, сегментация памяти непонятна, IDA пытается неправильно определить код MIPS32/MIPS16, тут и там странные указатели 0x82xxxxxx в оперативную память, в которую никто не пишет.#$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 …
Давайте почистим дно бочки
Поскольку мы не можем найти спецификацию процессора, попробуем поискать исходный код, используя несколько строк, найденных в прошивке.Поиск приводит к двум репозиториям: https://github.com/jprothwell/sc-fix И https://github.com/cherryding1/RDA8955_W17.44_IDH По первой ссылке вы можете скачать старые, но вполне актуальные исходники загрузчика, ХАЛ , пользовательский интерфейс и всё железо для чипов старого семейства RDA, а по второй ссылке доступна раскладка памяти [ 1 ], [ 2 ] для нашего процессора.
Из заголовочных файлов мы узнаем самые основные вещи:
- Вспышка расположен по адресу 0x88000000 (4 МБ)
- БАРАН - по адресу 0x82000000 (8 МБ)
- СРАМ - 0x81C00000 (64 КиБ)
- Загрузочный ПЗУ - 0x81E00000
Монолитная архитектура без какой-либо модульности (даже минимальной) не позволяет писать красивый код — в унифицированных *.
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
Несжатая функция в оперативной памяти Отныне нам доступны все распакованные функции и ресурсы в оперативной памяти, что позволяет легко их анализировать.
«Мы покупаем» игры
В рассматриваемом телефоне установлены 3 платные игры производства Gameloft: Опасный рывок , Ниндзя вверх , Тетрис.Первый - раннер, без всякой физики прыжков, второй - примитивный лягушка с одним экраном, играть можно только в тетрис, но он начинает тормозить, когда экран заполняется фигурками.
Каждая игра запускается всего 5 раз, затем вам предлагается заплатить за них.
Игры стоят по 99 рублей каждая - половина цены телефона - плагиат! С точки зрения пользователя покупка совершается так: нажимаем на кнопку «купить», телефон отправляет платное СМС, пользователь получает ответный код, который необходимо ввести в окно регистрации.
Но если вы купите игру, запомните код ответа, перезагрузите телефон и попытаетесь ввести тот же код еще раз, то, скорее всего, это не сработает. Как же так? Алгоритм следующий:
- Генератор псевдослучайных чисел инициализируется текущей минутой;
- Генерируется псевдослучайное число от 1000 до 9999;
- Случайное число отправляется по SMS и сохраняется в NVRAM;
- Код ответа проверяется с учетом сохраненного случайного числа.
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/ Кстати, на телефонах с Медиатеком алгоритм регистрационного кода точно такой же, но алгоритм генерации псевдослучайных чисел другой.
Самый простой способ зарегистрировать игры навсегда — это пропатчить код инициализации, заменив переменное количество запусков демо на переменные для покупки игры.
Поскольку эта функция находится в несжатой области кода, ее изменение не составит труда.
Замена переменных в функции инициализации Вы можете найти функции, отладив строки, содержащие характерное имя файла:
Функция для отображения номера строки файла 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, но с гораздо большей производительностью.Проблема в том, что обычные встроенные утилиты сборки кода для исправления программы, такие как rasm2 от Радаре2 и стул от KeyStone не поддерживают режим MIPS16e. Они либо собирают 32-битные инструкции, даже если выбран 16-битный режим, либо выводят коды операций, которые явно не совместимы с MIPS16e. К счастью, ассемблер gcc поддерживает режим MIPS16e, и работать с ним почти так же удобно, как с rasm2/kstool. Есть, пожалуй, одна особенность: он выравнивает блок по нопам.Вопрос в том, как? В список причин входят новые оптимизированные 16- и 32-битные инструкции, оптимизированная перекодировка инструкций MIPS32, а также оптимизированный формат кода операции и использование регистров.
Ранее заявленный факт, что microMIPS представляет собой законченную архитектуру, а не расширение, также является ключевым.
И MIPS16e, и, если уж на то пошло, технологии ARM Thumb с аналогичной направленностью, являются расширениями.
И microMIPS, и эти расширения основаны на концепции новых 16-битных версий регулярно используемых инструкций для минимизации размера кода.
И все это обеспечивает сокращение размера кода.
Но только microMIPS обеспечивает 32-битную производительность.
Режим microMIPS может обрабатывать все операции, такие как обработка исключений, и предлагает расширенный набор MIPS32 ISA. В MIPS16e программисту приходилось менять режимы, чтобы использовать ASE, такие как MIPS DSP. Режим microMIPS обеспечивает беспрепятственный доступ к ASE. Необходимость запуска устаревшего двоичного кода — действительно единственная причина, которая побуждает программиста использовать режим MIPS32.
$ 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
-
Умные Инновации: Новая Серия Вебинаров Hpe
19 Oct, 24 -
Блог На Node.js
19 Oct, 24 -
Путь Ит-Менеджера (Часть №1)
19 Oct, 24