Skip to content

Repository files navigation

🔍 Инквизитор · Inquisitor

CI Python 3.10+ License: MIT Checked with mypy Linted with ruff

Сканер скрытых угроз в коде и данных — находит невидимые символы Юникода, скрытую стеганографию, утёкшие секреты и подозрительный код. Hidden-threat scanner for source code and data files.

Раньше инквизиторы искали ведьм по скрытым приметам. Инквизитор ищет ту же нечисть — спрятанную в исходном коде.

ShashevPro · https://www.shashevpro.ru/


Зачем это нужно

В марте 2026 года прокатилась волна атаки Glassworm: за одну неделю было заражено более 150 репозиториев на GitHub, а также пакеты npm и расширения VS Code. Вредоносный код прятали в невидимых символах Юникода — он выглядит как пустая строка в любом редакторе и терминале, а «прикрытие» вокруг полезной нагрузки генерировал ИИ. Обычный просмотр кода и классические анализаторы против такого почти бесполезны: нужно смотреть на байты, а не на то, что рисует редактор.

Инквизитор закрывает именно эту дыру.


Что находит

Категория Что именно
Невидимые символы zero-width (U+200B/C/D, U+2060…), селекторы начертания, tag-символы (ASCII-контрабанда), Private Use Area, bidi-override (Trojan Source), управляющие символы
Стеганография расшифровывает скрытые сообщения несколькими схемами (бинарная, V2/октал, кватернарная, hex16) и распознаёт метку автора формата ShashevPro
Гомоглифы слова со смешанными алфавитами (латиница + кириллица) — частый приём маскировки
Секреты ключи AWS, токены Telegram/GitHub/Slack/Stripe, приватные ключи, JWT, парольные присваивания — в кавычках и без кавычек (.env, YAML, ini), с оценкой энтропии
Закодированные строки Base64 / Hex в коде — пытается раскрыть содержимое
Водяные знаки __author__, copyright, метки в комментариях
Подозрительный Python exec/eval/compile (особенно с base64.b64decode), динамические импорты, сетевые вызовы, запуск команд оболочки
Java запуск процессов, рефлексия, небезопасная десериализация, ScriptEngine, динамическая загрузка классов
Скрипты (.ps1/.bat/.cmd/.vbs/.js/.sh) обфускация, загрузчики, обход AV, персистентность
Web (.html/.htm/.svg) вредоносный JS, фишинговые формы, скрытые iframe, meta-redirect, script в SVG
Документы (.docx/.xlsx/.pptx/.pdf) VBA-макросы, инъекции в формулы, JavaScript и Launch в PDF, встроенные файлы, внешние ссылки
Конфиги / данные (.env/.yaml/.json/.ini/.toml/.xml…) сканируются на секреты, невидимые символы и стего

Секреты в отчёте маскируются (sk_live…p7dc), чтобы не светить их целиком.


Установка

pip install -r requirements.txt

Минимально для графического интерфейса нужен только PyQt6. Движок и консольный режим работают на чистой стандартной библиотеке Python 3.10+ — без обязательных зависимостей.

⚠️ О предупреждении Windows

Готовая сборка .exe не имеет платной цифровой подписи — покупать её за сотни долларов в год для бесплатного проекта несправедливо. Поэтому при первом запуске Windows может показать синее окно «Защита компьютера (SmartScreen)».

Это нормально и безопасно. Нажмите «Подробнее» → «Выполнить в любом случае».

Если антивирус ругается — это ложное срабатывание, типичное для программ, собранных через PyInstaller. Исходный код полностью открыт: вы можете проверить его сами или собрать программу из исходников (см. раздел «Сборка»).

Запуск

Графический интерфейс (просто перетащите файл или папку):

python main.py

На Windows можно запустить двойным кликом по run.bat.

Консольный режим (цветной вывод, удобно для CI):

python main.py path/to/project              # проверить папку
python main.py file.py --lang en            # на английском
python main.py src --html report.html       # HTML-отчёт
python main.py src --save report.txt        # текстовый отчёт
python main.py src --json report.json       # JSON-отчёт (для CI/интеграций)
python main.py src --exclude "tests/*"      # пропустить пути (можно несколько раз)
python main.py src --fail-on medium         # код возврата 1 при medium и выше
python main.py file.py --sanitize           # удалить невидимые символы → *.cleaned.*
python main.py file.py --sanitize --in-place  # …перезаписать оригинал
python main.py src --quiet --json out.json  # без вывода, только отчёт

Код возврата (порог задаётся --fail-on, по умолчанию high): 0 — чисто, 1 — найдены находки выбранного уровня и выше, 2 — путь не найден, 3 — не удалось запустить графический интерфейс.

Пример для CI (GitHub Actions)

- name: Инквизитор — проверка на скрытые угрозы
  run: |
    python main.py . --quiet --fail-on high \
      --exclude "tests/*" --json inkvizitor.json

Формат метки автора ShashevPro

Метка кодируется невидимыми символами (схема V2) и имеет вид:

SHASH|shashevpro.ru|2026-06-16|1A3C7883
└─┬─┘ └─────┬─────┘ └────┬───┘ └───┬──┘
магия    домен        дата      CRC32

Инквизитор распознаёт метку, проверяет контрольную сумму и показывает: «Обнаружена метка автора: shashevpro.ru, дата 2026-06-16».

Инквизитор только обнаруживает метку. Её создание выполняется отдельным инструментом ShashevPro.


Тесты

pytest -q

Регрессионный набор (tests/test_engine.py) покрывает round-trip меток, все схемы стеганографии, детекторы секретов (в т.ч. непрокавыченные .env), AST-анализ, гомоглифы, исключения путей и устойчивость к битому вводу.


Сборка .exe (Windows)

pip install pyinstaller
pyinstaller --noconfirm Inkvizitor.spec

Готовый файл появится в dist/Inkvizitor.exe.

Для удобства есть три готовых сборочных скрипта — запускаются двойным кликом:

Скрипт Что собирает Когда использовать
build.bat GUI, один файл Inkvizitor.exe обычная сборка для конечных пользователей
build_onedir.bat GUI, папка dist\Inkvizitor\ нужен более быстрый старт (onedir)
build_console.bat лёгкий Inkvizitor-cli.exe без PyQt6 CI, серверы, автоматизация (только консоль)

Скрипты сами находят Python (py -3 или python), ставят зависимости, используют Inkvizitor.spec, если он есть, и проверяют, что EXE действительно создан.

Иконка assets/icon.png / assets/icon.ico — заглушка. Замените её своим файлом, сохранив имена.


Как расширять

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

  • Новый секрет → добавьте строку в SecretDetector._PATTERNS (engine.py).
  • Новый невидимый символ → дополните множества в classify_char (engine.py).
  • Новая схема стеганографии → добавьте алфавит в _SCHEMES; если он использует символы вне zero-width, добавьте их в _STEGO_CAPABLE.
  • Новое правило AST → добавьте проверку в AstAnalyzer (engine.py).
  • Новый тип файла → расширьте _*_EXT в Scanner.
  • Перевод / новый язык → словарь STRINGS в i18n.py.

Структура:

main.py          точка входа (GUI + консоль, все CLI-флаги)
engine.py        движок: все детекторы, без сторонних зависимостей
i18n.py          переводы RU / EN
reporting.py     отчёты (текст + HTML + JSON)
gui.py           интерфейс PyQt6
tests/           регрессионные тесты (pytest)
assets/          иконка

English summary

Inquisitor scans source code and data files for hidden author marks, invisible Unicode characters, steganographic payloads, leaked secrets and suspicious code — the kind used by the 2026 Glassworm supply-chain attacks that hide malware in characters you cannot see.

  • GUI: python main.py — drag a file or folder, get a traffic-light report.
  • CLI: python main.py <path> --lang en --json report.json --fail-on high.
  • Scans Python, Java, scripts, web files, Office/PDF documents, and config files (.env, YAML, JSON, ini…) — including unquoted secrets.
  • Zero third-party dependencies in the engine; only the GUI needs PyQt6.
  • Machine-readable JSON output and CI-friendly exit codes.
  • --sanitize strips invisible characters from files.
  • Fully bilingual (Russian / English), switchable on the fly.
  • Tested: pytest -q.

A note on the Windows warning: the prebuilt .exe is not signed with a paid code-signing certificate — paying hundreds of dollars a year for a free project isn't fair. On first launch Windows may show a blue "Windows protected your PC (SmartScreen)" window. This is normal and safe — click "More info" → "Run anyway". If your antivirus flags it, that's a false positive common to PyInstaller builds. The full source is open — review it yourself or build from source.


Лицензия / License

MIT (см. файл LICENSE). Используйте, изучайте, улучшайте.

Сделано с уважением к коллегам · ShashevPro · https://www.shashevpro.ru/

About

Desktop scanner for hidden marks and threats in Python code — invisible Unicode, steganography, homoglyphs, secrets and obfuscated code. PyQt6, RU/EN.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages