РЕВЕРСИНГ Д500

Версия для печати

Список форумов SAMSUNG-mobile.ru / Программирование для Samsung и реверсинг прошивок / РЕВЕРСИНГ Д500
На страницу Пред.  1, 2, 3, 4  След.
Показать: « Предыдущая тема :: Следующая тема »



SiNoptik

Участник форума


Рейтинг: 100% (1 / 0)


В форуме с: 10.2005
Сообщения: 35
Откуда: Tomsk
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

AlexeyK писал(а):

This format specifies a long branch with link.
The assembler splits the 23-bit two’s complement half-word offset specifed by the
label into two 11-bit halves, ignoring bit 0 (which must be 0), and creates two THUMB
instructions.
Instruction 1 (H = 0)
In the first instruction the Offset field contains the upper 11 bits of the target address.
This is shifted left by 12 bits and added to the current PC address. The resulting
address is placed in LR.
Instruction 2 (H =1)
In the second instruction the Offset field contains an 11-bit representation lower half of
the target address. This is shifted left by 1 bit and added to LR. LR, which now contains
the full 23-bit address, is placed in PC, the address of the instruction following the BL
is placed in LR and bit 0 of LR is set.
The branch offset must take account of the prefetch operation, which causes the PC
to be 1 word (4 bytes) ahead of the current instruction

H THUMB Action
0 BL label LR := PC + OffsetHigh << 12
1 temp := next instruction address
PC := LR + OffsetLow << 1
LR := temp | 1

Это из документации
- это ведь бвух байтная команда(т.е THUMB). Но в реальном коде постоянно встречаются четырех байтные команды. Я не понимаю: неужели можно вот так, в перемешку, использовать THUMB и ARM команды? Разве не нужно переключать режимы? Калькулятор переходов в BinEdit выдаёт 32-разрядный код. А вот как он его вычисляет?

Цитата:
Чаще всего для дальних переходов используется вариант с BX
Ldr Rx, =Adres+1
Bx Rx
.word Adres+1
- хороший вариант. Только где взять 4 байта для .word Adress+1... Можно конечно найти, вот только работы больше... Улыбка

Цитата:
а для функций вызываемых через BL

Push {R0,R1}
Ldr R0, =Adres+1
str R0, [SP,#4]
POP {R0,PC}
.word Adres+1
- смотрел-смотрел, но так и не понял, зачем R0 сохранять в стэке... Это для параметра, который возвращает функция? Что бы не портить регистры? Улыбка

Цитата:
Сам я данные из EEPROM не использовал, но в патче мелодии на абонентов VadikS-а функция hfd2_30ReadBlockNameInRamImage часто используется для работы с параметрами группы абонентов и вроде работает
- вроде разобрался я со всеми этими BL/BX(да еще и с адресами я впарился с непревычки Улыбка). При переносе функции чтения всё ок(только вот еще менять еще ничего не пробовал). Но вот функция записи отказывается работать при переносе. Т.е всё остается как и было, просто в другом месте. И если я делаю переход обратно и там сразу вызываю запись в EEPROM(как и было изначально) - всё ок. А если я пробую записывать вместо перехода - виснет... Не знаю... А там нет никакой привязки к ОЗУ? Т.е адреса ОЗУ всегда задаются явно(не через какое-нибудь смещение(типа PC+offset)? А на всякие прерывания в данном случае не нужно заморачиваться? Ведь если в этот момент запись всё равно должна произойти, какая разница с какого адреса будет вызван BLX hfd2_31SaveBlockInRamImage(при прочих равных)?


07.11.2005 15:15

OfflineПрофайл | Отправить л/с | Отправить e-mail | ICQ


SiNoptik

Участник форума


Рейтинг: 100% (1 / 0)


В форуме с: 10.2005
Сообщения: 35
Откуда: Tomsk
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

AlexeyK, ты мне как-то рассказывал про чтение в X100:
Цитата:
Код:
А вот и сам код чтения
000BF55E  48A8      LDR R0, [PC,#0x2A0] R0 = значение по адресу (PC + 672)= 0x00000F01
000BF560  F746FE9E  BL hfd2_30ReadBlockNameInRamImage Вызов \ адрес 000062A0
000BF564  6800      LDR R0, [R0, #0] R0 = слово по адресу [R0 + 0 байт]

В D500 аналогичный участок кода:
Код:
0082F250       FF 20                          MOV        R0, #0xFF   
0082F252       01 30                          ADD        R0, #1         
0082F254       56 F7 76 EB                    BLX        goto_hfd2_30ReadBlockNameInRamImage

Т.е. в R0 заносится значение FF+1=100.
Но есть еще и такой способ вызова этой функции(в другом месте):
Код:

00486368 CF 48                       LDR     R0, =word_F0C   
0048636A 59 F7 9A E9                 BLX     goto_hfd2_30ReadBlockNameInRamImage

Здесь в R0 агружается значение по адресу F0C? Это же из ОЗУ, а не из прошивки? IDA опознает это как ссылку на F0C, а там какая-то чушь... Так вот, этот адрес ведь абсолютный? Ну т.е. ведь можно же по сделать этот LDR в любом месте? Ну т.е. сам код команды изменится, но F0C останется неизменным? Т.е. на этот адрес можно ссылаться из любого места и нет никакой области видимости(типа +-1024 байта)? И чем может быть вызвана необходимость хранить идентификатор блока в ОЗУ? Ведь это подразумевает, что этот идентификатор может быть изменен... Зачем...? Насколько я понял - идентификаторы для одних и тех же блоков постоянные? Или опять я чего-то не понял... Улыбка


07.11.2005 16:17

OfflineПрофайл | Отправить л/с | Отправить e-mail | ICQ


AlexeyK

Признанный телефонист


Рейтинг: 93% (108 / 8)



В форуме с: 07.2004
Сообщения: 517
Откуда: г. Александров
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

SiNoptik писал(а):
- это ведь бвух байтная команда(т.е THUMB). Но в реальном коде постоянно встречаются четырех байтные команды. Я не понимаю: неужели можно вот так, в перемешку, использовать THUMB и ARM команды?

Всё правильною BL в thumb - это двойная двухбайтовая команда, часть смещения передаётся в первой половине, другая во второй. Парамерт Н - определяет какая часть. 0 - старшая, 1 - младшая. каждая по 11 бит, итого 22 бита. Старший бит знаковый, реальное смещение в два раза больше.

SiNoptik писал(а):
Push {R0,R1}
Ldr R0, =Adres+1
str R0, [SP,#4]
POP {R0,PC}
.word Adres+1


в этом варианте R0 используется как временный регистр, и после использования востанавливается.

SiNoptik писал(а):
Здесь в R0 агружается значение по адресу F0C? Это же из ОЗУ, а не из прошивки? IDA опознает это как ссылку на F0C, а там какая-то чушь... Так вот, этот адрес ведь абсолютный? Ну т.е. ведь можно же по сделать этот LDR в любом месте? Ну т.е. сам код команды изменится, но F0C останется неизменным? Т.е. на этот адрес можно ссылаться из любого места и нет никакой области видимости(типа +-1024 байта)? И чем может быть вызвана необходимость хранить идентификатор блока в ОЗУ? Ведь это подразумевает, что этот идентификатор может быть изменен... Зачем...? Насколько я понял - идентификаторы для одних и тех же блоков постоянные? Или опять я чего-то не понял...


Нет, тут именно R0=0xF0C а не R0=[0xF0C]. 100 и F0C - это не адреса, это числа или маска, по которой функция hfd2_30ReadBlockNameInRamImage выбирает нужный блок

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

_________________
Patch & Hex редактор, ARM Debuger & Compiler: http://forum.samsung-mobile.ru/viewtopic.php?t=22518


07.11.2005 17:05

OfflineПрофайл | Отправить л/с | ICQ


SiNoptik

Участник форума


Рейтинг: 100% (1 / 0)


В форуме с: 10.2005
Сообщения: 35
Откуда: Tomsk
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

AlexeyK писал(а):

Нет, тут именно R0=0xF0C а не R0=[0xF0C]. 100 и F0C - это не адреса, это числа или маска, по которой функция hfd2_30ReadBlockNameInRamImage выбирает нужный блок

PS. Любой декомпилятор на автомате часто ошибается в определениях типов. IDA тем и хороша, что позволяет поправить то, что сама напутала Улыбка
Всё! Понял! Улыбка Я, по моему, уже начинаю сходить с ума от всех этих кодов... Просто туплю... Наконец-то удалось прочитать данные из eeprom! Локальная цель достигнута. Всё получилось очень мило и симпатично... Но напоминает какие-то танцы с бубном. Я так и не понял, в каких случаях функция вызывается нормально, а в каких нет(при одинаковых состояниях регистров). Ну да ладно... На фоне всего этого появился такой вопрос:
1.AlexeyK, а твой компилятор в BinEdit для команды NOP какой код использует? Как таковой, команды NOP в ARM-ассемблере не существует(это я понял из документации). Я использую ADD R0,R0,0. IDA её автоматом помечает как NOP. Код этой команды: C0 46.
Но есть еще такой код: 00 00 - LSR R0,R0,0. Казалось бы, сдвиг на 0 разрядов влево - это не сдвиг(по сути, умножение на 1). Но вот IDA почему-то эту команду за NOP не считает... Так всетаки LSR R0,R0,0 - это NOP или нет? Улыбка Что лучше использовать на практике?
2.AlexeyK, если еще помнишь мою проблему... Чтение нужного мне блока возможно через set1_0read_eeprom... Но ты как то сказал, что для записи этого блока лучше использовать напрямую hfd2_30SaveBlockInRamImage. Т.е. ты думаешь, что функция set_write_eeprom(ну или как там она называется) не умеет записывать этот блок(действительно, сложно представить, когда бы это могло понадобиться)? А может так случиться, что и hfd2_30SaveBlockInRamImage тоже не умеет его записывать?


08.11.2005 16:31

OfflineПрофайл | Отправить л/с | Отправить e-mail | ICQ


AlexeyK

Признанный телефонист


Рейтинг: 93% (108 / 8)



В форуме с: 07.2004
Сообщения: 517
Откуда: г. Александров
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

для nop использавал R8=R8

set_write_eeprom только читает данные из EPROM, а для нормальной записи, надо перед записью считать блок, поменять в нём что надо, а потом записать.

_________________
Patch & Hex редактор, ARM Debuger & Compiler: http://forum.samsung-mobile.ru/viewtopic.php?t=22518


08.11.2005 18:47

OfflineПрофайл | Отправить л/с | ICQ


SiNoptik

Участник форума


Рейтинг: 100% (1 / 0)


В форуме с: 10.2005
Сообщения: 35
Откуда: Tomsk
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

AlexeyK писал(а):
set_write_eeprom только читает данные из EPROM, а для нормальной записи, надо перед записью считать блок, поменять в нём что надо, а потом записать.
- наверное записывает? Улыбка


09.11.2005 09:34

OfflineПрофайл | Отправить л/с | Отправить e-mail | ICQ


SiNoptik

Участник форума


Рейтинг: 100% (1 / 0)


В форуме с: 10.2005
Сообщения: 35
Откуда: Tomsk
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

Вопрос всем кто сталкивался с этим или знает хоть что-то. Никак не получается прочитать данные из eeprom напрямую через функцию hfd2_30ReadBlockInRamImage. Получилось через set1_0Read_eeprom. Она получает через R0 идентификатор блока. В связи с этим, у меня вопрос такой:
1. Функция set1_0read_eeprom нуждается в установке еще каких-нибудь регистров, кроме R0? Как определяется длина возвращаемой строки? Есть какой-то символ конца строки или длина возвращается в регистре?
2. Функция set1_1write_eeprom также получает в R0 идентификатор записываемого блока. А ссылку на сам блок она получает через R1? И нуждается ли она в установке еще каких-нибудь регистров?
3. В общем случае, функции hfd2_30ReadBlockInRamImage и hfd2_31SaveBlockInRamImage могут быть вызваны в любой момент времени или необходимо соблюдение каких-то условий?
4. И самое главное: есть ли какая-нибудь информация о параметрах, передаваемых и возвращаемых этими функциями(hfd2_3*****BlockInRamImage)?
Буду очень признателен за любую информацию по данным вопросам. Заранее спасибо!


15.11.2005 10:40

OfflineПрофайл | Отправить л/с | Отправить e-mail | ICQ


Hexxxx

Признанный телефонист


Рейтинг: 66% (44 / 23)



В форуме с: 09.2004
Сообщения: 508
Откуда: Днепропетровск
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

void * hfd2_30ReadBlockNameInRamImage(unsigned short SectionID);

hfd2_30ReadBlockNameInRamImage принимает двойной ID: старший байт - тип секции, младший байт - номер секции этого типа.
Возвращает указатель на секцию.

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

_________________
Мое предназначение - Реверсинг


15.11.2005 13:25

OfflineПрофайл | Отправить л/с | WWW | ICQ


SiNoptik

Участник форума


Рейтинг: 100% (1 / 0)


В форуме с: 10.2005
Сообщения: 35
Откуда: Tomsk
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

Hexxxx писал(а):
void * hfd2_30ReadBlockNameInRamImage(unsigned short SectionID);
- ты какой-то волшебник... Улыбка в таком виде я её еще не видел! а по регистрам можно узнать как-нибудь? а то у меня нету такой практики как у тебя. Мне это мало о чем говорит... Улыбка
Цитата:
Таблицы секци захардкожены поэтому вызывать эти функции можно в любой момент, синхронизация соблюдается сама собой.
- я в принципе, делаю всё с точностью до опертора как и в функции set1_0read_eeprom(с самого её начала и до момента вызова hfd2_30ReadBlockInRamImage). Но телефон просто тупо виснет в момент вызова этой функции и всё...
Еще кто-нибудь поделится инфой по этому поводу?


15.11.2005 13:50

OfflineПрофайл | Отправить л/с | Отправить e-mail | ICQ


Vadiks
Человек-гора

Авторитетный телефонист


Рейтинг: 95% (114 / 6)



В форуме с: 01.2004
Сообщения: 429
Откуда: Красноярск
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

Hexxxx писал(а):
void * hfd2_30ReadBlockNameInRamImage(unsigned short SectionID);

hfd2_30ReadBlockNameInRamImage принимает двойной ID: старший байт - тип секции, младший байт - номер секции этого типа.
Возвращает указатель на секцию.

Разрешите поправить.
старший байт - номер секции
младший байт - номер блока внутри секции

_________________
Оказывается "залоченый" это не закрытый, а покрытый золотом!
http://vvsoft.nm.ru


01.12.2005 13:49

OfflineПрофайл | Отправить л/с | WWW


SiNoptik

Участник форума


Рейтинг: 100% (1 / 0)


В форуме с: 10.2005
Сообщения: 35
Откуда: Tomsk
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

Hexxxx писал(а):
void * hfd2_30ReadBlockNameInRamImage(unsigned short SectionID);

hfd2_30ReadBlockNameInRamImage принимает двойной ID: старший байт - тип секции, младший байт - номер секции этого типа.
Возвращает указатель на секцию.


Тогда hfd2_31SaveBlockInRamImage можно записать так (?):
void hfd2_31SaveBlockInRamImage(unsigned short SectionID, void * RamSection);
Ничего не путаю? Она же ничего не возвращает?


01.12.2005 14:07

OfflineПрофайл | Отправить л/с | Отправить e-mail | ICQ


SiNoptik

Участник форума


Рейтинг: 100% (1 / 0)


В форуме с: 10.2005
Сообщения: 35
Откуда: Tomsk
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

Hexxxx писал(а):
Таблицы секци захардкожены поэтому вызывать эти функции можно в любой момент, синхронизация соблюдается сама собой.
А не может быть так, что для чтения номер секции один, а для записи другой? Или всё-таки они одни и те же в любых ситуациях?


06.12.2005 15:53

OfflineПрофайл | Отправить л/с | Отправить e-mail | ICQ


AlexeyK

Признанный телефонист


Рейтинг: 93% (108 / 8)



В форуме с: 07.2004
Сообщения: 517
Откуда: г. Александров
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

SiNoptik, похоже Абрам вычислил почему не получается вызвать hfd2_30ReadBlockNameInRamImage через BLX, особенно если адрес вызова не кратен 4.

_________________
Patch & Hex редактор, ARM Debuger & Compiler: http://forum.samsung-mobile.ru/viewtopic.php?t=22518


14.12.2005 21:03

OfflineПрофайл | Отправить л/с | ICQ


SiNoptik

Участник форума


Рейтинг: 100% (1 / 0)


В форуме с: 10.2005
Сообщения: 35
Откуда: Tomsk
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

AlexeyK писал(а):
SiNoptik, похоже Абрам вычислил почему не получается вызвать hfd2_30ReadBlockNameInRamImage через BLX, особенно если адрес вызова не кратен 4.
Да, спасибо за подсказку... Посмотрел! Надо попробовать! Улыбка Скачаю твой BinEdit и попробую в ближайшее время...


15.12.2005 09:56

OfflineПрофайл | Отправить л/с | Отправить e-mail | ICQ


ViZ0R

Участник форума


Рейтинг: 50% (1 / 1)



В форуме с: 01.2004
Сообщения: 35
Откуда: Москва
Re: Вопрос ветеранам прошивок! Цитировать | Ответить

Привет всем!

Не могли бы вы подбросить какую-нибудь информацию как получить готовый asm листинг (с разметкой - функции, переменные) для реверсинга D500 (сигнатуры и пр. вспомогательные файлы) и кратенькую инструкцию.

Время пока есть, тоже хочется поковыряться в прошивке, а то есть пара идей.

_________________
You and me baby ain't nothin' but mammals
Let's do it like they do on the *** channel!
Улыбка


25.01.2006 11:42

OfflineПрофайл | Отправить л/с

Список форумов SAMSUNG-mobile.ru / Программирование для Samsung и реверсинг прошивок
На страницу Пред.  1, 2, 3, 4  След.

Переход в другой форум
Страница 3 из 4
Форум Samung-mobile.ru — сотовые телефоны Samsung