Ошибка или упоминание вида «custom charset 1» (или «?1», «-1») в Hashcat появляется, когда в маске атаки используется пользовательский набор символов, который либо не задан, либо задан неверно. Hashcat поддерживает до четырёх пользовательских наборов символов — custom charset с номерами от 1 до 4 — и ссылается на них в маске через плейсхолдеры ?1, ?2, ?3 и ?4. Если плейсхолдер встречается в маске, а соответствующий набор не определён параметром командной строки, программа завершит работу с ошибкой.

Ниже разберём, как устроена эта система, чем пользовательские наборы отличаются от встроенных, как правильно их задавать и какие типичные ошибки приводят к сообщениям о «custom charset под номером».

Что такое charset в контексте перебора паролей

Charset (набор символов) — это перечень символов, из которых Hashcat составляет кандидаты в пароль при масковой атаке (режим -a 3). Встроенные наборы обозначаются короткими кодами: ?l — строчные латинские буквы, ?u — заглавные, ?d — цифры, ?s — специальные символы, ?a — все печатаемые символы.

Когда встроенных наборов недостаточно — например, известно, что пароль состоит только из цифр и букв «abc», — используются пользовательские наборы. Именно они и называются custom charset, а номер после названия указывает, какой из четырёх слотов задействован.

💡

Custom charset — это пользовательский набор символов для масковой атаки. Номер (1–4) — это слот, в который набор загружается и на который ссылается маска через ?1, ?2, ?3, ?4.

Как задаются custom charset: синтаксис

Пользовательские наборы передаются программе параметрами командной строки -1, -2, -3, -4 (с одним дефисом). После параметра указывается строка символов, которая и станет содержимым набора. Внутри значения можно использовать встроенные коды — например, -1 ?l?d создаст набор из строчных букв и цифр.

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

hashcat -a 3 -m 0 hash.txt -1 ?l?d -2 ?u?d ?1?1?2?2?1?1

Здесь маска ?1?1?2?2?1?1 означает шестипозиционный пароль, где позиции 1, 2, 5, 6 заполняются из первого набора (буквы и цифры), а позиции 3 и 4 — из второго (заглавные буквы и цифры). Обратите внимание: чтобы задать литеральный дефис в наборе, его обычно ставят в конец строки или экранируют в соответствии с правилами вашей оболочки.

  • 🔢 -1 — первый слот, в маске вызывается как ?1
  • 🔢 -2 — второй слот, вызывается как ?2
  • 🔢 -3 — третий слот, вызывается как ?3
  • 🔢 -4 — четвёртый слот, вызывается как ?4
💡

Если в наборе нужен вопросительный знак как обычный символ, используйте код ?? — он означает литеральный «?», а не начало плейсхолдера.

Почему возникает ошибка с упоминанием custom charset

Самая частая причина сообщения об ошибке — несоответствие маски и параметров. Маска ссылается на ?2, но параметр -2 в команде не передан. Hashcat не может подставить набор, которого не существует, и прерывает запуск.

Вторая типичная ситуация — путаница между -1 (параметр набора) и другими опциями с дефисом. Например, пользователь хочет указать атаку по маске -a 3, но при копировании команды теряется пробел, и значения «склеиваются». Третья причина — использование в маске ?1 внутри файла масок (.hcmask), где наборы тоже должны быть определены либо в самом файле, либо через командную строку.

⚠️ Внимание: параметры -1-4 чувствительны к регистру и к порядку. Значение, переданное после -1, попадёт именно в первый слот — переставить их местами без изменения маски нельзя, иначе вся логика перебора изменится.

📊 С какой проблемой вы столкнулись при работе с custom charset?
Ошибка «не задан charset» при запуске
Непонятен синтаксис ?1 ?2
Набор не подхватывается из файла масок
Просто изучаю тему

Встроенные наборы против пользовательских

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

ОбозначениеТипСодержимое
?lВстроенныйСтрочные латинские буквы a–z
?uВстроенныйЗаглавные латинские буквы A–Z
?dВстроенныйЦифры 0–9
?1ПользовательскийТо, что передано параметром -1
?2ПользовательскийТо, что передано параметром -2

Ключевое отличие: пользовательский набор может комбинировать встроенные коды и произвольные символы, например -1 ?dabcdef — цифры плюс буквы от «a» до «f», что удобно для перебора шестнадцатеричных строк.

Пошаговая проверка при ошибке

Если Hashcat отказывается запускаться и ругается на charset, пройдите по этому чек-листу — каждый шаг устраняет одну из типичных причин.

☑️ Диагностика ошибки custom charset

Выполнено: 0 / 5

Особенно полезен режим --stdout: он выводит кандидаты в консоль без загрузки хешей. Так вы сразу увидите, правильно ли интерпретирована маска и наборы, до того как тратить время на полноценный запуск. Если вывод выглядит не так, как ожидалось — проблема в определении наборов, а не в хешах или железе.

Как задаются наборы в файле масок (.hcmask)

В файле масок пользовательские наборы указываются в начале строки через запятую: charset1,charset2,маска. Например, строка «?l?d,?u,?1?1?2?2?2» задаёт первый набор как буквы+цифры, второй как заглавные буквы, а затем применяет маску. Если наборы не указаны в файле, они берутся из параметров -1…-4 командной строки.

Типичные ошибки и как их избежать

Первая ошибка — попытка использовать более четырёх наборов. Слотов ровно четыре, и ?5 в маске не будет работать как пользовательский набор. Вторая — предположение, что ?1 «сам по себе» что-то значит: без параметра -1 это просто неопределённая ссылка.

Третья ошибка связана с экранированием. В командных оболочках символы вроде ?, ! или ^ могут интерпретироваться самой оболочкой, а не Hashcat. Надёжное решение — заключать значения наборов и маски в кавычки, соответствующие вашей системе (в Windows cmd и в bash правила кавычек различаются).

⚠️ Внимание: чем шире набор символов и длиннее маска, тем быстрее растёт пространство перебора — оно равно размеру набора в степени числа позиций. Прежде чем запускать атаку, прикиньте объём работы: маска из восьми позиций ?a на обычном оборудовании может оказаться практически неподъёмной.

  • 🧩 Всегда проверяйте маску через --stdout перед реальным запуском
  • ✂️ Сужайте наборы до реально возможных символов — это сокращает время перебора на порядки
  • 📄 Для сложных масок используйте файл .hcmask вместо длинной командной строки
  • 🔍 Не смешивайте кодировки: кириллица и не-ASCII символы в наборах требуют аккуратности с кодировкой терминала
💡

Ошибка про custom charset почти всегда означает: маска ссылается на ?N, а параметр -N не задан или задан с ошибкой в синтаксисе. Проверка через --stdout показывает проблему за секунды.

Когда custom charset действительно нужен

Не каждая атака требует пользовательских наборов. Они оправданы, когда у вас есть априорная информация о структуре пароля: например, известно, что пароль состоит из шестнадцатеричных символов, содержит только определённые буквы или что первая позиция — обязательно цифра. В таких случаях custom charset резко сокращает пространство перебора по сравнению с ?a.

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

Частые вопросы

Что означает «custom charset 1» в сообщении Hashcat?

Это ссылка на первый пользовательский набор символов, который задаётся параметром -1 и вызывается в маске как ?1. Если вы видите ошибку с этим упоминанием, скорее всего, набор используется в маске, но не определён в команде.

Сколько пользовательских наборов можно задать одновременно?

Четыре: слоты -1, -2, -3 и -4. Большее количество не поддерживается — при необходимости комбинируйте встроенные коды внутри одного набора.

Можно ли включить кириллицу в custom charset?

Технически можно, передав нужные символы в значении параметра, но результат зависит от кодировки терминала и того, как хешировался исходный пароль. Проверяйте вывод через --stdout, чтобы убедиться, что символы переданы корректно.

Чем ?1 отличается от ?a?

?a — встроенный набор всех печатаемых ASCII-символов, он фиксирован. ?1 — ссылка на ваш собственный набор, содержимое которого вы определяете сами через параметр -1.

Как проверить маску, не запуская взлом?

Добавьте к команде опцию --stdout: Hashcat выведет генерируемые кандидаты в терминал. Это безопасный способ убедиться, что маска и наборы интерпретируются именно так, как задумано.