Главная
Новости
Строительство
Ремонт
Дизайн и интерьер




07.03.2021


04.03.2021


04.03.2021


04.03.2021


04.03.2021





Яндекс.Метрика

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

26.01.2021

Дизассемблер длин — транслятор, преобразующий машинный код в его длину; аналог дизассемблера, но вычисляющий только размер команды процессора. Обычно применяется с машинным кодом архитектур, допускающих значительную разницу в длине инструкций, обычно из класса CISC. Например, в x86 и x86_64 (Intel и AMD) команда занимает от 1 до 15 байтов. При этом в распространенных RISC архитектурах команда занимает либо всегда 4 байта или допускается использование 2 и 4 байтных команд.

Дизассемблер длин рассматривает машинный код процессора только для оценки, сколько байт занимает текущая команда и когда начнется следующая.

Аналогичный «аппарат» существует в процессоре, производя предвыборку команд из памяти и осуществляя конвейеризацию выполняемых команд. Первая стадия декодера инструкций в процессорах с внутренним параллелизмом определяет длины инструкций, чтобы найти начало следующих команд. В случае успешного определения длин возможна передача на декодирование сразу нескольких инструкций в такт. В ряде реализаций информация о длинах команд может сохраняться в кэше инструкций. Наблюдая за аппаратным декодером длин исследователям удалось найти ранее недокументированные пространства инструкций в некоторых процессорах.

Программный Дизассемблер длин необходим для:

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

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

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

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

Примеры дизассемблеров длин можно найти в книге Юань Фэна «Программирование графики для Windows» (дизассемблер длин, представленный там, имеет две ошибки в описании команд x86). Также дизассемблер длин можно найти на сайте wasm.ru

Из-за возможного использования множества префиксов, некоторые сочетания которых могут быть запрещены или игнорироваться, а другие могут изменять длины инструкций, существует ряд широко распространенных ошибок в определении длин для редких сочетаний. Иногда аппаратные реализации разных компаний реализуют такие случаи по-разному.