Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
pycdc — Декомпилирует и дизассемблирует байт-код Python (.pyc/.pyo) обратно в читаемый исходный код. Поддерживает Python 2.0 - 3.15 (CPython, PyPy и другие реализации). Написан на Rust. | Kitploit
Инструменты/GitHubGitHub/ejfkdev/pycdc
Статический анализАнализ КодаОбратная инженерияОтладчикиАнализ вредоносных программУтилиты и фреймворкиАнализ Бинарных Файлов
GitHubejfkdev/pycdc

pycdc

Декомпилирует и дизассемблирует байт-код Python (.pyc/.pyo) обратно в читаемый исходный код. Поддерживает Python 2.0 - 3.15 (CPython, PyPy и другие реализации). Написан на Rust.

Репозиторий
82262 дней назадЕщё не проверено

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

pycdc-rs

Английский | 简体中文

License: MIT Python Corpus Behavior Built with ZCode

Декомпилируйте и дизассемблируйте байт-код Python (.pyc) от Python 2.0 до 3.15 обратно в читаемый исходный код — написан на Rust, три зависимости, Python не требуется во время выполнения.

pycdc program.pyc          # decompile to stdout
pycdas program.pyc         # disassemble (exception tables, line numbers, nested code)

Ключевые особенности

  • 100% семантическая эквивалентность на корпусе из 528 модулей реальной стандартной библиотеки для 14 интерпретаторов (2.6–3.15); 76.9% совпадают по сигнатурам точно
  • Матрица поведения 663/663 = 100%: каждый случай проходит на 2.6–3.15, включая новые байткод-кодировки 3.15
  • Современный синтаксис: параметры типов PEP 695/696, t-строки PEP 750, отложенные аннотации PEP 649, match/case, walrus, async, f-строки
  • Различия версий — это чистые данные: одна встроенная таблица опкодов на каждый релиз, переопределяемая через --opcodes
  • Плавная деградация: нераспознанные конструкции становятся комментариями-заглушками — никогда не приводят к сбою

Установка

Homebrew (macOS и Linux):

brew install ejfkdev/tap/pycdc

cargo, из crates.io:

cargo install pycdc

Готовые бинарные файлы: необработанные исполняемые файлы (без обёртки архива) на странице Releases — Linux / Windows x86_64 + arm64, macOS arm64 + x86_64; сборки для Linux и Windows сжаты UPX, для macOS поставляются без сжатия.

Из исходного кода:

cargo build --release      # -> target/release/pycdc + pycdas
cargo install --path .     # or install both binaries from a checkout

Каждый метод предоставляет как pycdc, так и pycdas.

Использование

# single file -> stdout, a file, or a directory
pycdc program.pyc > program.py
pycdc program.pyc -o program.py
pycdc program.pyc -o ./outdir/

# stdin (pipelines): - reads the pyc from stdin
cat program.pyc | pycdc -

# batch: mirror a directory tree (parallel by default, -j N to control,
# -q suppresses the per-file src -> dst lines)
pycdc ./pyc-corpus -o ./src-out
pycdc ./pyc-corpus               # -> ./pyc-corpus-decompiled/
pycdc a.pyc b.pyc                # -> a.py, b.py next to the inputs
pycdc ./pyc-corpus -o ./src-out -q -j 8

# raw marshal (no pyc header) with an explicit version
pycdc -v 3.8 payload.marshal

# disassembly — same CLI surface (files, dirs, stdin, -o/-j/-q);
# also reachable as the `pycdc dis` subcommand (identical output)
pycdas program.pyc
pycdc dis program.pyc
pycdas ./pyc-corpus -o ./dis-out # -> mirrored .dis files

pycdc --help, pycdc dis --help и pycdas --help документируют каждый флаг. Коды выхода: 0 — успех, 1 — не удалось обработать файл, 2 — ошибка использования.

Производительность

Apple Silicon, 526 реальных файлов .pyc (~9,5 МБ, stdlib Python 2.6–3.14):

СценарийВремяПиковый RSS
Пакетный, параллельный (по умолчанию)≈0,05 с≈25 МБ
Пакетный, последовательный (-j 1)≈0,34 с≈13 МБ
Крупнейший одиночный файл (74 КБ, включая запуск)≈5,5 мс≈4,4 МБ
Запуск процесса≈2 мс—

Реальный корпус (семь крупных проектов, последние теги релизов)

tools/fetch_realworld.sh выполняет sparse-checkout одного каталога из каждого из семи проектов на его последнем теге релиза, компилирует каждый .py в .pyc (compileall -b) и размещает дерево в tests/realworld/ (игнорируется git — скрипт является способом его воссоздать):

Проект (тег)модулипоследовательный -j 1параллельный (по умолчанию)перекомпиляцииAST-идентичные¹
yt-dlp (2026.08.19)10450,46 с0,08 с1045/1045501/1045
matplotlib (v3.11.2)2530,33 с0,06 с253/25360/253
pandas (v3.0.5)14200,90 с0,14 с1420/1420584/1420
django (6.1.1)9070,38 с0,10 с907/907468/907
sympy (1.14.0)15323,03 с1,63 с1532/1532479/1532
scikit-learn (1.9.1)6710,48 с0,07 с671/671216/671
ansible (v2.21.4)5830,27 с0,05 с583/583185/583
итого64115,85 с2,13 с6411/6411 (100 %)2493/6411

¹ строго: AST с удалёнными docstring, равное исходному коду — эквивалентные нормализации (if/else вместо тернарного оператора, избыточные *()/**{} вокруг распаковки, переупорядоченные именованные аргументы) считаются различиями, поэтому рассматривайте это как нижнюю границу точности формы, а не как частоту ошибок. Столбец parse/recompile — это критерий приёмки.

Один процесс pycdc на проект: ~0,9 мс на модуль последовательно, пиковый RSS ≈81 МБ для всего пакета из 6,4 тыс. модулей. Все 6411 модулей перекомпилируются; последнее семейство (словарное включение, вложенное в элемент генераторного выражения, включая аргументы вызова) было закрыто пакетом PR от сообщества. Сырые данные: benchmarks/realworld.json, стенд: tools/bench_realworld.py.

Верификация

Три независимых стенда, все запускаются локально (нужны интерпретаторы pyenv/uv 2.6–3.15):

СтендЧто он доказываетТекущий результат
tools/verify_corpus.py528 модулей stdlib: декомпиляция → перекомпиляция тем же интерпретатором → сравнение сигнатур байткода, с откатом к diff нормализованного AST528/528 семантически (406 сигнатурно точных, 0 синтаксических ошибок, 0 заглушек)
tools/run_behavior.py72 поведенческих случая × 14 интерпретаторов: запуск оригинала и декомпилированного, сравнение stdout + кода выхода663/663 = 100% (2.6–3.15)
tests/roundtrip.pyматрица фикстур: компиляция → декомпиляция → перекомпиляция → строгое сравнение байткода49/54 строго (фикстуры исключений структурно отличаются, семантически эквивалентны)

Результат для 3.15 отражает CPython 3.15.0/3.15.1, в которых изменились кодировки inline-включений, вызовов и импортов; его таблица опкодов генерируется из работающего интерпретатора. Все поведенческие случаи проходят, а pandas+scikit-learn перекомпилируются 2091/2091 под 3.15; оставшийся крайний случай с возвратом в теле with задокументирован в docs/LIMITATIONS.md.

Скачать инструмент