#41 [22.09.08, 19:40] FAQ. Наиболее легкий способ портирования функций
Решил значит накактать FAQ по портированию функций библиотеки. как мне кажется уже проще моего - некуда. В примере будет описано портирование функции 0450: 00000000 B9616744 ; 114: int sprintf(char *buf, const char *fmt, ...); с W850 SW-R1KG001 для W580 SW-R8BE001 Что значит нам понадобится: 1) фактически единственная прога HxDen (прикрепил) (вместо нее можно использовать другие подобные проги, к примеру бинэдит. просто что в этой нет ничего лишнего). 2) Так же понадобятся уже сконвертированные прошивки w580 и w850 в формат raw. И так приступим. 1.Открываем программой HxDen обе прошивки. выбираем для начала w850. 2. теперь рассмотрим функцию "B9616744". для начала перевернем ее попарно. получаем 446761b9 . 3 теперь открываем виндовский калькулятор. вычитаем из 446761b9 - оффсет(конкретно в моем случае 44140000. чвой оффсет можно узнать с помошью программы babe2raw) получаем 5361B9 . 4.значит переходим по этому адресу(offset). и вот перед нами участок кода по этому адресу. я беру 7 байт(должно хватить)(в раззных случаях берем по-разному. иногда может хватить и 3 байт, иногда нужно больше) B4 10 B5 82 B0 04 1C 04 - вот они те самые 7 байт. 5. теперь переходим в прощивку w580. жмем Ctrl + F в открывшимся окне в поле Seath for: вводим те самые найденные "B4 10 B5 82 B0 04 1C 04" в поле Datatypes выбираем Hex-values ставим галочку на all и жмепм окей. получаем offset(в левом нижнем углу) 417079. 6.теперь снова открываем калькулятор. вводим получившееся значение "417079" и прибавляем 44140000. получаем 44557079. теперь попарно переварачиваем и получаем 79705544. вот впринципе и все.
Этот способ я считаю одним из самых простых. в место м предлагаемой мною проги HxDen можно использовать иду. Этим способом возможно получится портировать не все функции. Будут вопросы - задавайте. врятли получится портировать с одной платформы на другую. (с) zapret007 специально для сайтов mobilefree и se-team
P.S. не бросаемся сразу портировать все недастоющие функции. сначала нужно посмотреть ее описание вот к примеру функция для w580 непортированная. ;0B70: xxxxxxxx yyyyyyyy ; 2DC: void OrangeLED_Control(int _free_val, int or_LED_ID, int level, int fade_time); думаю дай-ко портану ага.. а если в название вчитаться - становится ясно, что ее в телефоне то нету нету оранжевого диода
прикрепляю программу для более быстрого переворачивания адресов и выитания\прибавления оффсета
#42 [26.09.08, 17:12] Re: FAQ. Наиболее легкий способ портирования функций
Oganyan-Arthur писал:
И нафиг нужны ваши эти 7 байт!
в принципе понятно, что не обязательно надо искать 7 байт. Тут попытался сам разобраться и пришел к такому методу: 1. ищем n-количество байт в нужной прошивке 2. если результат отрицательный, убираем 1-2 байта с конца, и повторяем поиск. Так, пока не будет найдено 3. проверяем, одно значение найдено или нет. если одно - то вот она родимая функция (то есть ее offset) 4. если несколько, то начинаю искать уже предыдущие байты (чтоб найти как можно более похожий кусок), т.е. в исходной прошивке беру 4-5 (или скока понадобится) байтов СЛЕВА от исходного и начинаю искать в нужной прошивке. 5. при этом если не нашел, то убираю из поиска один байт слева. 6. когда найду нужный кусок (после таких манипуляций он обычно один), беру адрес байта, с которого надо было начинать поиск. Пример: Искомая прошивка *** C7 F8 29 1C 4D F1 7E FC 01 20 26 34 20 70 30 BD 30 B5 04 1C 0D 1C FF F7 51 FF 00 28 04 D1 FF 21 *** Жирным выделен необходимый адрес Начинаю искать строку B5 04 1C 0D 1C FF F7 51 FF 00 28 04 D1 FF 21 в нужной прошивке. Если результатов нет - убираю байт справа: B5 04 1C 0D 1C FF F7 51 FF 00 28 04 D1 FF так, пока не найдет: B5 04 1C 0D 1C FF Если инесколько значений, беру для поиска байты слева: 20 26 34 20 70 30 BD 30 B5 04 1C 0D 1C FF Снова ищу, пока не найдет: 70 30 BD 30 B5 04 1C 0D 1C FF Смотрю адрес нужного байта (жирный) в нужной прошивке, и далее по факу.
Портировал функции с K750 на W700, нужные для работы BCFGEdit. Если ранее перезагруз или зависания были при выборе любого пункта в конфиге, то сейчас перезагруз только в определенных местах. Значит есть шанс, что часть функций все таки правильно портировал
Добавлено 26.9.08 19:20
в процессе работы встретился со странными функциями
что значит 8 перед именем функции? Если перевернуть и вычесть базу, то получившееся значение не может найти в прошивке. Если же у получившегося значения убрать впереди 8, то все нормально. Что это за функции такие?
Главное - всегда знать, чего ты хочешь. Тогда не придется думать, чего хочется другим.
#43 [26.09.08, 20:56] Re: FAQ. Наиболее легкий способ портирования функций
zapret007 писал:
короче хз.. больше не буду факами заниматься
Я с тобой целеком и полностью согласен! Пока люди сами не начнут думать логически- У них нифига не получится! Возможно мы делаем ошибку что пишем факи, потомучто сейчас будет столько функций хе..р знает каких...!!!
DarkDarin писал:
что значит 8 перед именем функции?
Я или тупой или ты чего то не понимаеш!!! Или я чего то понять не могу! Ты что название функции ищеш в проше??? или всё таки адресс?!
КОРОЧЕ Вот Вам ФАК со скринами! В моём исполнении! Может теперь дойдёт- Очень надеюсь!
FAQ лёгкий способ портирование функций со скриншотами.
Пример:
Портируем функцию:
0C00: FFFFFFFF 99803045 ; 300: int Disp_GetStrIdWidth(STRID , int len);
От W810i на W300i . У обоих прошивка R4EA031
1) Вставив значение "99803045" в програмку переворот и получаем адрес "11C8099"
2) Ищем адрес "11C8099" в WinHex в прошивке от W810! Для этого нажимаем на кнопку (рис1) выходит окошко куда вставляем "11C8099" и нажимаем ОК. (рис2)
3)И так мы нашли значение "B5" в прошивке от W810. Теперь нам надо найти ближайшую строчку ниже или выше значения из 16 байт в которой не должно содержаться значения "F" . В моём случае эта строчка "00 0E 28 18 00 04 00 0C 30 BD 00 00 30 B5 0D 1C" в ней как видите не содержится буквы "F". Выделяем все 16-ть байт и нажимаем на клавиатуре комбинацию Shift+Ctrl+C для копирования этих 16-ти байт в буфер. P/S: Иногда бывает что ближайшей строчки не содеращей буквы "F" нет рядом- не пугайтесь она всё равно будет віше или ниже-ищите.
4) Теперь переходим на вкладку прошивки от w300i и нажимаем на кнопку (рис.4) Выходит окошко куда вставляем наши 16-ть байт из буфера и нажимаем ОК.(рис.5).
5)И так мы нашли значение "00" теперь давайте выдели полностью 16-ть байт начиная с найденного значения "00". И так мы получили "00 0E 28 18 00 04 00 0C 30 BD 00 00 30 B5 0D 1C" (не странно ли? в пункте 3 мы это уже видели в проше от W810, но давайте не спешить)
а) Возвращаемся на вкладку прошивки от W810 и снова нажимаем на кнопочку "ГО ТУ ОВСЕТТ" - сново видим наше значение "B5".
б) Теперь давайте посчитаем от выделенной строчки "00 0E 28 18 00 04 00 0C 30 BD 00 00 30 B5 0D 1C" в низ на ШЕСТОЙ строке наше значение "B5" (рис.3)
в) Возвращаемся на вкладку прошивки от W300 и отсчитываем от найденной строчки "00 0E 28 18 00 04 00 0C 30 BD 00 00 30 B5 0D 1C" в НИЗ как и (в пункте б) ) на ШЕСТЬ строк и на шестой строчке мы увидем наше найденное значени "B5" (рис.6) Ниже вы можите увидеть адрес Offset 1150465 .Этот адрес вписываем в программку переворот и добовляем базу-потом переворачиваем и адрес найден! Для проверки можите сравнить строчку найденную в прошивке W300 c W810, но опять же как говорилось ранее все 16-ть байт могут и не свпасть, но ближайшие должны совпать обязательно!!!
Ну вот и всё, конечно буду как всегда вопросы- хотя вроди бы постарался объяснить по крестиянски-обычно и просто на доступном языке.
Вы не можете начинать темы. Вы не можете редактировать свои сообщения. Вы не можете создавать опросы. Вы не можете вкладывать файлы в сообщения. Вы не можете отвечать на сообщения. Вы не можете удалять свои сообщения. Вы не можете голосовать.