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