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, но в основном/полностью буду полагаться на сопровождающего для данного бэкенда.
И всегда помните мудрость Билла и Теда: "Будьте превосходны друг к другу!"
Участники
Спасибо вам всем ❤️ !
В лексикографическом порядке:
- [@000lbh]
- [@2vg]
- [@5225225]
- [@alessandrod]
- [@amanieu]
- [@anfedotoff]
- [@apalm]
- [@baloo]
- [@BinFlip]
- [@burjui]
- [@CalebFenton]
- [@chf0x]
- [@connorkuehl]
- [@dancrossnyc]
- [@DreydenGys]
- [@dureuill]
- [@Evian-Zhang]
- [@ExPixel]
- [@flanfly]
- [@glandium]
- [@glslang]
- [@Gelbpunkt]
- [@gunbux]
- [@h33p]
- [@hannahfluch]
- [@Hexorg]
- [@ibabushkin]
- [@ideeockus]
- [@ivlzme]
- [@jackcmay]
- [@jan-auer]
- [@Javagedes]
- [@jessehui]
- [@jdub]
- [@Jhynjhiruu]
- [@JohnScience]
- [@johannst]
- [@joschock]
- [@jrmuizel]
- [@jsgf]
- [@Jvlegod]
- [@keith]
- [@kjempelodott]
- [@kkent030315]
- [@ko1n]
- [@le-jzr]
- [@Lichtso]
- [@lion128]
- [@lissyx]
- [@llogiq]
- [@lumag]
- [@lzutao]
- [@lzybkr]
- [@m-hilgendorf]
- [@makubacki]
- [@mmaekr]
- [@m4b]
- [@messense]
- [@mitsuhiko]
- [@mkroening]
- [@mre]
- [@Mrmaxmeier]
- [n01e0]
- [nathaniel-daniel]
- [@nick96]
- [@nico-abram]
- [@npmccallum]
- [@pchickey]
- [@philipc]
- [@PJB3005]
- [@prettyroseslover]
- [@Pzixel]
- [@quake]
- [@raindev]
- [@RaitoBezarius]
- [@ReturnRei]
- [@rocallahan]
- [@sanxiyn]
- [@SAY-5]
- [@skdltmxn]
- [@sollyucko]
- [@supervacuus]
- [@Swatinem]
- [@SweetVishnya]
- [@SquareMan]
- [@tathanhdinh]
- [@Techno-coder]
- [@tiann]
- [@ticki]
- [@Timmmm]
- [@Tiwalun]
- [@track-5]
- [@tux3]
- [@wickerwacka]
- [@willglynn]
- [@woodruffw]
- [@wyxloading]
- [@xcoldhandsx]
- [@x0rb3l]
- [@x64k]