Дизассемблер длин

Материал из Russian Underground
Перейти к: навигация, поиск

Дизассемблер длин — транслятор преобразующий машинный код в его длину; аналог дизассемблера, но вычисляющий только размер команды процессора. Дизассемблер длин рассматривает машинный код процессора только для оценки сколько байт занимает текущая команда и когда начнется следующая. Аналогичный «аппарат» существует в процессоре производя предвыборку команд из памяти и осуществляя конвейеризацию выполняемых команд. Программный Дизассемблер длин необходим для:

  • декодирования инструкций дизассемблером;
  • рекомпиляции прологов функций;
  • быстрого анализа команд программы;
  • морфинга и деморфинга кода;

Рекомпиляции прологов функций необходима при перехвате вызовов функций и широко используется в Windows (на всех 32х разрядных процессорах совместимых с i80386).

Для перехвата вызовов к функции подменяются её первые 5 байт на команду «jmp f_ptr_my_func», но для сохранения работоспособности функции необходимо где-то сохранить первые 5 байт оригинальной функции, для этого анализируется размер присутствующих там команд и их назначение.

Нередко приходится сохранять более 5 байт, так как нельзя переносить часть команды (а команды x86 имеют различный формат и размер). Чтобы перенесенные команды сохраняли работоспособность, их рекомпилируют, заменяя на эквивалентные, и завершают командой безусловного перехода на оригинальную функцию (на продолжение кодов). Такой метод перехвата (с подменой пролога функции) называется — перехватом методом слайсинга. Это самый эффективный метод перехвата, требующий хорошего знания ассемблера x86. Примеры дизассемблеров длин можно найти в книге Юань Фэна «Программирование графики для Windows» (дизассемблер длин, представленный там, имеет две ошибки в описании команд x86). Пример опенсорсного дизассемблера длин - LDASM.

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Сцена
Материалы
Разное
Donate
Инструменты