Всем доброго дня! Ребят, заинтересовался исследованием BIOS, почитал разную литературу, но так и не смог найти ответ на свой вопрос.
Вопрос вот в чем:
Экспериментирую с прошивкой (AMIBIOS 8) для материнской платы MSI G31TM-P35. Поскольку часть прошивки хранится в сжатом виде, то для распаковки использую MMTOOL. Получил 22 модуля. Можно дизассемблировать каждый модуль по отдельности, но тогда не понятно как они друг с другом взаимодействуют. Вот и встал вопрос, как собрать все модули в один файл, чтобы его можно было бы загрузить в Иду и проанализировать? Знаю, что надо создавать новые сегменты и грузить в них код, но возникает новый вопрос: по каким адресам загружать каждый из модулей?
Чувствую, что вопросы не новы, но, к сожалению, поиск решений не увенчался успехом.
Что посоветуете?
binaryshadow
обычно когда делают jmp di или jmp si, то где-то рядом есть таблица адресов переходов. IMHO. И, соответственно, в комментах ее повторять не надо.
Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P
Root, ваше мнение не совпадает с реальностью. Бывает, что нужное значение находится за большИм кол-вом переходов и всё это ещё усугубляется сдвигами, обменом значений байтов и т.д.
К примеру:
тут в регистр mm7 записывается значение edi, а используется через 7 jmp:
А комментарии такого вида приходится делать, чтоб не потерять значение, так как в моем случае встречается многократное исполнение одного кода, а возврат в разные места:
binaryshadow
все - понял о чем речь. О вызовах с возвратами обратно, когда в функцию передается указатель на блок кода, который нужно выполнить
так Вы неправильно рассматриваете код. Все с seg005:1BF7 до seg005:1C22 выгодно объявить отдельной функцией. И рассматривать картину с бОльшей высоты - на уровне вызовов различных процедур. Ведь тот код, который вызывает seg005:1BF7 и задает содержимое регистра DI!
Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P
а) То, что указанный код следует объявить функцией – это без сомнения правильно. У Award есть очень красивое название для макросов, организующих такого рода вызовы: ROMCALL (хотя там в большинстве случаев используется SP).
б) Не открою тайну: ММХ-регистры в примере выше используются в отсутствие стека как временные хранилища
в) Все-равно нужно отслеживать вызовы функции из разных точек. Все-равно это приходится делать комментариями, и это трудоемко и неудобно.
P.S. Лучше выложить бинарный код исследуемого BIOS и дизассемблированный файл IDA. Я понимаю, что не хочется выставлять на показ черновики. Возможно и польза будет мизерная. Но это облегчает понимание и помогает общению.
Открытая книга: icbook.com.ua
Всё верно, и про создание функций и про ммх. Вчера вот вроде разложил ББ почти полностью, много вопросов...
Если есть желание покопаться в коде, то могу выложить образ и код ИДЫ. Кстати, я там собрал в один файл всё кроме куска с упакованными модулями, так как не знаю по каким адресам их размещать.
Покопаться могу только в POST-кодах и только в свободное время) Так что выкладывайте)
Открытая книга: icbook.com.ua
Выложу чуть позже, а то я там чего-то нах...тил =)
Есть два вопроса:
1. какие чаще всего встречаются jmp (di, cx, dx, ax итд)?
Это для понимания того, получится ли некоторую часть дизассемблировать не проходя все ветки...
Примерно так получается:
а вот и loc_F3394
И если не переходить на loc_F3394, а сразу перейти на 41B4h ну и нажать "С" получаем кусок кода.
А смысл в том, что не всегда получается (лично у меня) проследить откуда берется значение, вот пропущу где-нибудь xchg или bswap и потерял значение в DX =)
2. кто-нибудь пробовал дизассемблировать при помощи 16-битного отладчика?
Пробовал прикрутить некоторые, но они пожимали плечами и говорили, - что не могут 16-битный, тока 32.
1.
Вопрос обсуждался 3 года назад
rom.by/forum/Dizassemblirovanie_BIOS_1
2. Не совсем понял.
a) Дизассемблирует (т.е. заменяет бинарный код на текст) - дизассемблер.
b) Отладчик - отлаживает в рантайм, т.е. идет контролируемое выполнение кода.
Как часть отладчик может включать в себя дизассемблер для визуализации. Дизассемблер не может включать в себя отладчик.
Вам что надо?
А кому счас легко...
savely, идея в том, чтобы не запоминать значения в регистрах, а прогонять отладчиком уже дизассемблированные коды. А если наткнулись на кусок не исследованный, нажать "C" и продолжить прогонять отладчиком (debuger, для ясности).
В итоге, дизассемблирование заметно ускорится, когда будет наглядно видно что в регистрах.
ЗЫ
Думаю не всё так гладко, как кажется.
Так как, это начальный этап и требуется не сконфигурированное оборудование (северный мост, южный и т. д.).
Вот, собственно, как-то так.
Пытаюсь понять - Вы про конкретный отладчик в IDA? Так он для Win32. НЕ 32 бита, а ИМЕННО Win32 (т.е. для "Винды" как бы). Да и на третьем кольце... Сомневаюсь, что его можно будет адекветно прикрутить к задаче дизассемблирования произвольного bin-файла...
А кому счас легко...
Отправить комментарий