Как искать нужные модули в ресурсах?
(На примере поиска модуля FM-тюнера в прошивке Samsung YP-MT6)
Для начала поисков необходимо получить набор отдельных файлов модулей,
т.е. експортировать модули из файла resources.bin. Для это воспользуемся
программой ResEdit (ищем здесь
http://home.tula.net/nickit/). Открываем
в ней наш файл ресурсов и выбираем *Export* в появившемся окне выбираем
*What* равное data. Получили набор bin файлов.
Дальше обратим внимание на то, по какому признаку мы будем определять
наш модуль. Вообще говоря в нем должны содежаться какие-то константы,
по которым мы и готовы его идентифицировать. В данном случае будем искать
константы 108000 или 87500. Я использовал свой любимый Total Commander для
поиска во всех экспортированых bin-ах последовательности байтов, отвечающих
выбранным константам. Т.к. используется Little-endian модель, в файлах
необходимо искать не 01A5E0 (108000), а E0A501. После поиска круг
подозреваемых bin-ов сузился - из 282 осталось 4 модуля, содержащих константу
108000. (Я выбрал файл, содержащих наибольшее количество констант)
Теперь необходимо правильно загрузить этот файл в IDA, для этого необходимо
определить адрес загрузки. Т.к. все переходы в модулях осуществляются по
абсолютным адресам, то загружаем сначала файл использую любое смещение загрузки
и просматриваем дизассемблированный код, по адресам переходов, логически
мысля, пытаемся выяснить, какая же база загрузки должна быть верной
Например я увидел вот такой переход (и похожих адресов много):
jle $AB63
можно предположить, что база загрузки есть адрес больше либо равный AB00. Перезагружаем
наш файл установив базу загрузки AB00. Загрузив файл для точного определения базы
можем воспользоваться теми переходами, которые вызывают функции, например в моем файле
первый вызов был:
jsr ROM_ACFD
прыгнув по адресу я увидел вот такой код:
ROM:ACFD bset #19,x:XMEM_F403
ROM:ACFF bset #18,x:XMEM_F403
ROM:AD01 bset #3,x:XMEM_F423
но обычно функция начинается с инструкции:
movec ssh,y
r7)+
поднимаюсь выше, и нахожу начало вызываемой функции:
ROM:ACE8 movec ssh,y
r7)+
ROM:ACE9 bset #18,x:XMEM_F400
теперь воспользовавшись калькулятором вычисляю разницу адресов 0xACFD и 0xACE8 получаю
0x15 выходит, что база загрузки файла 0xAB15. (Можно также предположить, что все модули
будут загружаться именно с этого адреса)
Загружаем файл с верным смещением и проводим его анализ на наличие необходимых функций,
в моем случае в наличии оказался исходный текст модуля тюнера, поэтому по коду С
с легкостью можно было восстановить все функции. Но даже если исходников нет, не беда,
всегда можно и самому на глаз определить, где что твориться =).
В заключении прикрепляю базу IDA с модулем управления FM-тюнером Philips 5767
который я и искал в своей прошивке...
Социальные закладки