eXTracted INternals

eXTracted INternals
 
ФорумФорум  ЧаВоЧаВо  ПоискПоиск  РегистрацияРегистрация  ПользователиПользователи  ГруппыГруппы  Вход  

Поделиться | 
 

 Пишем RamLoader для телефона

Предыдущая тема Следующая тема Перейти вниз 
АвторСообщение
Hex

avatar

Количество сообщений : 397
Возраст : 35
Дата регистрации : 2006-07-12

СообщениеТема: Пишем RamLoader для телефона   Вс 28 Окт - 17:29

На самом деле очень тяжело сподвигнуть себя на такой необычный шаг как написание Ram-loader'а. Реверсить код, патчить прошивку - это одно, но вот сделать свой собственный код, который будет заливаться на девайс в режиме бутлоадера... Как-то все туманно и непонятно.

1) Что такое Ramloader
Ramloader - это кусочек кода который заливается в RAM телефона и выполняется там же. Как он туда попадает и за чем он нужен? Флэшеры используют рамлоадер для заливки прошивки в телефон, ну а мы можем использовать его для своих нужд. Зачем флэшеру рамлоадер? Затем что телефон не может сам себя прошить когда на нем запущена ОС. Нужен код который запустится вместо ОС. Во всех современных телефонах предусмотрен механизм загрузки рамлоадера. Загружает рамлоадер в RAM телефона код, который зачастую лежит в процессоре (IROM), но бывает что код принимающий рамлоадер через USB/COM порт лежит в специальной области flash памяти, т.е. рядом с основной прошивкой.

2) Что делает Ramloader когда стартует в RAM.
Ramloader практически один в один повторяет старт ОС в прошивке. То есть он настраивает регистры процессора, адреса прерываний, выставляет адрес стека, инициализирует минимально необходимый набор железа. Потом инициализирует коммуникационный порт и входит в цикл обработки команд с компьютера.

3) Что нужно чтобы написать свой RamLoader.
Если у вас есть пример бинаря из флэшера - то совсем немного. Но придется реверсить Smile
Что нужно:
* Базовый адрес загрузки
* Стартап код
* Регистры/функции работы с коммуникационным портом
ВСЕ!

То есть надо выдрать инициализацию как она есть, и разобраться как посылать/принимать данные с компа.
Из-за того, что размер рамлоадеров обычно не более 50 кб. Разобраться там особого труда не составляет.

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


Когда реверсинг закончен наступает самое противное. Надо теперь в чем-то писать весь этот код Ramloader'a, и как-то собрать бинарь.

Пишем Ramloader в ARM SDT/ARM Developer Suite/ARM Realview Developer Suite
Выписываем стартап код в .s файл и делаем в конце переходник в сишный код. Вот примерчик стартап кода:
Код:

AREA    RESET, CODE, READONLY

CODE32
 
ENTRY
start   
      MRS   R0, CPSR
      ORR   R1, R0,   #0x80
      MSR   CPSR_c,   R1
      TEQP   R1, #0xD7
      LDR   SP, =Stackbase1
      TEQP   R1, #0xDB
      LDR   SP, =Stackbase2
      TEQP   R1, #0xD2
      LDR   SP, =Stackbase3
      TEQP   R1, #0xD3
      LDR   SP, =Stackbase4
        LDR  R12,  Main_Addr
        BX    R12
 
  IMPORT  __program_start     
 
Main_Addr DCD __program_start 
 
   
Stackbase1 DCD  0x808600     
Stackbase2 DCD  0x808700
Stackbase3 DCD  0x808500   
Stackbase4 DCD  0x807D00   

     
END

И делаем главную функцию
Код:

int __program_start(void)
{
   return 1;
}

Вот это у нас минимальный код, код инициализации UART/USB уже можно смело писать на Си.
А вот теперь начинается самое интересное. Как это все собрать, так чтобы сишный код лег в Ramloader'e после ассемблерного. Для этого надо создать scatter-файл вот с таким содержимым:
Код:

LOADREG1 0x800000 0x4000
{
   EXECREG1 0x800000
   {
      init.o (BOOT_INIT, +FIRST)
      * (+RO)
      
   }
}
init.o - имя object файла с ассемблерным стартапом.
0x800000 - Базовый адрес
0x4000 - максимальный размер

И потом указать в настройках линкера путь к scatter-файлу. В зависимости от IDE, настройка scatter-файла может быть в разных меню. Но конечным результатом должно быть добавление в командную строку линкера параметра "-scatter <путь>".
Теперь еще надо убрать init.s из списка Link Order, иначе линкер будет пытаться прилепить еще одну копию init.s в конец образа.
И последнее, нам надо получить бинарь, а не ELF файл. Для этого надо поставить в проекте "Target Settings" "Post Linker" - "ARM FromELF". В настройках ARM FromELF ставим "output format" - "plain binary".

Вот и все. Дальше можно писать свой код на Cи как обычно.
Вернуться к началу Перейти вниз
Посмотреть профиль
 
Пишем RamLoader для телефона
Предыдущая тема Следующая тема Вернуться к началу 
Страница 1 из 1

Права доступа к этому форуму:Вы не можете отвечать на сообщения
eXTracted INternals :: Cтатьи :: Mobile and Embedded-
Перейти: