Ошибка или упоминание вида «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, попадёт именно в первый слот — переставить их местами без изменения маски нельзя, иначе вся логика перебора изменится.
Встроенные наборы против пользовательских
Чтобы выбрать правильный подход, полезно видеть разницу между встроенными кодами и пользовательскими слотами. Встроенные наборы фиксированы разработчиками Hashcat, пользовательские полностью определяются вами.
| Обозначение | Тип | Содержимое |
|---|---|---|
?l | Встроенный | Строчные латинские буквы a–z |
?u | Встроенный | Заглавные латинские буквы A–Z |
?d | Встроенный | Цифры 0–9 |
?1 | Пользовательский | То, что передано параметром -1 |
?2 | Пользовательский | То, что передано параметром -2 |
Ключевое отличие: пользовательский набор может комбинировать встроенные коды и произвольные символы, например -1 ?dabcdef — цифры плюс буквы от «a» до «f», что удобно для перебора шестнадцатеричных строк.
Пошаговая проверка при ошибке
Если Hashcat отказывается запускаться и ругается на charset, пройдите по этому чек-листу — каждый шаг устраняет одну из типичных причин.
☑️ Диагностика ошибки custom charset
Особенно полезен режим --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 выведет генерируемые кандидаты в терминал. Это безопасный способ убедиться, что маска и наборы интерпретируются именно так, как задумано.