Zasm предоставляет очень гибкую и легкую библиотеку для манипулирования и генерации кода X86-64, используя Zydis в качестве бэкэнда. ZASM сохраняет все как узлы, такие как инструкции, данные, метки, разделы и т. Д., Которые предоставляют способ легко манипулировать/преобразовать код, прежде чем сериализовать его в двоичный файл. API вдохновлен ASMJIT, поэтому, если вы использовали ASMJIT, прежде чем это должно быть очень знакомо.
Некоторые из моих проектов использовали Zydis и Asmjit, где инструкции, где были сначала декодированы Zydis, а затем помещены в строитель ASMJIT, чтобы позволить обработку/анализ инструкций/филиалов перед повторным кодированием/перемещением модифицированного кода, есть пара снисходительности, которые будут объяснены дальше. Zydis недавно ввел способ использовать те же структуры/данные, которые он уже должен кодировать инструкции, которые приводят к Zasm. Эта библиотека направлена на то, чтобы стать ассемблером/декодером более высокого уровня, который можно использовать для различных вещей, таких как ранее упомянутый пример.
Сильная разница между ZASM и ASMJIT является фокусом на точных данных инструкций, таких как доступ операндов, скрытое использование регистра, исправить флаги ЦП, все это может быть либо отсутствует, либо неправильно в Asmjit, за исключением, конечно, AsmJit стремится к созданию кода на лету за «Скажем» или с высокой производительностью. Zasm не пытается заменить Asmjit в любом случае, у него разные цели.
Вторая причина, по которой Zasm - это то, что Zydis Encoder является чрезвычайно низким уровнем, что означает, что у вас нет таких вещей, как этикетки, Zasm предоставляет класс высокого уровня для инструкций сборки и предоставляет эти этикетки, такие как обычный ассемблер.
Zasm использует Cmake в сочетании с CMKR для упрощения поддержания cmakelists.txt. Здание должно быть таким же простым, как использование следующих команд из терминала в корневом каталоге:
cmake . -B build
cmake --build build --config Release
Если вы хотите также построить используемые тесты
cmake . -B build -DZASM_BUILD_TESTS=ON
Программа - это контейнер, который содержит все данные, а также служит вдвойной связанными списками. Инструкции, метки, данные, разделы и т. Д. Хранится как узлы, которые позволяют пользователю легко удалять/вставлять/переупорядочить.
Класс ассемблера предоставляет сгенерированные функции членов для генерации инструкций/данных/метков в программе в указанной позиции курсора. Для излучения mov rax, -1 эквивалентом будет asssembler.mov(operands::rax, operands::Imm(-1));
Класс сериализатора сериализует программные узлы на бинарное изображение и хранит полученное состояние. После успешной сериализации пользователь может запросить полученный двоичный код и данные, такие как адрес этикеток, информация о переезде, данные раздела и т. Д.
Декодирует двоичные данные в объект инструкции, которые можно либо непосредственно использовать или хранить в программе.
Проект предоставляет несколько основных примеров, которые можно найти здесь. Существуют также различные тесты практически на все, что предоставляет ZASM, если в первую очередь есть что -то не хватает проверки тестов, они также дают хорошие примеры. Если у вас все еще есть вопросы, вы можете связаться с нами через Discord.