No-code для Python: программа без кода (но работает)

Если вы когда-нибудь мечтали показать начальству «я ничего не писал», но при этом чтобы программа честно работала — вселенная услышала. Появился пакет no-code для Python, который превращает обычный скрипт в файл из одной строки # coding: no и набора невидимых символов, но код при этом по-прежнему запускается и делает всё то же самое. (GitHub)

Давайте разберёмся, как это устроено, зачем вообще нужно и какие у него «родственники» в мире эзотерического кода.


Что такое no-code для Python

no-code — это Python-пакет и команд-лайн утилита, которая: (GitHub)

  • берёт ваш обычный some_code.py;
  • кодирует его содержимое в последовательность невидимых Unicode-символов;
  • добавляет в начало строку: # coding: no
  • и на выходе выдаёт файл, который в редакторе выглядит как «пустой» скрипт, но при запуске выполняет исходный код.

Основная идея родом из шуточной философии «No Code»:

лучший безопасный и надёжный код — это отсутствие кода.

Но иногда всё-таки нужно, чтобы программа что-то делала. Вот no-code и закрывает эту дырку — вы распространяете “программу без кода”, которая всё равно работает.


Магия под капотом: невидимые символы и своя «кодировка»

Фокус строится на двух вещах:

  1. Невидимые символы с нулевой шириной
    Используются два Unicode-символа: пробелы нулевой ширины 0x200B и 0x200C.
    • один символ трактуется как 0
    • второй — как 1
    Тело скрипта превращается в двоичную строку и записывается как длинная последовательность этих символов. В редакторе вы их не видите — файл выглядит почти пустым. (opennet.ru)
  2. Пользовательская “кодировка” no
    Строка # coding: no говорит интерпретатору Python: «загружай этот файл, считая, что исходник закодирован специальной кодировкой no». Механизм coding: в первой/второй строке — стандартный способ указать кодировку исходного кода в Python. Пакет no_code при установке кладёт в site-packages файл no.pth, который автоматически подгружает модуль и регистрирует кодировку no. При запуске Python:
    • видит # coding: no;
    • вызывает обработчик этой кодировки;
    • тот декодирует невидимые символы обратно в обычный Python-текст;
    • и уже этот текст уходит в парсер. (GitHub)

Снаружи файл как будто из одной строки. Внутри — шпионская переписка из нулей и единиц.


Пример использования: от кода к “ничему” и обратно

Представим простой скрипт:

# some_code.py
print("Hello, world!")

Дальше включаем магию:

no_code some_code.py > hidden.py

Файл hidden.py теперь будет выглядеть в редакторе как:

# coding: no
​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

(внизу на самом деле не пробелы, а невидимые Unicode-символы.)

Но если запустить:

python hidden.py

вы увидите:

Hello, world!

А если захочется вернуть всё как было:

yes_code hidden.py > restored.py

и в restored.py снова окажется нормальный Python-код. (GitHub)


Частичное скрытие кода: не только целый файл

Если хочется спрятать не весь скрипт, а только отдельные куски, в пакете есть две удобные функции: (GitHub)

  • no_code.nothing() — превращает строку или байты во «величественное Ничего» (последовательность невидимых символов).
  • no_code.something() — делает обратное: из невидимых символов извлекает исходные данные.

Этим можно, например:

  • спрятать конфиг или секретную строку прямо в исходнике (для шутки; для реальной безопасности это не решение);
  • зашить пасхалку, которую «увидит» только тот, кто знает про no-code;
  • усложнить жизнь тем, кто читает код на собеседовании 😈

Команды no_code и yes_code умеют работать и через stdin, так что можно строить такие цепочки:

echo "print(2 + 2)" | no_code | yes_code | python

Как установить no-code

Для работы нужен Python 3.10+. Установка максимально стандартная (рекомендуется виртуальное окружение): (GitHub)

python -m venv .venv
source .venv/bin/activate

python -m pip install git+https://github.com/lemonyte/no-code

Если при запуске закодированного скрипта вы ловите:

  • SyntaxError: invalid syntax — проверьте, что первая строка именно # coding: no;
  • SyntaxError: encoding problem: no — это сигнал, что кодировка no не зарегистрировалась при старте. В таком случае README проекта подсказывает, как вручную добавить no.pth в site-packages для вашей установки Python. (GitHub)

Это безопасность или просто прикол?

Важно понимать: no-code — это шутливый, эзотерический инструмент, а не серьёзная защита.

Да, он:

  • прячет код от беглого взгляда;
  • сбивает с толку человека, который открыл файл и увидел «одну строку»;
  • отлично подходит для демо, докладов и CTF-задач.

Но он не:

  • защищает от реверса (код легко восстановить yes_code или своим декодером);
  • заменяет нормальную обфускацию или шифрование;
  • решает реальные задачи безопасности.

По сути, это интеллектуальный мем в виде Python-пакета. Зато очень в духе разработчиков: «мы взяли шутку и довели её до рабочего инструмента».


Аналоги и вдохновение

У no-code есть яркие «родственники» в других языках: (Telegram)

  • Perl Acme::Bleach — модуль, который превращает код в набор пробелов и табуляций. Открываешь файл — там ничего «нет». Запускаешь — всё работает.
  • JavaScript INVISIBLE.js — библиотека, которая кодирует JS в символы нулевой длины (похожая идея с невидимыми символами).
  • А ещё весь этот подход перекликается с известным тезисом «лучший код — тот, который удалось не писать».

no-code аккуратно вписывается в этот пантеон эзотерических игрушек для разработчиков.


Зачем это может пригодиться на практике

Помимо «поржать и забыть», у инструмента есть несколько вполне жизнеспособных сценариев:

  • Демо и доклады — эффектно показать, как Python «исполняет ничего».
  • Учебные материалы — иллюстрировать работу кодировок, Unicode и Python-механизма coding:.
  • Развлекательные задачки — сделать маленький CTF, где участники должны догадаться, что пустой файл на самом деле не пустой.
  • Код-гольф и троллинг друзей — отправить «пустой» файл, который на самом деле запускается.

Но, конечно, использовать это в боевом продакшене — уже отдельный уровень экстремального спорта.


Итог

no-code для Python — отличный пример того, как из шутки рождается работающий инструмент:

  • скрипт превращается в одну видимую строку # coding: no и стену невидимых символов;
  • при этом программа продолжает выполнять свой исходный код;
  • всё строится на кастомной кодировке и Unicode-символах нулевой ширины;
  • для любителей эзотерики есть и функции nothing()/something() для точечного «обнукода».

Если хочется поиграться — загляните в репозиторий проекта на GitHub и обсуждение на Hacker News (ту самую ссылку ты уже приложил). (GitHub)


Комментарии загружаются…

blank
Обзор конфиденциальности

На этом сайте используются файлы cookie, что позволяет нам обеспечить наилучшее качество обслуживания пользователей. Информация о файлах cookie хранится в вашем браузере и выполняет такие функции, как распознавание вас при возвращении на наш сайт и помощь нашей команде в понимании того, какие разделы сайта вы считаете наиболее интересными и полезными.