libgoblin


Документация
https://docs.rs/goblin/
список изменений
Использование
Goblin требует rustc 1.85.0 (редакция Rust 2024).
Добавьте в ваш Cargo.toml
[dependencies]
goblin = "0.10"
Возможности
- отличное название крейта
- zero-copy, кроссплатформенная, с учётом порядка байт реализация ELF64/32 — вау!
- zero-copy, кроссплатформенная, с учётом порядка байт реализация 32/64-битного Mach-o — здорово!
- парсер PE 32/64 — бинго!
- парсер архивов в стиле Unix и BSD (второй благодаря @willglynn) — ура!
- множество опций cfg — от них голова пойдёт кругом, и вы будете злиться, читая исходники!
- прошёл фаззинг — "Я рад сообщить, что goblin выдержал 100 миллионов прогонов фаззинга, 1 миллион прогонов на каждый сид 1~100." — @sanxiyn
- тесты
libgoblin стремится быть вашим универсальным инструментом для разбора, загрузки и анализа бинарных файлов.
Примеры использования
Goblin в первую очередь поддерживает следующие важные сценарии использования:
-
Базовые, std-free структуры #[repr(C)], минимальное время компиляции, 32/64 (или обе) на ваш выбор.
-
Type punning. Определите функцию один раз для типа, и она будет работать как с 32-битными, так и с 64-битными вариантами — без реальных изменений и без макросов! Смотрите examples/automagic.rs для простого примера.
-
Режим std. Он добавляет реализации чтения и записи через Pread и Pwrite, чтение из файла, удобные выделения памяти, дополнительные методы и т.д. Это для клиентов, которые могут выделять память и хотят читать бинарные файлы с диска.
-
Endian_fd. Ужасное название 😆 это для бинарного анализа, как в panopticon или falcon, где нужно читать бинарные файлы с чужим порядком байт, или как основа для создания кроссплатформенных утилит для работы с бинарными файлами чужих архитектур, например, cargo-sym и bingrep — простые примеры этого, но возможности безграничны.
Вот некоторые вещи, которые вы могли бы сделать с этим крейтом (или помочь реализовать, чтобы они стали возможны):
- Написать компилятор и использовать его для генерации бинарных файлов (все сырые C-структуры имеют произвольный
[Pwrite][scroll]).
- Написать инструмент для анализа бинарных файлов, который загружает, разбирает и анализирует различные бинарные форматы, например, panopticon или falcon.
- Написать полуработающий динамический компоновщик.
- Написать ядро и загружать бинарные файлы с помощью конфигурации
no_std. То есть, по сути, это просто определения структур и констант (как C-заголовок) — никаких файловых дескрипторов, вывода, std.
- Написать инструмент bin2json, потому что почему бы бинарным форматам не быть в JSON?
Конфигурации (cfg)
libgoblin спроектирован так, чтобы быть максимально настраиваемым. Текущие флаги:
- elf64 — 64-битные ELF-бинарные файлы, определения структур
repr(C)
- elf32 — 32-битные ELF-бинарные файлы, определения структур
repr(C)
- mach64 — 64-битные Mach-O, определения структур
repr(C)
- mach32 — 32-битные Mach-O, определения структур
repr(C)
- pe32 — 32-битные PE, определения структур
repr(C)
- pe64 — 64-битные PE, определения структур
repr(C)
- te — Terse Executable (TE), определения структур
repr(C)
- archive — парсер архивов Unix
- endian_fd — разбор в соответствии с порядком байт в бинарном файле
- std — для поддержки окружений
no_std
Сопровождающие
- PE: @kkent030315
- Elf: @m4b, заявки принимаются
- Mach-o: @m4b, заявки принимаются
Сопровождающие — это рецензенты первого контакта для соответствующего бэкенда. Они выбираются на основе предыдущих вкладов, активности, базовых знаний и дружелюбного и общительного поведения :D
В настоящее время только я (@m4b) имею права на слияние всех PR. В будущем, вероятно, сопровождающие для данного бэкенда также получат права на слияние.
Наконец, я всё равно, скорее всего, буду бегло просматривать все PR, но в основном/полностью буду полагаться на сопровождающего для данного бэкенда.
И всегда помните мудрость Билла и Теда: "Будьте превосходны друг к другу!"
Участники
Спасибо вам всем ❤️ !
В лексикографическом порядке:
Вклад в проект
Если явно не указано иное, вы соглашаетесь, что ваши вклады лицензируются в соответствии с описанием в прилагаемом файле LICENSE (MIT).
- Пожалуйста, начинайте коммиты с указания затрагиваемого бинарного компонента; чем конкретнее, тем лучше, например, если вы изменяете только перемещения (relocations) в модуле elf, то пишите "elf.reloc: added new constants for Z80".
- Сообщения коммитов должны объяснять изменения, никаких общих "changed" или "fix"; если вы отправляете такие коммиты в PR, имейте в виду, что @m4b или кто-то другой, скорее всего, их сольёт в один.
- Если вы вносите большие изменения в модуль, пожалуйста, сначала создайте обсуждение (issue), и давайте обсудим; я не хочу тратить ваше время, если это неверное техническое направление и т.д.
- Если ваш PR не получает внимания, пожалуйста, отвечайте на все соответствующие комментарии, оставленные в PR, и если ответа всё ещё нет, напишите @m4b в github, а также можете написать @m4b на почту.
- Пожалуйста, добавляйте тесты, если вы добавляете новую возможность. Не стесняйтесь добавлять тесты, даже если не добавляете новую возможность; тесты — это здорово и легко в Rust.