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

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

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

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

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

Категории

Все категории
Loading categories
jsc_deobfuscator — Статический набор инструментов для деобфускации скомпилированного байткода V8 JavaScript, ориентированный на полезные нагрузки JSCeal. Предоставляет фильтры на основе шаблонов, восстановление линейного потока управления, реконструкцию строк и опциональное переименование функций с помощью LLM для анализа. | Kitploit
Инструменты/GitHubGitHub/hasherezade/jsc_deobfuscator
Статический анализОбратная инженерияАнализ вредоносных программАнализ Бинарных ФайловОбучение и Образование
GitHubhasherezade/jsc_deobfuscator

jsc_deobfuscator

Репозиторий

Популярное

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

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

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

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

Смотреть все инструменты →
Сайт
455610 дней назадПроверено Kitploit

Описание

Статический набор инструментов для деобфускации скомпилированного байткода V8 JavaScript, ориентированный на полезные нагрузки JSCeal. Предоставляет фильтры на основе шаблонов, восстановление линейного потока управления, реконструкцию строк и опциональное переименование функций с помощью LLM для анализа.

Поделиться

JSC Deobfuscator

Этот инструмент предназначен для статической деобфускации скомпилированного байт-кода V8 JavaScript, защищённого с помощью javascript-obfuscator.

Он работает с псевдокодом, созданным View8, а не с исходным кодом JavaScript. Проект разрабатывался и тестировался на нагрузках JSCeal.

Фильтры основаны на шаблонах и предназначены в первую очередь как исследовательский инструментарий и эталонная реализация. Инструмент не является универсальным деобфускатором JavaScript, не восстанавливает исходный код и не создаёт исполняемый JavaScript. Его выходные данные остаются псевдокодом View8, предназначенным для статического анализа, поиска, сравнения и экспорта дерева функций.

📖 Читать Wiki

Примечания по безопасности

  • Сериализованные файлы View8 используют Python pickle. Загрузка вредоносного или недоверенного файла .pkl может привести к выполнению кода. Загружайте только те сериализованные файлы, которые вы создали локально с помощью View8.
  • Имена функций, сгенерированные LLM, являются гипотезами. Проверяйте каждое важное имя на соответствие телу функции, строкам, API, путям и потоку данных.

Требования

  • Python 3.10 или новее;
  • зависимости Python из requirements.txt;
  • дизассемблер V8, совместимый с точной версией V8, используемой нагрузкой;
  • утилита командной строки brotli для пакетного процесса распаковки в Linux;
  • Node.js только при использовании включённого запасного варианта декомпрессии Brotli;
  • ключ API или доступный локальный сервер моделей при генерации новых имён с помощью LLM. Применение существующего CSV-файла переименования не требует серверной части LLM.
  • Создайте изолированное окружение Python:

    root@kitploit:~
    python3 -m venv .venv
    source .venv/bin/activate
    python3 -m pip install --upgrade pip
    python3 -m pip install -r requirements.txt
    

    Серверная часть OpenAI в deobf_ai.py дополнительно требует пакет OpenAI для Python:

    root@kitploit:~
    python3 -m pip install openai
    

    Серверная часть Anthropic использует HTTP API через requests. Серверная часть Ollama ожидает доступный сервер Ollama.

    Деобфускация JSCeal

    1. Распакуйте нагрузку

    Исходная нагрузка JSCeal app.jsc сжата Brotli. В Linux её можно распаковать с помощью утилиты brotli:

    root@kitploit:~
    brotli -d app.jsc -o app.decompressed.jsc
    

    Пакетный процесс в scripts/ выполняет этот шаг с помощью scripts/unpack_all.sh.

    В Windows или когда утилита командной строки brotli недоступна, можно использовать включённый помощник Node.js как запасной вариант. Он только распаковывает входные данные и не выполняет их:

    root@kitploit:~
    node Utils/decompress-jsc.js app.jsc
    

    Он записывает:

    root@kitploit:~
    app.jsc.decompressed.jsc
    

    2. Дизассемблируйте кэш кода V8

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

    Образцы JSCeal, использованные при разработке, были основаны на V8 10.2.154.26. Дизассемблеры по умолчанию из несвязанной сборки V8 работать не будут.

    Дерево исходников содержит исходный код дизассемблера и необходимые патчи V8 в:

    root@kitploit:~
    Utils/disasm/v8dasm.cpp
    Utils/disasm/patches/
    

    Предварительно собранный бинарный файл для Linux распространяется с релизом проекта, а дерево исходников содержит исходный код и патчи, необходимые для его пересборки. Подробное описание доступно в Wiki проекта. После получения или сборки соответствующего v8dasm выполните:

    root@kitploit:~
    /path/to/v8dasm app.decompressed.jsc > app.jsc.disasm.txt
    

    3. Декомпилируйте дизассемблированный код с помощью View8

    Передайте дизассемблированный файл в view8.py и создайте как сериализованный вывод для дальнейшей обработки, так и читаемый псевдокод:

    root@kitploit:~
    mkdir -p decompiled
    
    python3 View8/view8.py \
      --input_format disassembled \
      --inp app.jsc.disasm.txt \
      --normalize \
      --out decompiled/app.dec.txt \
      --export_format decompiled serialized
    

    Это создаёт:

    root@kitploit:~
    decompiled/app.dec.txt
    decompiled/app.dec.pkl
    

    Опция --normalize делает сгенерированные идентификаторы функций воспроизводимыми при повторных запусках дизассемблирования и декомпиляции.

    4. Примените все этапы деобфускации

    Существуют отдельные фильтры для отдельных слоёв обфускации. Их можно применить вместе к сериализованному выводу View8 с помощью deobf_all.py:

    root@kitploit:~
    mkdir -p deobfuscated
    
    python3 deobf_all.py \
      --inp decompiled/app.dec.pkl \
      --out deobfuscated/app.deobf.txt \
      --export_format decompiled serialized
    

    Фильтр строк по умолчанию — вариант 2, используемый большинством проанализированных нагрузок JSCeal. Чтобы явно выбрать более простую схему строк, добавьте:

    root@kitploit:~
    --str_deobf 1
    

    Типичные выходные данные:

    root@kitploit:~
    deobfuscated/app.deobf.txt
    deobfuscated/app.deobf.pkl
    deobfuscated/app.deobf.txt.strings.txt
    decompiled/app.dec.resolved_funcs.csv
    

    CSV-файл разрешённых функций — это кэш, специфичный для образца. Когда он отсутствует, этап строк восстанавливает необходимую конфигурацию декодера, записывает CSV и продолжает деобфускацию строк в том же запуске. Последующие запуски повторно используют кэш и обычно выполняются быстрее.

    Не используйте повторно CSV-файл разрешённых функций с другой декомпилированной нагрузкой.

    5. Переименуйте функции с помощью LLM

    После применения всех структурных фильтров деобфускации deobf_ai.py может предложить имена, описывающие поведение функций. Он поддерживает серверные части Anthropic, OpenAI и Ollama.

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

    Anthropic

    root@kitploit:~
    export ANTHROPIC_API_KEY='...'
    
    python3 deobf_ai.py \
      --inp deobfuscated/app.deobf.pkl \
      --out deobfuscated/app.renamed.txt \
      --llm_backend anthropic \
      --model '<model-id>' \
      --export_format decompiled serialized
    

    OpenAI

    root@kitploit:~
    export OPENAI_API_KEY='...'
    
    python3 deobf_ai.py \
      --inp deobfuscated/app.deobf.pkl \
      --out deobfuscated/app.renamed.txt \
      --llm_backend openai \
      --model '<model-id>' \
      --export_format decompiled serialized
    

    Ollama

    root@kitploit:~
    python3 deobf_ai.py \
      --inp deobfuscated/app.deobf.pkl \
      --out deobfuscated/app.renamed.txt \
      --llm_backend ollama \
      --model '<local-model>' \
      --ollama_url http://localhost:11434 \
      --export_format decompiled serialized
    

    В режиме по умолчанию переименователь строит дерево прямых вызовов, начиная с входной функции, и переименовывает только функции, достигнутые через вызовы. Добавьте --greedy, чтобы включить все видимые ссылки на функции, включая обратные вызовы и назначенные обработчики.

    Возобновление из CSV-файла переименования

    Сгенерированный двухколоночный CSV-файл действует как кэш и позволяет продолжить прерванный запуск. Выберите существующий кэш явно с помощью --csv:

    root@kitploit:~
    python3 deobf_ai.py \
      --inp deobfuscated/app.deobf.pkl \
      --out deobfuscated/app.renamed.txt \
      --csv deobfuscated/app.deobf.renamed_funcs.greedy.example-model.csv \
      --llm_backend anthropic \
      --model '<model-id>' \
      --greedy \
      --export_format decompiled serialized
    

    В обычном режиме CSV-файл рассматривается как потенциально частичный кэш. Кэшированные имена применяются первыми, функции, уже покрытые кэшем, удаляются из выбранного дерева вызовов или ссылок, и LLM вызывается только для функций, которые остались неразрешёнными. Если CSV-файл полностью покрывает это дерево, ключ API или соединение с LLM не требуются. Если он покрывает только часть дерева, выбранная серверная часть инициализируется, и вновь сгенерированные сопоставления добавляются в тот же CSV-файл.

    Используйте тот же режим дерева, который использовался при создании CSV-файла. CSV-файл, созданный из запуска --greedy, обычно снова требует --greedy, если цель — продолжить этот запуск, а не только повторно использовать подмножество прямых вызовов.

    Применение существующего CSV-файла без LLM

    Используйте --apply-csv-only, когда CSV-файл уже содержит метки, которые вы хотите применить, включая проверенные, отредактированные, импортированные или перебазированные сопоставления:

    root@kitploit:~
    python3 deobf_ai.py \
      --inp deobfuscated/app.deobf.pkl \
      --out deobfuscated/app.renamed.txt \
      --csv renamed_functions.normalized.csv \
      --apply-csv-only \
      --export_format decompiled serialized
    

    Этот режим:

    • требует явный --csv;
    • загружает и применяет соответствующие имена без построения дерева вызовов или ссылок;
    • не выполняет запросов к LLM или API и не требует ключа API;
    • не добавляет новые строки в CSV-файл;
    • не может быть объединён с --func.

    Строки, чей исходный идентификатор функции не существует во входных данных, игнорируются. Команда завершается ошибкой, когда CSV-файл не содержит сопоставлений, применимых к загруженному файлу.

    Анализ одной функции подробно

    Используйте --func с точным полным идентификатором функции, чтобы запросить целенаправленный семантический анализ одной деобфусцированной функции:

    root@kitploit:~
    python3 deobf_ai.py \
      --inp deobfuscated/app.deobf.pkl \
      --func func_example_0x100001234 \
      --llm_backend anthropic \
      --model '<model-id>'
    

    Анализ включает предлагаемое имя, сводку поведения, входные данные и возвращаемое значение, побочные эффекты, пошаговую логику, очищенный псевдокод, подтверждающие доказательства и нерешённые неопределённости. Указание --csv добавляет кэшированные семантические имена как контекст для ссылок внутри выбранной функции без изменения загруженного корпуса. Используйте --analysis-out analysis/function.md, чтобы сохранить отчёт в формате Markdown. Нечёткие совпадения выводятся только как предложения; запрошенный идентификатор функции должен совпадать точно.

    Используйте --help для параметров, управляющих температурой, пакетной обработкой, режимом мышления Anthropic, лимитами токенов и пользовательскими путями CSV.

    Имена, сгенерированные LLM, — это навигационные подсказки, а не доказательства. Всегда проверяйте их на соответствие деобфусцированному телу.

    6. Работа с выходными данными

    Деобфусцированные выходные данные JSCeal обычно очень большие. Загрузите сериализованный вывод обратно в View8 и разделите его на более мелкие деревья функций.

    На этом этапе добавьте --scope 0. Распространение области уже было выполнено деобфускатором, и его повторение может привести к неправильному распространению значений.

    Дерево на основе отношений деклараторов:

    root@kitploit:~
    python3 View8/view8.py \
      --input_format serialized \
      --inp deobfuscated/app.deobf.pkl \
      --out trees/declarers \
      --export_format decompiled \
      --tree start \
      --scope 0
    

    Компактный обзор прямых вызовов:

    root@kitploit:~
    python3 View8/view8.py \
      --input_format serialized \
      --inp deobfuscated/app.deobf.pkl \
      --out trees/calls \
      --export_format decompiled \
      --tree start \
      --scope 0 \
      --split_mode calls \
      --inline_depth 1 \
      --split_depth 5
    

    Более широкое дерево ссылок, включая обратные вызовы и назначенные обработчики:

    root@kitploit:~
    python3 View8/view8.py \
      --input_format serialized \
      --inp deobfuscated/app.deobf.pkl \
      --out trees/references \
      --export_format decompiled \
      --tree start \
      --scope 0 \
      --split_mode references \
      --inline_depth 1 \
      --split_depth 3
    

    Деобфускация строк

    Разные JSC-файлы могут использовать разные режимы обфускации строк.

    Простейший наблюдаемый режим использует сдвиг индексов и обрабатывается deobf_str1.py. Наиболее распространённый режим JSCeal использует Base64, RC4, фрагментированные строки и преобразованные индексы; он обрабатывается deobf_str2.py.

    Полный конвейер по умолчанию выбирает вариант 2. Фильтры также можно запускать независимо для тестирования.

    deobf_str2.py

    Используйте --help, чтобы отобразить все доступные режимы и параметры:

    root@kitploit:~
    python3 deobf_str2.py --help
    

    Прямой запуск деобфускации строк можно начать с:

    root@kitploit:~
    python3 deobf_str2.py \
      --inp decompiled/app.dec.pkl \
      --out work/app.strings.txt \
      --export_format decompiled serialized
    

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

    При прямом использовании deobf_str2.py его имя CSV-файла по умолчанию — resolved_funcs.csv. Выберите путь, специфичный для образца, с помощью --csv или -c:

    root@kitploit:~
    python3 deobf_str2.py \
      --inp decompiled/app.dec.pkl \
      --out work/app.strings.txt \
      --csv decompiled/app.dec.resolved_funcs.csv \
      --export_format decompiled serialized \
      --verbosity 1
    

    При объединении отдельных фильтров сохраняйте сериализованный вывод между этапами, чтобы последующие проходы могли продолжать работать с объектами View8.

    Конвейер по умолчанию

    deobf_all.py применяет следующие этапы по порядку:

    1. распространение локальных переменных и значений области;
    2. восстановление строк;
    3. распространение области и словаря;
    4. устранение развёртывания потока управления;
    5. обновление строк, раскрытых устранением развёртывания;
    6. замена прокси-вызовов и обёрток операций;
    7. распространение глобальных значений;
    8. консервативная очистка локальных временных значений;
    9. финальное обновление вновь раскрытых вызовов декодера строк.

    Переименование функций с помощью LLM является необязательным и выполняется отдельно после структурной деобфускации.

    Пакетные вспомогательные скрипты

    Репозиторий включает полный вспомогательный процесс в scripts/. Все скрипты находятся в одном каталоге и используют одну централизованную конфигурацию.

    root@kitploit:~
    scripts/config.sh                         общие пути к инструментам и рабочей области
    scripts/copy_payloads.sh                  сбор и именование MD5 файлов JSCeal app.jsc
    scripts/unpack_all.sh                     декомпрессия Brotli
    scripts/disasm_all.sh                     пакетное дизассемблирование V8
    scripts/decompile_all.sh                  пакетная декомпиляция View8
    scripts/deobfuscate_all.sh                пакетная деобфускация с объединённым журналом
    scripts/run_unattended.sh                 автономная деобфускация и проверка
    scripts/collect_output.sh                 сбор кэшей декодеров и списков строк
    

    Поставляемый scripts/config.sh содержит пути из примера окружения:

    root@kitploit:~
    JSC_DEOBF_ROOT="$HOME/jsc_deobfuscator"
    V8DASM="$HOME/code/v8/v8dasm"
    

    Отредактируйте этот файл один раз, чтобы настроить путь установки, соответствующий дизассемблер V8, каталоги рабочей области, внешние команды, пути журналов и структуру сбора. Рабочая область по умолчанию — каталог, из которого запускается вспомогательный скрипт.

    Каждое значение также можно переопределить через переменную окружения. JSC_HELPER_CONFIG может выбрать другой файл конфигурации.

    Типичный пакетный запуск:

    root@kitploit:~
    scripts/copy_payloads.sh
    scripts/unpack_all.sh
    scripts/disasm_all.sh
    scripts/decompile_all.sh
    scripts/deobfuscate_all.sh
    scripts/collect_output.sh
    

    Скрипты сохраняют соглашения, используемые для корпуса JSCeal, включая обработку обнаруженных файлов app.jsc как нагрузок, сжатых Brotli, и их именование по MD5. Просмотрите scripts/README.md перед применением процесса к несвязанным образцам.

    Автономный запуск корпуса

    Для длительного пакетного запуска scripts/run_unattended.sh запускает деобфускацию с nohup, записывает файлы журнала с отметкой времени, PID и статуса, а также проверяет каждый сгенерированный вывод на наличие неразрешённых ссылок на кэшированные функции декодера строк:

    root@kitploit:~
    scripts/run_unattended.sh
    

    Выбранные образцы можно указать явно:

    root@kitploit:~
    scripts/run_unattended.sh \
      decompiled/sample1.dec.pkl \
      decompiled/sample2.dec.pkl
    

    Структура репозитория

    root@kitploit:~
    View8/                         декомпилятор View8 и экспортёр деревьев функций
    Utils/decompress-jsc.js        запасной вариант декомпрессии Brotli для Windows
    Utils/disasm/v8dasm.cpp        исходный код дизассемблера V8
    Utils/disasm/patches/          патчи V8, необходимые дизассемблеру
    Utils/check_unresolved_decoder_references.py
                                   вспомогательный скрипт проверки вывода
    deobf_all.py                   полный конвейер деобфускации по умолчанию
    deobf_str1.py                  простой фильтр сдвига индексов строк
    deobf_str2.py                  фильтр строк RC4/Base64 с восстановлением индексов
    deobf_scope2.py                распространение области и словаря
    deobf_unflattener.py           устранение развёртывания потока управления
    deobf_replace_ops.py           замена прокси и обёрток операций
    deobf_globals.py               глобальное распространение
    deobf_inline_temporaries.py    консервативная финальная очистка
    deobf_ai.py                    необязательное переименование функций с помощью LLM
    scripts/                       настраиваемые пакетные и проверочные помощники
    

    Запуск отдельных фильтров

    Каждый основной проход можно выполнять отдельно для тестирования. Запустите выбранный скрипт с --help, чтобы увидеть его полный интерфейс:

    root@kitploit:~
    python3 deobf_str1.py --help
    python3 deobf_str2.py --help
    python3 deobf_scope2.py --help
    python3 deobf_unflattener.py --help
    python3 deobf_replace_ops.py --help
    python3 deobf_globals.py --help
    python3 deobf_inline_temporaries.py --help
    

    Известные ограничения

    • Логика деобфускации распознаёт шаблоны, наблюдаемые в JSCeal и связанных выводах javascript-obfuscator. Новые варианты могут потребовать дополнительных детекторов или преобразований.
    • Неоднозначный поток управления намеренно оставляется без изменений, а не переписывается спекулятивно.
    • Вывод View8 — это псевдокод и может использовать обозначения, не являющиеся допустимым JavaScript.
    • Форматы кэша кода и дизассемблирования V8 привязаны к конкретным версиям V8.
    • Кэши декодеров строк специфичны для образца.
    • Имена, созданные с помощью LLM, могут быть ошибочными, даже если звучат правдоподобно.

    Проверка

    Конвейер прошёл регрессионное тестирование на корпусе JSCeal, использованном в сопутствующем исследовании. Базовые проверки релиза включают:

    root@kitploit:~
    python3 -m compileall -q .
    python3 deobf_all.py --help
    python3 deobf_str2.py --help
    python3 deobf_ai.py --help
    python3 View8/view8.py --help
    

    Для каждого образца корпуса убедитесь, что запуск:

    • завершается успешно;
    • записывает как вывод .pkl, так и .txt;
    • создаёт список декодированных строк;
    • создаёт или повторно использует ожидаемый CSV-файл разрешённых функций;
    • не оставляет неразрешённых ссылок на декодеры в видимом выводе.

    Автономный вспомогательный скрипт автоматизирует финальную проверку ссылок на декодеры.

    Благодарности

    • View8 изначально создан Моше Марелусом.
    • Конвейер деобфускации разработан на основе анализа JSCeal.
    • Преобразования строк и потока управления нацелены на шаблоны, генерируемые javascript-obfuscator.

    Лицензия

    Исходный код JSC Deobfuscator, созданный для этого проекта, лицензирован в соответствии с GNU General Public License, версия 2 или (по вашему выбору) любая более поздняя версия (GPL-2.0-or-later). См. LICENSE для полного текста лицензии.

    Copyright (C) 2026 Александра «Hasherezade» Донец @ Check Point Research.

    Подмодуль View8 — это отдельный проект. Материалы дизассемблера, производные от сторонних проектов, в Utils/disasm/ сохраняют своё существующее происхождение и не перелицензируются приведённым выше уведомлением об авторских правах.

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