Zurück zu den Updates
New releaseAug 4, 2026

hate_crack v2.25.1

Ein Tool zur Automatisierung von Cracking-Methoden mit Hashcat vom TrustedSec-Team.

Teilen
  ___ ___         __             _________                       __
 /   |   \_____ _/  |_  ____     \_   ___ \____________    ____ |  | __
/    ~    \__  \\   __\/ __ \    /    \  \/\_  __ \__  \ _/ ___\|  |/ /
\    Y    // __ \|  | \  ___/    \     \____|  | \// __ \\  \___|    <
 \___|_  /(____  /__|  \___  >____\______  /|__|  (____  /\___  >__|_ \
       \/      \/          \/_____/      \/            \/     \/     \/

Installation

Die Installation aus dem Quellcode ist der einzige unterstützte Weg. hate_crack ist nicht auf PyPI verfügbar: pip install hate-crack führt zu einem 0.0.0-Platzhalter, der absichtlich fehlschlägt und hierher zurückverweist. Der Name wird nur reserviert, damit niemand anderes ein ähnliches Paket darunter veröffentlichen kann — siehe packaging/pypi-placeholder/.

1. hashcat installieren

Hashcat muss installiert und in deinem PATH verfügbar sein:

Ubuntu/Kali:```bash sudo apt-get install -y hashcat

macOS (Homebrew):```bash
brew install hashcat

Oder laden Sie ein vorgefertigtes Binary von https://hashcat.net/hashcat/ herunter und setzen Sie hcatPath in config.json auf dessen Speicherort.

2. hate_crack herunterladen

Klonen Sie mit Submodulen (erforderlich für hashcat-utils, princeprocessor, pcfg_cracker und optional omen):```bash git clone --recurse-submodules https://github.com/trustedsec/hate_crack.git cd hate_crack

Wenn Sie ohne Submodule geklont haben, initialisieren Sie sie:```bash
git submodule update --init --recursive

Dann passen Sie die Konfiguration bei Bedarf an. hate_crack verwendet zwei Konfigurationsdateien, die jeweils eine eigene Gruppe von Einstellungen besitzen:

  • config.json — Wordlist-Pfade, Masken, Regeln, Tuning, Potfile, Hashcat-Pfad, Kandidatenlimits, Benachrichtigungsschalter, CLI-Standardwerte (35 Einstellungen).
  • .env — nur Drittanbieter-Integrationseinstellungen: Hashview- und Hashmob-Anmeldedaten, Pushover-Anmeldedaten, Ollama und pipal (14 Einstellungen). Nicht von Git verfolgt, mit Modus 0600 erstellt.

Die Trennung ergibt sich aus einem Grund: .env ist die Datei, die Geheimnisse enthalten darf. Anmeldedaten für und Konfiguration von Drittanbieterdiensten gehören in die nicht verfolgte Datei mit Modus 0600; alles, was hate_crack lokal tut, bleibt in config.json, das sicher geteilt, per Diff verglichen und in eigenen Notizen eingecheckt werden kann. Genau deshalb stehen die Pushover-Anmeldedaten in .env, während die Pushover-Ein-/Aus-Schalter in config.json stehen — die Schalter sind lokale Einstellungen, keine Geheimnisse.

Jeder Schlüssel hat genau einen Platz. Ein Schlüssel, der in der anderen Datei abgelegt ist, wird ignoriert, und hate_crack gibt eine Warnung aus, die die Datei benennt, zu der er gehört. Jeder Schlüssel kann für einen einzelnen Lauf weiterhin überschrieben werden, indem die zugehörige Umgebungsvariable exportiert wird. Die meisten Benutzer können diesen Schritt überspringen, da die Standardpfade sofort funktionieren.

config.json ist dauerhaft und erstklassig — es ist nicht veraltet und es gibt keinen Zeitplan für seine Entfernung. Nur die Integrationseinstellungen sind umgezogen.

Upgrade von einer einzelnen config.json? hate_crack migriert sie für Sie beim ersten Lauf: Die Integrationseinstellungen werden in eine neue .env mit Modus 0600 kopiert und anschließend aus config.json entfernt, sodass die beiden Dateien sie nicht beide für sich beanspruchen. Es gibt aus, welche Schlüssel verschoben wurden (niemals deren Werte), und speichert Ihr Original als config.json.pre-split.bak, bevor es die Datei anfasst. Alles andere in config.json bleibt genau wie es war, einschließlich der Schlüsselreihenfolge.

Erster Lauf: hate_crack erstellt beide Dateien für Sie, es ist also nichts zu tun. Um .env stattdessen von Hand einzurichten, kopieren Sie die von Git verfolgte Vorlage:```bash cp .env.example .env chmod 600 .env

`.env.example` wird eingecheckt und wird mit jedem leeren Credential-Schlüssel ausgeliefert. `.env` selbst darf **niemals** eingecheckt werden — es ist gitignored, zusammen mit seinen üblichen Backup-Schreibweisen, und hate_crack erstellt es immer mit Modus `0600` (nur Besitzer lesen/schreiben). `.env.example` wird aus dem Schema generiert; generiere es nach Änderungen an `hate_crack/config_schema.py` neu mit `uv run python -m hate_crack.config_writer`.

### 3. Abhängigkeiten und hate_crack installieren

Der einfachste Weg ist, `make` (oder `make install`) auszuführen, was dein Betriebssystem automatisch erkennt und installiert:
- Externe Abhängigkeiten (p7zip, transmission-daemon / transmission-remote)
- Erstellt Submodule (hashcat-utils, princeprocessor, pcfg_cracker und optional omen)
- Python-Abhängigkeiten über uv und einen CLI-Shim unter `~/.local/bin/hate_crack````bash
make

Dies ist idempotent - bereits installierte Tools werden übersprungen. Um eine saubere Neuinstallation zu erzwingen:```bash make reinstall

**Oder Abhängigkeiten manuell installieren:**

### Externe Abhängigkeiten
Diese werden für bestimmte Download-/Extraktionsabläufe benötigt:

- `7z`/`7za` (p7zip) — wird zum Extrahieren von `.7z`-Archiven verwendet.
- `transmission-daemon` / `transmission-remote` — wird zum Herunterladen von Weakpass-Torrents verwendet.

Manuelle Installationsbefehle:

Ubuntu/Kali:```bash
sudo apt-get update
sudo apt-get install -y p7zip-full transmission-daemon

macOS (Homebrew):```bash brew install p7zip transmission-cli # provides transmission-daemon and transmission-remote

Dann installieren Sie die Python-Abhängigkeiten und den CLI-Shim:```bash
uv sync
mkdir -p ~/.local/bin
printf '#!/usr/bin/env bash\nset -euo pipefail\nexec uv run --directory %s python -m hate_crack "$@"\n' "$(pwd)" > ~/.local/bin/hate_crack
chmod +x ~/.local/bin/hate_crack

Project Structure

Core logic is now split into modules under hate_crack/:

  • hate_crack/cli.py: argparse-Hilfsfunktionen und Konfigurationsüberschreibungen.
  • hate_crack/api.py: Integrationen für Hashview, Weakpass und Hashmob (Downloads/Menüs/Hilfsfunktionen).
  • hate_crack/attacks.py: Menü-Angriffshandler.
  • hate_crack/hashmob_wordlist.py: Hashmob-Wortlisten-Dienstprogramme (dünner Wrapper; ruft api.py auf).
  • hate_crack/corpus_stats.py: Passwortstatistiken für den gesamten Korpus, die verwendet werden, um einen Korpus für das LLM zu beschreiben.
  • hate_crack/plaintext.py: stellt das Passwort aus einer Korpuszeile wieder her (Entfernen des Hash-Präfixes, $HEX[...]-Dekodierung); wird von den LLM-Modi, corpus_stats und rulegen gemeinsam genutzt.
  • hate_crack/llm.py: strukturierte (JSON) LLM-Kandidatengenerierung über Atomic Agents.
  • hate_crack/menu.py: gemeinsamer Menü-Renderer, einschließlich optionaler Pfeiltasten-Navigation.
  • hate_crack/noninteractive.py: Verteiler für die skriptgesteuerten Angriffs-Unterbefehle.
  • hate_crack/notify/: Benachrichtigungspaket (Pushover-Backend, pro-Crack-Tailer).
  • hate_crack/username_detect.py: erkennt username:hash-Eingabedateien, um hashcats --username zu bestimmen.
  • hate_crack/formatting.py, hate_crack/progress.py: Hilfsfunktionen für Ausgabeformatierung und Fortschrittsanzeige.
  • hate_crack/main.py: Haupt-CLI-Implementierung.

The top-level hate_crack.py remains the main entry point and orchestrates these modules.


References and Thanks

This project depends on and is inspired by a number of external projects and services. Thanks to:


Usage

After installing with make, run hate_crack from anywhere:```bash hate_crack

or with arguments:

hate_crack <hash_file> <hash_type> [options]

Alternativ über `uv` ausführen:```bash
uv run hate_crack.py <hash_file> <hash_type>

Als Tool ausführen (empfohlen)

Installieren mit make vom Repository-Stammverzeichnis aus - dies erstellt Submodule und bündelt Assets:```bash cd /path/to/hate_crack make hate_crack

Der `make install`-Befehl erstellt einen Bash-Shim unter `~/.local/bin/hate_crack`, der aus dem Repository-Verzeichnis ausgeführt wird, sodass Konfiguration und Assets unabhängig vom aktuellen Arbeitsverzeichnis immer gefunden werden.

Die Konfiguration wird auch gesucht in:
- Dem Repository-Stamm und dem Paketverzeichnis
- `~/.hate_crack`

**Hinweis:** Der `hcatPath` in `config.json` ist nur für den Speicherort der hashcat-Binärdatei gedacht (optional, wenn hashcat im PATH ist). Hate_crack-Assets (hashcat-utils, princeprocessor, pcfg_cracker, omen) werden aus dem Repository-Verzeichnis geladen und von `make install` automatisch gebündelt.

### Als Skript ausführen
Das Skript verwendet einen `uv`-Shebang. Mache es ausführbar und führe es aus:```bash
chmod +x hate_crack.py
./hate_crack.py

Du kannst Python auch direkt verwenden:```bash python hate_crack.py

### Nicht-interaktive / skriptgesteuerte Nutzung

Für die Automatisierung können Sie einen einzelnen Angriff direkt starten und das Menü überspringen. Der Angriffsname ist das erste Argument, gefolgt von der Hash-Datei und dem Hashcat-Hash-Typ. Vorverarbeitungsabfragen (Computer-Konto-Filterung, LM-zuerst-Brute-Force, Deduplizierung doppelter Konten) akzeptieren in diesem Modus automatisch ihre Standardwerte. Der Prozess beendet sich mit `0` bei Erfolg und mit einem Nicht-Null-Wert bei Fehlern (fehlende Hash-Datei, nicht-numerischer Hash-Typ, fehlende Wortliste oder ein unbekannter Regeldateiname).```bash
# Quick crack: one wordlist + optional rule(s) from the rules directory
hate_crack quick hashes.txt 1000 --wordlist rockyou.txt --rules best64.rule

# Chain two rules in a single run
hate_crack quick hashes.txt 1000 --wordlist rockyou.txt --rules best64.rule+d3ad0ne.rule

# Run two rules as two separate passes
hate_crack quick hashes.txt 1000 --wordlist rockyou.txt --rules best64.rule d3ad0ne.rule

# Canned dictionary methodology (uses your configured wordlists)
hate_crack dict hashes.txt 1000

# Brute force lengths 1-8
hate_crack brute hashes.txt 1000 --min 1 --max 8

# Top-mask attack targeting ~4 hours
hate_crack topmask hashes.txt 1000 --target-time 4

Troubleshooting

Fehler: "would clobber existing tag" beim Aktualisieren

Ein älterer Klon kann das Aktualisieren verweigern und eine lange Liste von Zeilen wie diese ausgeben:``` ! [rejected] v2.5.0 -> v2.5.0 (would clobber existing tag)

Dies betrifft Klone, die vor Juli 2026 erstellt wurden. Die veröffentlichte Historie wurde
damals neu geschrieben, um einige Dateien zu entfernen, die niemals hätten committet werden dürfen, was
jedem Commit eine neue ID gab; die Tags eines älteren Klons zeigen daher auf Objekte, die dieses
Repository nicht mehr enthält, und git weigert sich, ein Tag zu verschieben, das es bereits besitzt.
Es ist nichts an Ihrem Checkout falsch und keine Cracking-Daten sind gefährdet.

Stellen Sie es mit einem einmaligen Reset wieder her. Dabei werden lokale Commits und Änderungen im
Checkout verworfen. Wenn Sie also etwas angepasst haben, das von git verfolgt wird (im Gegensatz zu
`config.json`, das nicht verfolgt wird), committen Sie es zuerst auf einem Branch:```bash
cd /path/to/hate_crack
git fetch --tags --force origin
git checkout -B main origin/main
make install

--force aktualisiert hier nur Tags; es kann deine Commits nicht verändern. Danach funktioniert die integrierte Update-Funktion wieder normal. Versionen vor 2.18 konnten diese Wiederherstellung nicht selbst durchführen, weshalb sie einmal von Hand erledigt werden muss.

Fehler: Build-Verzeichnis existiert nicht

Wenn Sie einen Fehler wie den folgenden sehen:``` Error: Build directory /opt/hashcat/hashcat-utils does not exist. Expected to find expander at /opt/hashcat/hashcat-utils/bin/expander.

Das bedeutet, dass die hate_crack-Assets nicht in das installierte Paket gebündelt wurden.

**Die Pfade verstehen:**
- `hcatPath` in config.json → zeigt auf den **Hashcat-Binärpfad** (optional, kann im PATH liegen)
- `hashcat-utils/` und `princeprocessor/` → werden von `make install` in das Paket gebündelt

**Lösung:**
Erneute Installation mit dem Makefile, das Submodule baut und das Tool installiert:```bash
cd /path/to/hate_crack  # the repository checkout
make install

Standardkonfiguration (config.json.example):

Die meisten Benutzer können die Standardwerte ohne Anpassung verwenden:

  • hcatWordlists: ./wordlists (relativ zum Repository-Root oder HOME/.hate_crack)
  • hcatOptimizedWordlists: ./optimized_wordlists (Verzeichnis, das von Quick Crack verwendet wird; fällt auf hcatWordlists zurück, falls nicht gefunden)
  • rules_directory: ./hashcat/rules (enthält Submodul-Regeln)
  • hcatTuning: `` (leerer String - keine Standard-Tuning-Flags)

Beispiel für config.json-Anpassungen:```json { "hcatPath": "/usr/local/bin", # Location of hashcat binary (optional, auto-detected from PATH) "hcatBin": "hashcat", # Hashcat binary name "hcatWordlists": "./wordlists", # Dictionary wordlist directory (relative or absolute) "rules_directory": "./hashcat/rules", # Rules directory (relative or absolute) "hcatTuning": "", # Additional hashcat flags (empty by default) ... }

**Configuration loading:**
- Priorität für jeden Schlüssel: `os.environ` > die zugehörige Datei des Schlüssels (`.env` oder `config.json`) > eingebauter Standardwert
- Fehlende Schlüssel fallen auf die eingebauten Standardwerte zurück; `config.json.example` dokumentiert jeden `config.json`-Schlüssel
- Beide Dateien werden unabhängig voneinander in dieser Reihenfolge durchsucht: **Repository-Root**, dann **installiertes Paketverzeichnis**, dann **`~/.hate_crack`**. Der erste Treffer gewinnt; es ist normal, dass die beiden Dateien aus verschiedenen Verzeichnissen stammen.
- Beim ersten Lauf werden beide erstellt — `config.json` aus `config.json.example`, `.env` aus den eingebauten Standardwerten. Wenn ein älteres `config.json` noch Integrationsschlüssel enthält, werden diese in die neue `.env` kopiert, und hate_crack teilt dir mit, welche du aus `config.json` löschen sollst; es bearbeitet diese Datei selbst nie.
- Bei jedem Lauf gibt hate_crack die beiden tatsächlich geladenen Dateien aus:  ```
  [*] config.json: /home/you/.hate_crack/config.json
  [*] .env:        /home/you/.hate_crack/.env

Lies diese beiden Zeilen, bevor du eine Einstellung debuggst, die „nicht greift“. Sie existieren wegen zweier Fallstricke in der Suchreihenfolge:

  • Ein Checkout hat Vorrang vor deinem Home-Verzeichnis. Das Repository-Root wird zuerst durchsucht, sodass eine .env oder config.json in irgendeinem Checkout, aus dem du das Tool ausführst, Vorrang vor der in ~/.hate_crack hat – und genau das Ausführen des Tools aus einem Checkout heraus erzeugt diese Dateien dort überhaupt erst.
  • Das aktuelle Arbeitsverzeichnis wird niemals durchsucht. Eine .env in dem Verzeichnis, in dem du dich gerade befindest, wird bewusst ignoriert: Engagement-Verzeichnisse sind voller Dateien, die niemand als Konfiguration vorgesehen hat. Lege sie ins Repository-Root oder nach ~/.hate_crack.

Fehler: Merge mit Referenz 'refs/heads/master', aber diese Referenz wurde nicht abgerufen

Wenn du Folgendes siehst:``` Your configuration specifies to merge with the ref 'refs/heads/master' from the remote, but no such ref was fetched.

Der Standard-Branch wurde von `master` auf `main` umbenannt. Beheben mit:```bash
git remote set-head origin -a
git branch -m master main
git branch --set-upstream-to=origin/main main
git pull

Makefile-Ziele

Standard (vollständige Installation) - erstellt Submodule, installiert Abhängigkeiten und installiert das Tool:```bash make

or explicitly:

make install

Dies ist idempotent - es überspringt bereits installierte Tools.

**Saubere Neuinstallation erzwingen:**```bash
make reinstall

Schnelles Update - baut Submodule neu und installiert das Tool neu (nach dem Ziehen von Änderungen):```bash make update

**Deinstallieren** - entfernt Betriebssystem-Abhängigkeiten und das Tool:```bash
make uninstall

Nur hashcat-utils bauen:```bash make hashcat-utils

**Tests ausführen** - behandelt HATE_CRACK_SKIP_INIT automatisch, wenn nötig:```bash
make test

Coverage-Bericht:```bash make coverage

**Build-/Test-Artefakte bereinigen:**```bash
make clean

Entwicklung

Einrichten der Entwicklungsumgebung

Installieren Sie das Projekt mit optionalen Entwicklungsabhängigkeiten (einschließlich Linter und Testwerkzeugen):```bash make dev-install

### Linter und Typprüfungen ausführen

Bevor du Änderungen pushst, führe diese Prüfungen lokal aus. Verwende `make lint` für alles, oder führe einzelne Prüfungen aus:

**Ruff (Linting und Formatierung):**```bash
make ruff
# or manually:
uv run ruff check hate_crack tests tools packaging hate_crack.py

Probleme automatisch beheben:```bash uv run ruff format hate_crack tests tools packaging hate_crack.py uv run ruff check --fix hate_crack tests tools packaging hate_crack.py

**ty (Typprüfung):**```bash
make ty
# or manually:
uv run ty check hate_crack

Alle Prüfungen gemeinsam ausführen:```bash make lint

### Tests ausführen

Tests erkennen automatisch, wenn Submodule nicht gebaut sind, und setzen `HATE_CRACK_SKIP_INIT=1` automatisch.```bash
make test

Oder pytest direkt ausführen:```bash uv run pytest -v

Mit Abdeckung:```bash
make coverage

Oder mit pytest:```bash uv run pytest --cov=hate_crack

### Git Hooks (prek)

Git-Hooks werden von [prek](https://github.com/j178/prek) (v0.3.3+) verwaltet. Installiere die Hooks mit:```bash
prek install --hook-type pre-push --hook-type pre-commit

Dies installiert die in prek.toml definierten Hooks mithilfe des pre-commit-local-repo TOML-Schemas:

  • pre-push (lokale Hooks): ruff, ruff-format, ty, pytest, pytest-lima, bandit
  • pre-commit (von pre-commit/pre-commit-hooks): trailing-whitespace, end-of-file-fixer, check-yaml, check-merge-conflict, check-added-large-files, detect-private-key

Die pre-commit-Auto-Fixer überschreiben Dateien direkt, daher müssen die Änderungen nach der Ausführung erneut gestaged und committet werden.

Hinweis: prek 0.3.3 erwartet auf oberster Ebene repos = [...]. Das alte Format [hooks.<stage>] commands = [...] wird nicht unterstützt.

Menüs verwenden standardmäßig die klassische nummerierte Auswahl über print() + input(), die vollständige mehrstellige Tasteneingaben akzeptiert.

Um die Pfeiltasten-Navigation über simple-term-menu zu aktivieren, setzen Sie HATE_CRACK_ARROW_MENU=1. In diesem Modus funktionieren nur einstellige Schnellwahltasten; Optionen mit den Nummern 10 und höher müssen über die Pfeiltasten erreicht werden. Der Pfeiltasten-Modus erfordert außerdem ein TTY, daher bleibt er deaktiviert, wenn die Ausgabe über eine Pipe erfolgt.

Entwicklungsabhängigkeiten

Die optionale Gruppe [dev] enthält:

  • ty - Statischer Typprüfer
  • ruff - Schneller Python-Linter und -Formatter
  • pytest - Test-Framework
  • pytest-cov - Coverage-Berichterstattung

Allgemeine Optionen:

  • --download-hashview: Hashs von Hashview vor dem Cracking herunterladen.
  • --hashview: Interaktives Hashview-Menü zur Verwaltung von Hashs, Wortlisten und Jobs.
  • --hashview --help: Hashview-Befehlszeilenoptionen anzeigen.
  • --weakpass: Wortlisten von Weakpass herunterladen.
  • --hashmob: Wortlisten von Hashmob.net herunterladen.
  • --download-torrent <FILENAME>: Eine bestimmte Weakpass-Torrent-Datei herunterladen.
  • --download-all-torrents: Alle verfügbaren Weakpass-Torrents aus dem Cache herunterladen.
  • --wordlists-dir <PATH> / --optimized-wordlists-dir <PATH>: Wortlisten-Verzeichnisse überschreiben.
  • --pipal-path <PATH>: pipal-Pfad überschreiben.
  • --restore-potfile: <hashfile>.out beim Start aus der hashcat-POT-Datei neu aufbauen, vorhandene Inhalte ersetzen und dann mit dem normalen Menü fortfahren. Ohne dieses Flag wird die POT-Suche nur ausgeführt, wenn .out noch nicht existiert. Menüoption 93 führt dasselbe bei Bedarf aus, mit einer Bestätigungsabfrage.
  • --maxruntime <SECONDS>: Maximale Laufzeit überschreiben.
  • --bandrel-basewords <PATH>: bandrel-Basiswörterdatei überschreiben.
  • --update: Auf die neueste Version aktualisieren und neu installieren. Wechselt das Checkout auf main, falls es sich in einem anderen Branch befindet, da dort die Release-Tags liegen.
  • --nightly: Stattdessen auf das neueste Nightly aus dem Branch nightly-dev aktualisieren. Nightlies haben die CI bestanden, sind aber nicht Teil eines offiziellen Releases. Kann auch als --update --nightly angegeben werden.
  • --no-optimized-kernel (oder --no-optimize): Für den gesamten Lauf niemals -O an hashcat übergeben. Überschreibt optimizedKernelAttacks in config.json und entfernt jedes -O, das Sie in hcatTuning angegeben haben. Es wird nichts in die Konfiguration zurückgeschrieben, sodass dies nur für diesen Lauf gilt. Bei einem Unterbefehl muss die Option vor dem Unterbefehl stehen: ./hate_crack.py --no-optimize quick hashes.txt 1000 --wordlist words.txt.
  • --debug: Debug-Logging aktivieren (schreibt nach stderr).

Hashview-Integration

hate_crack integriert sich in Hashview für zentrales Hash-Management und verteiltes Cracking.

Interaktives Menü

Greifen Sie auf das interaktive Hashview-Menü zu:```bash hate_crack.py --hashview

Menu options:
- **(1) Geknackte Hashes hochladen** – Lade geknackte Ergebnisse der aktuellen Sitzung auf Hashview hoch
- **(2) Wortliste hochladen** – Lade eine Wortlistendatei auf Hashview hoch
- **(3) Wortliste herunterladen** – Lade eine Wortliste von Hashview herunter
- **Regel herunterladen** – Lade eine Regelfelddatei von Hashview herunter (dekomprimiert als Klartext, bereit für `hashcat -r`)
- **(4) Verbleibende Hashes herunterladen** – Lade verbleibende ungeknackte Hashes herunter (fragt, ob zum Knacken gewechselt werden soll)
- **(5) Gefundene Hashes herunterladen** – Lade bereits geknackte Hashes mit Klartextpasswörtern herunter (zur Referenz/Analyse)
- **(6) Hashdatei hochladen und Auftrag erstellen** – Lade eine neue Hashdatei hoch und erstelle einen Knackauftrag
- **(99) Zurück zum Hauptmenü** – Zurück zum Hauptmenü

**Wichtig: Gefundene vs. verbleibende Hashes herunterladen**
- **(4) Verbleibende Hashes herunterladen**: Lädt ungeknackte Hashes herunter, die geknackt werden müssen. Automatisches Zusammenführen mit eventuell vorhandenen gefundenen Hashes, mit Aufforderung zum Wechsel zu dieser Hashdatei zum Knacken.
- **(5) Gefundene Hashes herunterladen**: Lädt bereits geknackte Hashes im Format hash:cleartext herunter. Diese dienen zur Referenz und können nicht weiter geknackt werden. Es wird keine Wechselaufforderung angezeigt.

#### Kommandozeilen-Schnittstelle

Hashview-Operationen können auch über die Befehlszeile ausgeführt werden:

Geknackte Hashes hochladen:```bash
hate_crack.py --hashview upload-cracked --file <output_file>.out --hash-type 1000

Wortliste hochladen:```bash hate_crack.py --hashview upload-wordlist --file .txt --name "My Wordlist"

Lade eine Regeldatei herunter (dekomprimiert gespeichert, bereit für `hashcat -r`):```bash
hate_crack.py --hashview download-rules --rules-id 4 --output best64.rule

Downloade verbleibende Hashes (ungeknackte Hashes zum Knacken):```bash hate_crack.py --hashview download-left --customer-id 1 --hashfile-id 123

Gefundene Hashes herunterladen (bereits geknackte Hashes mit Klartext):```bash
hate_crack.py --hashview download-found --customer-id 1 --hashfile-id 123

Hashfile hochladen und Job erstellen:```bash hate_crack.py --hashview upload-hashfile-job --file hashes.txt --customer-id 1
--hash-type 1000 --job-name "NTLM Crack Job" --hashfile-name "Domain Hashes"

#### Konfiguration

Legen Sie die Hashview-Anmeldedaten in `.env` fest (es handelt sich um Integrationseinstellungen, sie befinden sich also nicht in `config.json`):```
HASHVIEW_URL=https://hashview.example.com
HASHVIEW_API_KEY=your-api-key-here

Ollama-Konfiguration

Der LLM Attack (Option 12) nutzt Ollama, um Passwortkandidaten zu generieren. Konfiguriere Modell, Kontextfenster und Request-Timeout in .env:``` OLLAMA_MODEL=qwen2.5:32b OLLAMA_NUM_CTX=8192 OLLAMA_TIMEOUT=300

- **`OLLAMA_MODEL`** — Das für die Kandidatengenerierung verwendete Ollama-Modell (Standard: `qwen2.5:32b`). Der LLM-Angriff verwendet strukturierte (JSON-)Ausgabe, wähle also ein Modell mit guter Tool-/JSON-Unterstützung.
- **`OLLAMA_NUM_CTX`** — Kontextfenstergröße für das Modell (Standard: `8192`). Vor der Einführung der Korpusstatistiken betrug dieser Wert `2048`, was zu klein war, um den Prompt aufzunehmen, der ihm übergeben wurde: 500 abgetastete Klartexte umfassen etwa 2.000–3.500 Token vor dem Systemprompt und der Antwort, sodass Ollama stillschweigend einen Teil der Stichprobe abschnitt, die der Sampler sorgfältig über die Datei verteilt hatte.
- **`OLLAMA_TIMEOUT`** — Sekunden, die auf eine Generierungsantwort gewartet wird, bevor aufgegeben wird (Standard: `300`). Erhöhe diesen Wert, wenn ein großes Modell bei der ersten Anfrage noch in den VRAM lädt, was andernfalls den Timeout überschreiten kann; hate_crack gibt den abgelaufenen Timeout und den Namen dieser Einstellung aus, wenn er auslöst.
- **`OLLAMA_MAX_SAMPLE_LINES`** — Der Schwellenwert, unterhalb dessen die LLM-Modi auch die wörtlichen Klartexte in den Prompt einfügen (Standard: `500`). Werte ≤ 0 werden als 500 behandelt.

  Korpusbasierte Modi (**Wordlist**, **Cracked passwords**, **Pattern rules**) beschreiben stets das *gesamte* Korpus statistisch – Basiswortanteile, Masken, Groß-/Kleinschreibung, Längen, nachgestellte Ziffern und Symbole, Jahreszahlen – anstatt einen Ausschnitt davon einzufügen. Die Aggregation ist begrenzt, sodass ein Dump mit 120.000 Passwörtern etwa denselben Prompt-Platz benötigt wie einer mit 500 Zeilen. Wenn das gesamte Korpus unter diesen Schwellenwert fällt, werden auch die rohen Klartexte einbezogen, da nichts dadurch gewonnen wird, ein kleines Korpus vor dem Modell zu verbergen.

  Dies ersetzt das bisherige Verhalten, eine gleichmäßig verteilte Stichprobe von bis zu `ollamaMaxSampleLines` Passwörtern einzufügen. Eine Stichprobe eines großen Dumps vermittelte keinerlei Häufigkeitsinformationen: Das Modell konnte nicht unterscheiden, ob ein Basiswort von 8 % der Organisation oder nur von einer einzelnen Person verwendet wurde – genau das Signal, das einen Rateversuch lohnenswert macht.
- **`OLLAMA_NO_CLOUD`** — Bei `true` wird verweigert, etwas an ein Ollama-*Cloud*-Modell zu senden. Ollama leitet ein mit `-cloud` gekennzeichnetes Modell (`gpt-oss:120b-cloud`, `deepseek-v3.1:671b-cloud`) über denselben lokalen Endpunkt, den auch ein lokales Modell verwendet, an ollama.com weiter, sodass die Anfrage äußerlich nicht anders aussieht – aber die Prompts von hate_crack enthalten wiederhergestellte Klartexte, Korpusstatistiken sowie den Namen, die Branche und den Standort des Kunden. Mit dieser Einstellung wird ein Cloud-Modellname abgelehnt, bevor überhaupt eine Anfrage aufgebaut wird. Standardmäßig ist sie `false`, sodass ein bewusst konfiguriertes Cloud-Modell weiterhin funktioniert; aktiviere sie für Einsätze, bei denen Kundendaten den Host nicht verlassen dürfen.
- **`OLLAMA_AUTO_RESEARCH`** — Bei `true` (Standard) fragt der Modus **Target info** das lokale Modell, sobald du den Firmennamen eingegeben hast, nach Branche und Standort und bietet sie als bearbeitbare Prompt-Standardwerte an. Setze sie auf `false`, um immer leere Prompts zu erhalten (nützlich bei einem langsamen Modell, da die Recherche einen zusätzlichen Round-Trip vor dem Start des Angriffs kostet).
- **`OLLAMA_HOST`** — Wo Ollama lauscht. Akzeptiert eine reine `host:port`-Angabe (`theplague.lan:11434`) oder eine vollständige URL mit Schema (`https://ollama.example.com`); in beiden Fällen wird die Basis-URL vor der Verwendung normalisiert. Standard ist `localhost:11434`. Setze sie in `.env` oder exportiere sie als echte Umgebungsvariable, um das für einen einzelnen Lauf zu überschreiben – es ist derselbe Variablenname, den auch Ollamas eigene CLI liest.
- Stelle sicher, dass Ollama läuft und das Modell gepullt wurde (`ollama pull qwen2.5:32b`), bevor du den LLM-Angriff verwendest – hate_crack lädt fehlende Modelle nicht mehr automatisch nach.

Der Angriff bietet drei Generierungsmodi:

1. **Target info** — Firma / Branche / Standort; das Modell leitet Kandidaten aus diesen Angaben ab.

   Nachdem du den Firmennamen eingegeben hast, fragt hate_crack dasselbe lokale Modell, was es bereits über diese Organisation weiß, und füllt die Prompts **Industry** und **Location** mit den Antworten vor, die in Klammern angezeigt werden:   ```
   Company name: Acme Rail Services

   [!] The values in parentheses below are the local model's GUESSES, not verified OSINT.
       Press Enter to accept, or type your own value to override.
   Industry (freight rail maintenance):
   Location (Omaha, Nebraska):

Drücken Sie Enter, um einen Vorschlag zu übernehmen, oder überschreiben Sie ihn. Diese Werte sind die Erinnerung des Modells, keine OSINT — behandeln Sie sie als Ausgangspunkt, nicht als Informationen über den Kunden. Die Suche verwendet nur den lokalen Ollama-Server, sodass der Kundenname den Host nie verlässt; es gibt keine Web- oder Drittanbieter-API-Aufrufe. Wenn das Modell die Organisation nicht erkennt (der häufige Fall bei kleinen Kunden), gibt es nichts zurück und Sie erhalten einfache leere Eingabeaufforderungen: ``` Company name: Acme Rail Services Industry: Location:

Ein Recherchefehler – Timeout, Ollama läuft nicht, leere Antwort – blockiert den Angriff nie; er fällt einfach auf leere Prompts zurück. Setzen Sie `ollamaAutoResearch` auf `false`, um die Recherche vollständig zu überspringen.
2. **Wortliste** – Basiswörter aus einer Beispiel-Wortliste ableiten.
3. **Geknackte Passwörter** – Geben Sie die in dieser Sitzung bereits wiederhergestellten Klartexte (`<hashfile>.out`) zurück an das Modell, damit es die eigenen Passwortkonventionen der Zielorganisation ableiten kann (Basiswörter, Jahreszeiten, Jahre, Suffixe, Leetspeak) und *neue* Kandidaten im gleichen Stil erzeugt. Diese Option wird erst aufgelistet, sobald mindestens ein Hash geknackt wurde; die gesamte Datei wird statistisch genauso wie im Wortlisten-Modus analysiert (siehe `ollamaMaxSampleLines` oben).

#### PCFG-Konfiguration

Der PCFG-Angriff (Option 20) und der PRINCE-LING-Angriff (Option 21) verwenden das Untermodul `pcfg_cracker`. Konfigurieren Sie sie in `config.json`:```json
{
"pcfgRuleset": "DEFAULT",
"pcfgMaxCandidates": 50000000,
"pcfgPrinceLingMaxCandidates": 10000000
}
  • pcfgRuleset — Name der trainierten Grammatik, die verwendet werden soll (Standard: DEFAULT), aufgelöst zu pcfg_cracker/Rules/<name>/. Trainieren Sie Ihre eigene mit trainer.py von pcfg_cracker und setzen Sie dies auf den Namen des Regelsatzes.
  • pcfgMaxCandidates — Maximale Anzahl von Kandidaten, die pcfg_guesser.py für den PCFG-Angriff ausgibt (Standard: 50000000).
  • pcfgPrinceLingMaxCandidates — Maximale Anzahl von Basiswörtern, die prince_ling.py in die zwischengespeicherte PRINCE-Basiswortliste schreibt (Standard: 10000000).

Optimierte Kernel (optimizedKernelAttacks)

Das -O-Flag von hashcat wählt optimierte Kernel aus, die erheblich schneller sind, aber die Kandidatenlänge begrenzen (etwa 31 Zeichen, bei einigen Modi weniger) und alles Längere stillschweigend überspringen. optimizedKernelAttacks in config.json listet die Angriffe auf, die mit -O laufen; lassen Sie einen Angriff aus der Liste weg, um ihn mit Kerneln voller Länge auszuführen. Die Liste in config.json.example entspricht der eingebauten Standardeinstellung, die gilt, wenn keine config.json vorhanden ist.

Vier Angriffe berücksichtigen die Einstellung, sind aber standardmäßig nicht optimiert, da sie Kandidaten einspeisen, die die -O-Obergrenze überschreiten können — fügen Sie sie zur Liste hinzu, um sie zu aktivieren:

  • hcatNgramX, hcatOllama, hcatOmen, hcatLMtoNT

Um -O für einen einzelnen Lauf überall zu deaktivieren, ohne die Konfiguration zu bearbeiten, übergeben Sie --no-optimized-kernel (Kurzform --no-optimize). Es überschreibt die Liste für jeden Angriff und entfernt auch ein in hcatTuning geschriebenes -O, das andernfalls unabhängig von der Liste an hashcat gelangen würde.

Namen werden exakt abgeglichen, und ein unbekannter Eintrag wird beim Start gemeldet, statt ignoriert zu werden. Beachten Sie, dass Angriffe, die an einen anderen Angriff delegieren, von dem Angriff gesteuert werden, an den sie delegieren, nicht von ihrem eigenen Namen: PRINCE-LING folgt hcatPrince, während Spoonman, Rosetta und die LLM-Musterregel-Modi hcatQuickDictionary folgen.

Benachrichtigungen (Menüoption 82)

hate_crack kann Pushover-Push-Benachrichtigungen senden, wenn Angriffe abgeschlossen sind, und optional, wenn einzelne Hashes geknackt werden. Alle Steuerungen befinden sich unter Hauptmenü-Option 82 — Benachrichtigungen:

  1. Pushover-Benachrichtigungen umschalten [EIN/AUS] — Hauptschalter. Wird in config.json als notify_enabled gespeichert.
  2. Benachrichtigungen pro geknacktem Hash umschalten [EIN/AUS] — Wenn EIN, überwacht ein Hintergrund-Tailer die .out-Datei und sendet eine Benachrichtigung pro geknacktem Hash (mit Burst-Aggregation pro Tick). Wird in config.json als notify_per_crack_enabled gespeichert. Kann nicht aktiviert werden, während der Hauptschalter AUS ist — aktivieren Sie zuerst Option 1.
  3. Test-Pushover-Benachrichtigung senden — sendet eine vorgefertigte Push-Nachricht, damit Sie bestätigen können, dass Ihr Pushover-Token-/Benutzer-Paar funktioniert. Funktioniert auch, wenn der Hauptschalter AUS ist.

Anmeldedaten liegen in .env; die übrigen Einstellmöglichkeiten sind nur über die Konfigurationsdatei config.json verfügbar:

  • NOTIFY_PUSHOVER_TOKEN, NOTIFY_PUSHOVER_USER (in .env) — erforderlich, damit überhaupt eine Push-Nachricht ausgelöst wird. Nichts im Menü schreibt diese Werte; bearbeiten Sie .env selbst.
  • notify_attack_allowlist — Angriffsnamen, die ohne die [y/N/always]-Aufforderung automatisch zustimmen. Wird automatisch befüllt, wenn Sie mit always antworten.
  • notify_suppress_in_orchestrators (Standard: true) — unterdrückt die einzelnen Angriffe, die von Extensive Crack verkettet werden; stattdessen wird eine einzelne Zusammenfassung gesendet. Setzen Sie dies auf false, um eine Benachrichtigung pro verkettetem Angriff zu erhalten. Andere Menüeinträge, die mehrere Durchläufe ausführen (zum Beispiel Quick Crack mit mehreren Regelketten), sind keine Orchestratoren und benachrichtigen immer pro Durchlauf.
  • notify_max_cracks_per_burst (Standard: 5), notify_poll_interval_seconds (Standard: 5.0) — Einstellungen für den Tailer pro geknacktem Hash. Siehe hate_crack/notify/tailer.py für die Burst-Aggregationslogik.

Wortlisten-Tools (Menüoption 80)

Das Untermenü „Wortlisten-Tools“ stellt Dienstprogramme zur Wortlisten-Vorverarbeitung bereit, die auf hashcat-utils-Binärdateien basieren, sowie Wortlisten-Downloads von Hashmob.net und Weakpass. Zugriff über Option 80 im Hauptmenü.

OptionBinaryWhat it does
1len.binNach Länge filtern - nur Wörter zwischen einer Mindest- und Höchstlänge behalten
2req-include.binZeichenklassen vorschreiben - nur Wörter behalten, die alle erforderlichen Zeichentypen enthalten
3req-exclude.binZeichenklassen ausschließen - Wörter entfernen, die einen ausgeschlossenen Zeichentyp enthalten
4cutb.binTeilstring extrahieren - einen Bytebereich aus jedem Wort ausschneiden
5splitlen.binNach Länge aufteilen - separate Dateien pro Wortlänge erstellen (Dateien mit Namen 01-64 in einem Ausgabeverzeichnis)
6rli.bin / rli2.binWörter abziehen - Einträge entfernen, die in einer oder mehreren anderen Dateien vorkommen
7gate.binSharding - jedes N-te Wort für verteiltes Knacken auf mehreren Maschinen extrahieren
8-Wortlisten optimieren - Duplikate entfernen und in nach Länge aufgeteilte Dateien im Verzeichnis für optimierte Wortlisten aufteilen
9-Wortlisten von Hashmob.net herunterladen
10-Wortlisten von Weakpass herunterladen (per BitTorrent)

Maskenbits für Zeichenklassen (verwendet von Optionen 2 und 3): 1=Kleinbuchstabe, 2=Großbuchstabe, 4=Ziffer, 8=Symbol, 16=sonstiges. Werte addieren: 7 = Kleinbuchstabe+Großbuchstabe+Ziffer.

Wie Sharding verwendet werden soll: Sharding teilt eine Wortliste in N gleiche, sich nicht überlappende Teile, sodass die Arbeit auf mehrere Maschinen oder GPUs verteilt werden kann. Jeder Teil ist verschachtelt (jede N-te Zeile), sodass jeder Shard eine repräsentative Stichprobe der gesamten Liste ist und nicht ein zusammenhängender vorderer oder hinterer Block — kein einzelner Knoten bleibt darauf beschränkt, nur das Ende mit niedriger Wahrscheinlichkeit zu knacken.

Führen Sie Option 7 einmal aus und geben Sie eine Eingabe-Wortliste, einen Basisausgabepfad und eine Shard-Anzahl (N) an. Sie schreibt alle N Teile in einem einzigen Durchgang, benannt mit nullaufgefüllten Teilnummern (base.001, base.002, … bis base.00N). Kopieren Sie einen Teil auf jeden Knoten und weisen Sie den hashcat-Lauf dieses Knotens darauf hin. Auf einem System mit einer einzelnen GPU bringt Sharding keine Beschleunigung, aber ein einzelner Teil ist dennoch eine schnelle, repräsentative Stichprobe für einen schnellen Sichtungsdurchlauf, bevor Sie sich der vollständigen Liste widmen.

Automatische Update-Prüfungen

hate_crack kann beim Start automatisch auf GitHub nach neueren Versionen suchen. Diese Funktion wird über die Konfigurationsoption check_for_updates gesteuert:```json { "check_for_updates": true }

- **`check_for_updates`** — Aktiviert automatische Versionsprüfungen beim Start (Standard: `true`).
- Wenn diese Option aktiviert ist, ruft hate_crack die neuesten Release-Informationen von GitHub ab und zeigt einen Hinweis an, wenn ein Update verfügbar ist.
- Die Prüfung läuft asynchron und blockiert den Start nicht. Netzwerkfehler werden stillschweigend ignoriert.

##### Update-Kanäle

| Kanal | Flag | Quelle | Was Sie erhalten |
|---------|------|--------|--------------|
| Release | `--update` | `main` | Das neueste offizielle Release. Dies ist die Standardeinstellung und das, was die Startprüfung anbietet. |
| Nightly | `--nightly` | `nightly-dev` | Arbeit, die CI bestanden hat, aber noch nicht veröffentlicht wurde. |

Versionen folgen den üblichen Semver-Regeln, wobei die Versionserhöhung davon abhängt, was tatsächlich im Batch enthalten ist. Die zweite Komponente ändert sich **nur bei Features**: Ein Zyklus, der einen beliebigen `feat`-Commit enthält, zielt auf `X.(Y+1).0`, und ein Zyklus, der ausschließlich aus Fixes, Docs und Chores besteht, zielt auf `X.Y.(Z+1)`.

`nightly-dev` taggt Release-Kandidaten für diejenige Version, auf die der Batch zusteuert — `v2.20.1rc1`, `v2.20.1rc2`, … — und das Zusammenführen in `main` befördert dasselbe Ziel zu seinem endgültigen Release. Kandidaten sind echte Pre-Releases gemäß PEP 440, sodass sie an beiden Enden korrekt eingeordnet werden:

    2.20.0  <  2.20.1rc1  <  2.20.1rc2  <  2.20.1  <  2.21.0rc1  <  2.21.0

Das Ziel kann sich mitten im Zyklus ändern: Das erste eintreffende `feat` verschiebt es von `X.Y.(Z+1)` auf `X.(Y+1).0`, und die Kandidatennummerierung startet für das neue Ziel neu. Die Nummer gibt immer an, was der Batch heute ausliefern würde.

Die Major-Komponente wird niemals automatisch erhöht — ein `!`-Betreff oder eine `BREAKING CHANGE:`-Fußzeile zählt als Feature, denn eine automatische Major-Erhöhung wäre nur eine falsch getippte Betreffzeile von einem unumkehrbar veröffentlichten Release entfernt. Eine Major-Version ist eine bewusste menschliche Handlung: von Hand taggen und pushen.

Die Richtlinie befindet sich in `tools/next_version.py`, wird von beiden Tagging-Workflows gemeinsam genutzt und in `tests/test_next_version.py` mit Unit-Tests abgesichert.

Die Startprüfung bietet stets nur Releases an, da Nightly-Builds überhaupt kein GitHub-Release veröffentlichen und die Prüfung den „latest release“-Endpunkt von GitHub liest — daher bringt Sie das Aktivieren von `check_for_updates` niemals auf eine Nightly. Zwei Dinge halten die Kanäle jetzt getrennt: das, und die Tatsache, dass ein Kandidat ein echtes Pre-Release gemäß PEP 440 ist, sodass ein Tool, das rohe Versionsnummern sortiert, es ebenfalls als älter behandelt als das Release, zu dem es wird.

Jedes der beiden Flags wechselt zunächst Ihren Checkout auf den entsprechenden Branch (und verweigert dies, wenn Sie nicht committete Änderungen haben). Wenn Sie eine Nightly ausführen und zu veröffentlichtem Code zurückkehren möchten, bringt Sie `--update` zurück zu `main`.

#### Automatisches Zusammenführen gefundener Hashes (nur bei Download Left)

Beim Herunterladen von Left-Hashes (ungeknackten Hashes) führt hate_crack automatisch Folgendes aus:
1. Versucht als Hilfsoperation, etwaige gefundene (geknackte) Hashes von Hashview herunterzuladen
2. Führt gefundene Hashes mit lokalen `.out`-Dateien zusammen (z. B. `left_1_123.txt.out` oder `left_1_123.nt.txt.out` für das Pwdump-Format)
3. Entfernt doppelte Einträge
4. Räumt temporäre Split-Dateien nach dem Zusammenführen auf

Dadurch wird sichergestellt, dass Ihre lokalen Cracking-Ergebnisse bei der Arbeit mit ungeknackten Hashes mit der zentralen Datenbank von Hashview synchron bleiben.

**Hinweis:** Die Download-Found-Option lädt bereits geknackte Hashes separat zu Referenzzwecken herunter und führt weder ein Zusammenführen durch noch fordert sie zum Cracking auf.

Den `<hash_type>` erhält man durch Ausführen von `hashcat --help`.

Beispiel-Hashes: http://hashcat.net/wiki/doku.php?id=example_hashes```
$ hashcat --help |grep -i ntlm
   5500 | NetNTLMv1                                        | Network protocols
   5500 | NetNTLMv1 + ESS                                  | Network protocols
   5600 | NetNTLMv2                                        | Network protocols
   1000 | NTLM                                             | Operating-Systems

Es wurde kein Eingabeinhalt zum Übersetzen bereitgestellt.``` $ ./hate_crack.py 1000


/ | _____ / | ____ _ ___ ____________ ____ | | __ / ~ __ \ / __ \ / \ /_ __ _ \ / | |/ / \ Y // __ | | \ / \ _| | // __ \ _| < ___| /(__ /| _ >______ /|__| ( /___ >|_
/ / /
___/ / / / / Version 2.0

## Testen

Die Testsuite läuft größtenteils offline und verwendet Mocks/Fixtures. Live-Netzwerkprüfungen und
Systemabhängigkeitsprüfungen sind optional über Umgebungsvariablen aktivierbar.

### Tests lokal ausführen```bash
# Run all tests
uv run pytest -v

# Run specific test
uv run pytest tests/test_hashview.py -v

Sie können die vollständige Testsuite auch mit make test ausführen.

Live-Tests (Opt-In)

Setzen Sie eine der folgenden Optionen, um Live-Prüfungen zu aktivieren:

  • HASHMOB_TEST_REAL=1 — Live-Prüfung der Hashmob-Konnektivität/des CLI-Menüs
  • HASHVIEW_TEST_REAL=1 — Live-Prüfung des Hashview-CLI-Menüs
  • WEAKPASS_TEST_REAL=1 — Live-Prüfung des Weakpass-CLI-Menüs
  • HATE_CRACK_REQUIRE_DEPS=1 — schlägt fehl, wenn 7z, transmission-daemon oder transmission-remote fehlt

Live-Hashview-Upload-Test

Der Live-Hashview-Upload-Test wird standardmäßig übersprungen. Um ihn auszuführen, setzen Sie die Umgebungsvariable und geben Sie gültige Anmeldeinformationen in .env an:```bash HATE_CRACK_RUN_LIVE_TESTS=1 uv run pytest tests/test_upload_cracked_hashes.py -v

### Live Hashview-Tests gegen einen lokalen Docker-Stack

Anstatt die Live-Tests auf einen entfernten Hashview-Server zu richten, können Sie die Suite einen lokalen [Hashview](https://github.com/hashview/hashview) Docker-Stack hochfahren lassen, ihn seeden, die Live-Tests dagegen ausführen und ihn wieder abbauen. Setzen Sie `HASHVIEW_TEST_LOCAL=1` und zeigen Sie mit `HASHVIEW_REPO` auf ein Hashview-Checkout:```bash
HASHVIEW_TEST_LOCAL=1 HASHVIEW_REPO=~/projects/hashview \
  HATE_CRACK_SKIP_INIT=1 uv run pytest tests/test_hashview_cli_subcommands_subprocess.py -v

Dies bringt docker compose im Hashview-Repo hoch, legt einen Admin-API-Schlüssel, einen Kunden, eine Hash-Datei und geknackte „effective task“-Daten an und exportiert anschließend die HASHVIEW_*-Umgebungsvariablen, die die Tests lesen. Nützliche Umgebungsvariablen:

  • HASHVIEW_TEST_LOCAL=1 — aktiviert den lokalen Stack (ansonsten ohne Effekt)
  • HASHVIEW_REPO=<path> — Hashview-Checkout (Standard: ~/projects/hashview)
  • HASHVIEW_KEEP=1 — Container nach der Sitzung weiterlaufen lassen (schnellere Wiederholungsläufe)
  • HASHVIEW_LOCAL_PORT=5000 — Host-Port, auf dem die App veröffentlicht wird

Die hate_crack-CLI berücksichtigt die Umgebungsvariablen HASHVIEW_URL / HASHVIEW_API_KEY (die die .env überschreiben, in der sich diese beiden Schlüssel befinden). Dadurch kann die Test-Suite die CLI auf den lokalen Stack ausrichten, ohne deine dauerhaft gespeicherte Konfiguration zu bearbeiten.

End-to-End-Installationstests (Lokal + Docker)

Lokale Installation des uv-Tools + Skriptausführung (verwendet ein temporäres HOME):```bash HATE_CRACK_RUN_E2E=1 uv run pytest tests/test_e2e_local_install.py -v

Docker-basierte End-to-End-Installation/-Ausführung (zwischengespeichert über `Dockerfile.test`):```bash
HATE_CRACK_RUN_DOCKER_TESTS=1 uv run pytest tests/test_docker_script_install.py -v

Der Docker-E2E-Test lädt außerdem eine kleine Teilmenge von rockyou herunter und führt einen grundlegenden hashcat-Crack durch, um die Integration externer Tools zu validieren.

Lima-VM-End-to-End-Test (nur macOS):

Voraussetzungen: Lima und rsync müssen installiert sein.```bash brew install lima

Die Test-VM wird automatisch mit allen Linux-Abhängigkeiten bereitgestellt (hashcat, build-essential, curl, git, gzip, p7zip-full, transmission-daemon, ocl-icd-libopencl1, pocl-opencl-icd, uv).```bash
HATE_CRACK_RUN_LIMA_TESTS=1 uv run pytest tests/test_lima_vm_install.py -v

Dieser Test validiert Installation und Ausführung in einer leichtgewichtigen Linux-VM auf macOS.

Teststruktur

  • tests/test_hashview.py: Umfassende Testsuite für die HashviewAPI-Klasse mit simulierten API-Antworten, einschließlich:
    • Kundenliste und Datenvalidierung
    • Authentifizierungs- und Autorisierungstests
    • Hashfile-Upload-Funktionalität
    • Vollständiger Workflow zur Job-Erstellung

Alle Tests verwenden simulierte API-Aufrufe, sodass sie ohne Verbindung zu einem Hashview-Server ausgeführt werden können.


(1) Schneller Crack (2) Umfangreicher Pure_Hate-Methodik-Crack (3) Brute-Force-Angriff (4) Top-Mask-Angriff (5) Fingerprint-Angriff (6) Combinator-Angriffe (7) Hybrid-Angriff (8) Pathwell Top-100-Mask-Brute-Force-Crack (9) PRINCE-Angriff (10) Bandrel-Methodik (11) Loopback-Angriff (12) LLM-Angriff (13) OMEN-Angriff (14) Ad-hoc-Mask-Angriff (15) Markov-Brute-Force-Angriff (16) N-Gramm-Angriff (17) Permutations-Angriff (18) Random-Rules-Angriff (19) Combipow-Passphrase-Angriff (20) PCFG-Angriff (21) PRINCE-LING-Angriff (22) Spoonman-Angriff (23) Rosetta-Angriff

(80) Wordlist-Tools (81) Regeldatei-Tools (82) Benachrichtigungen

(93) .out aus POT-Datei regenerieren (94) Hashview-API (95) Hashes mit Pipal analysieren (96) Ausgabe ins Excel-Format exportieren (97) Geknackte Hashes anzeigen (98) README anzeigen (99) Beenden

Wähle eine Aufgabe:```

Option 94 — Hashview API is only listed when HASHVIEW_API_KEY is set in .env.

The YOLO, Middle, and Thorough Combinator attacks were previously at keys 10-12. They now live in the Combinator Attacks submenu (option 6) along with Combinator3 and CombinatorX.

Quick Crack

Runs a dictionary attack against wordlists in your hcatOptimizedWordlists directory (falls back to hcatWordlists if not configured) and optionally applies rules. Multiple rules can be selected by comma-separated list, and chains can be created with the '+' symbol. Pressing Enter at the wordlist prompt uses the configured optimized wordlists directory as the default.

Welche Regel(n) möchtest du ausführen?
(1) best64.rule
(2) d3ad0ne.rule
(3) T0XlC.rule
(4) dive.rule
(99) YOLO... alle Regeln ausführen
Gib eine durch Kommas getrennte Liste der Regeln ein, die du ausführen möchtest. Um Regeln verkettet auszuführen, verwende das +-Symbol.
Zum Beispiel führt 1+1 best64.rule zweimal verkettet aus und 1,2 würde best64.rule und dann d3ad0ne.rule nacheinander ausführen.
Wähle weise:```




#### Extensive Pure_Hate Methodology Crack
Runs several attack methods provided by Martin Bos (formerly known as pure_hate):
  * Brute Force Attack (7 characters)
  * Dictionary Attack
    * All wordlists in `hcatWordlists` with `best64.rule`
    * `rockyou.txt` with `d3ad0ne.rule`
    * `rockyou.txt` with `T0XlC.rule`
  * Top Mask Attack (Target Time = 4 Hours)
  * Fingerprint Attack
  * Combinator Attack
  * Hybrid Attack
  * Extra - Just For Good Measure
    - Runs a dictionary attack using `rockyou.txt` with chained `combinator.rule` and `InsidePro-PasswordsPro.rule` rules

#### Brute Force Attack
Brute forces all characters with the choice of a minimum and maximum password length.

#### Top Mask Attack
Uses StatsGen and MaskGen from PACK (https://thesprawl.org/projects/pack/) to perform a top mask attack using passwords already cracked for the current session.
Presents the user a choice of target cracking time to spend (default 4 hours).

#### Fingerprint Attack
https://hashcat.net/wiki/doku.php?id=fingerprint_attack

Runs a fingerprint attack using passwords already cracked for the current session.

#### Combinator Attack
https://hashcat.net/wiki/doku.php?id=combinator_attack

Runs a combinator attack using the "rockyou.txt" wordlist.

#### Hybrid Attack
https://hashcat.net/wiki/doku.php?id=hybrid_attack

* Runs several hybrid attacks using the "rockyou.txt" wordlists.
  - Hybrid Wordlist + Mask - ?s?d wordlists/rockyou.txt ?1?1
  - Hybrid Wordlist + Mask - ?s?d wordlists/rockyou.txt ?1?1?1
  - Hybrid Wordlist + Mask - ?s?d wordlists/rockyou.txt ?1?1?1?1
  - Hybrid Mask + Wordlist - ?s?d ?1?1 wordlists/rockyou.txt
  - Hybrid Mask + Wordlist - ?s?d ?1?1?1 wordlists/rockyou.txt
  - Hybrid Mask + Wordlist - ?s?d ?1?1?1?1 wordlists/rockyou.txt

#### Pathwell Top 100 Mask Brute Force Crack
Runs a brute force attack using the top 100 masks from KoreLogic:
https://blog.korelogic.com/blog/2014/04/04/pathwell_topologies

#### PRINCE Attack
https://hashcat.net/events/p14-trondheim/prince-attack.pdf

Runs a PRINCE attack using wordlists/rockyou.txt

#### YOLO Combinator Attack
Runs a continuous combinator attack using random wordlists from the configured wordlists directory for the left and right sides.

#### Middle Combinator Attack
https://jeffh.net/2018/04/26/combinator_methods/

Runs a modified combinator attack adding a middle character mask:
wordlists/rockyou.txt + masks + worklists/rockyou.txt

Where the masks are some of the most commonly used separator characters:
2 4 <space> - _ , + . &

#### Thorough Combinator Attack
https://jeffh.net/2018/04/26/combinator_methods/

* Runs many rounds of different combinator attacks with the rockyou list.
  - Standard Combinator attack: rockyou.txt + rockyou.txt
  - Middle Combinator attack: rockyou.txt + ?n + rockyou.txt
  - Middle Combinator attack: rockyou.txt + ?s + rockyou.txt
  - End Combinator attack: rockyou.txt + rockyou.txt + ?n
  - End Combinator attack: rockyou.txt + rockyou.txt + ?s
  - Hybrid middle/end attack: rockyou.txt + ?n + rockyou.txt + ?n
  - Hybrid middle/end attack: rockyou.txt + ?s + rockyou.txt + ?s


#### Bandrel Methodology

Prompts for comma-separated names and creates a pseudo hybrid attack by capitalizing the first letter and adding up to six additional characters at the end. Each word is limited to a total of five minutes.

  - Built-in common words (seasons, months) included as a customizable `config.json` entry (`bandrel_common_basedwords`)
  - The default five-minute time limit is customizable via `bandrelmaxruntime` in `config.json`

#### Loopback Attack
https://hashcat.net/wiki/doku.php?id=loopback_attack

Uses hashcat's loopback mode to feed cracked passwords from the current session back into the attack pipeline with rules applied. This generates new password candidates based on variations of already-cracked passwords, which is particularly effective for finding related passwords that follow similar patterns.

* Prompts for rule selection to apply to the loopback candidates
* Uses an empty wordlist with the --loopback flag to process previously cracked passwords
* Automatically downloads Hashmob rules if no rules are available locally

#### LLM Attack
Uses a local Ollama instance to generate password candidates for a capture-the-flag scenario. Prompts for the fake company name, industry, and location, then sends these details to the configured LLM model to produce likely password candidates using industry terms and company name permutations. The generated candidates are fed into a hashcat wordlist+rules attack.

* Requires a running Ollama instance (default: `http://localhost:11434`, override with `OLLAMA_HOST` in `.env` or the environment) with the model already pulled — hate_crack does not auto-pull
* Candidate generation uses structured (JSON) output via Atomic Agents, so pick a model with good schema adherence (default: `qwen2.5:32b`)
* Configurable model, context window, request timeout, and sample size via `.env` (see Ollama Configuration below)
* Prompts for target company name, industry, and location. The industry and location prompts are pre-filled with the local model's guesses about the named organization (editable, and clearly labelled as guesses rather than verified OSINT); disable with `ollamaAutoResearch: false`
* Alternatively derives basewords from a sample **wordlist**, or from the **cracked passwords** of the current session (`<hashfile>.out`) so the model mirrors the target organization's own password conventions and produces new candidates in that style (only offered once something has been cracked)
* A live spinner with an elapsed-seconds counter runs during generation, and requests are bounded by `ollamaTimeout` so a model stuck loading into VRAM reports a timeout instead of hanging

**Pattern rules mode** (option 4 in the LLM submenu) takes the same shape as the [Spoonman Attack](#spoonman-attack) — a baseword list run through a rule file, both derived from one corpus — but infers each side with the model instead of extracting it. Spoonman is exact and therefore bounded: its basewords all appear in the corpus and its rules only reproduce transformations the corpus already shows. This asks the model to generalize on both axes, so it can name the *word families* behind a sample (the company and its products, site names, local sports teams, seasons, mascots) and write decorations the corpus does not contain.

* Pattern source is either the current session's cracked passwords (offered first, and only once something has been cracked, since those reveal the target's real conventions) or a sample wordlist
* **You are not asked to pick a rule file.** The model writes one, from the same corpus statistics — a stock rule file encodes the internet's habits, and the point of spending a model round trip is to encode *this* organization's
* Basewords are normalized to lowercase letters only, discarding anything under 3 characters, so the generated rules supply case, digits, and punctuation exactly once
* Generated rules are validated before hashcat sees them, and anything using an op hashcat does not have, a position argument outside `0-9A-Z`, more than 31 functions, or a stray comment or non-ASCII character is discarded. hashcat drops an invalid rule *silently* when valid rules share the file, so an unscreened line would become missing coverage rather than an error. The op table was established by testing hashcat itself, not from its rule documentation, which lists ops hashcat will not actually run
* Local-model yield varies a lot run to run, so a thin answer is asked again once and the two rounds are merged — a handful of rules would waste the pass they are spent on
* If no rule survives validation the basewords still run, unmutated, rather than throwing away the expensive half of the run
* Output lands in `<hashfile>.llm_patterns/` as `basewords.txt` and `rules.rule` — per-run scratch, laid out like `.spoonman/` and removed on exit

#### OMEN Attack
Uses the Ordered Markov ENumerator (OMEN) to train a statistical password model from a wordlist and generate password candidates. This attack learns patterns from known passwords and generates new candidates based on those patterns.

* Requires OMEN binaries (createNG and enumNG) to be built from the omen submodule
* Interactive menu: use existing model, train new model, or cancel
* Training wordlist picker shows available wordlists from configured directory or accepts a custom path
* Validates all 5 required model files (createConfig, CP/IP/EP/LN.level) before running
* Captures and reports enumNG errors instead of failing silently
* Generates up to a specified number of password candidates (configurable via `omenMaxCandidates`)
* Pipes generated candidates directly into hashcat for cracking
* Model files and metadata are stored in `~/.hate_crack/omen/` for persistence across sessions

#### Combinator Attacks Submenu
Opens an interactive submenu with six combinator attack variants (formerly at menu keys 10-12). Consolidates related attacks for cleaner menu organization:
- Combinator Attack - combines two wordlists
- YOLO Combinator Attack - combines all permutations of multiple wordlists
- Middle Combinator Attack - combines wordlists with an extra word in the middle
- Thorough Combinator Attack - comprehensive combination of wordlists with rules
- Combinator3 Attack - combines exactly 3 wordlists using `combinator3.bin`, generating all `word1+word2+word3` combinations piped to hashcat
- CombinatorX Attack - combines 2-8 wordlists using `combinatorX.bin` with optional `--sepFill` separator character between word segments

#### Ad-hoc Mask Attack
Runs hashcat mask attack (mode 3) with a user-specified custom mask string. Allows fine-grained control over character-set brute forcing.

* Opens with a choice between typing a mask and selecting a mask file
* Prompts for a hashcat mask (e.g., `?u?l?l?l?d?d` for uppercase + lowercase + lowercase + lowercase + digit + digit)
* Supports custom character sets (`-1`, `-2`, `-3`, `-4`) for specialized character combinations
* Interactive charset entry with early exit on blank input
* Mask files (`.hcmask`) can be selected with tab completion, defaulting to the bundled `masks/` directory; hashcat runs every mask in the file in order. Because a mask file defines its own charsets inline, the `-1` through `-4` prompts are skipped when one is chosen
* Useful for targeted brute forcing when you know password structure patterns

#### Markov Brute Force Attack
Generates password candidates using Markov chain statistical models. Similar to OMEN but simpler and faster.

* Checks for existing `.hcstat2` Markov table from previous sessions (with option to reuse, regenerate, or cancel)
* Generates table from training source if needed:
  - Can use cracked passwords from current session (`.out` file) as training data
  - Or select any wordlist from configured directory or custom path
* Interactive menu: choose minimum and maximum password length
* Uses `--increment` flag to test lengths in sequence
* Markov table persists with hash file (filename.out.hcstat2) for fast subsequent runs
* Faster than OMEN for general-purpose brute forcing

#### N-gram Attack
Generates n-gram candidates from a corpus file using `ngramX.bin` from hashcat-utils and pipes them into hashcat.

* Prompts for a corpus file with tab completion, defaulting to the configured wordlist directory
* Prompts for an n-gram group size (default 3)
* Gzip-compressed corpus files are auto-detected and decompressed on the fly
* Useful when you have target-relevant prose (scraped site copy, leaked documents, internal wiki exports) rather than a password list

#### Permutation Attack
Generates all character permutations of each word in a targeted wordlist and pipes them to hashcat via `permute.bin` from hashcat-utils.

* Prompts for a single wordlist file (not a directory)
* Effective against short targeted wordlists where the character set is known but the order is not (company abbreviations, name fragments, known tokens)
* WARNING: Scales as N! per word - an 8-character word produces 40,320 permutations. Only practical for words up to ~8 characters.
* Uses `permute.bin < wordlist | hashcat` pipeline pattern

#### Random Rules Attack
Generates a set of random hashcat mutation rules using `generate-rules.bin`, writes them to a temporary file, then runs hashcat against a chosen wordlist with those rules.

* Prompts for rule count (default 65536)
* Prompts for wordlist path with tab-completion and numbered selection
* Temporary rules file is cleaned up after the run regardless of outcome
* Useful when known rule sets are exhausted - explores random rule-space for additional cracks

#### Combipow Passphrase Attack
Generates all unique non-empty subset combinations from a short wordlist using `combipow.bin` and pipes them into hashcat. Designed for passphrase cracking when you know the pool of words a password was built from.

* Prompts for a wordlist file (max 63 lines - combipow generates up to 2^n-1 combinations)
* Optional space separator (`-s` flag) to insert spaces between words in each combination
* Warns if the wordlist exceeds 20 lines (output volume may be large)
* Aborts with a clear message if the wordlist exceeds 63 lines (hard limit)
* Candidates are piped directly to hashcat stdin

#### PCFG Attack
Uses [pcfg_cracker](https://github.com/lakiw/pcfg_cracker) to generate candidates from a Probabilistic Context-Free Grammar, piping `pcfg_guesser.py` output directly into hashcat's stdin mode. A PCFG models password *structure* (baseword + digits + symbol, capitalization habits, keyboard walks) with learned probabilities, so candidates come out roughly in descending likelihood order.

* Requires the `pcfg_cracker` submodule. Presence is checked at startup and reported non-fatally: if it is missing, the PCFG attacks are simply unavailable. Run `make` to fetch it.
* Uses the trained grammar named by `pcfgRuleset` in `config.json` (default `DEFAULT`), read from `pcfg_cracker/Rules/<name>/`
* Candidate count is capped by `pcfgMaxCandidates` (default 50,000,000)
* hate_crack does not wrap grammar training. To build a grammar from a target-specific password set, run pcfg_cracker's own `trainer.py` and point `pcfgRuleset` at the resulting ruleset name

#### PRINCE-LING Attack
Uses pcfg_cracker's `prince_ling.py` to derive an optimized PRINCE base wordlist from a trained grammar, then hands it to the existing PRINCE attack. PRINCE-LING picks base words the grammar says are actually productive, so the PRINCE combination space is far less wasteful than pointing PRINCE at a generic wordlist.

* Requires the `pcfg_cracker` submodule and a trained ruleset directory, same as the PCFG attack
* The generated wordlist is cached at `<hcatOptimizedWordlists>/pcfg_prince_ling_<ruleset>.txt` and reused across sessions
* Regenerates only when the ruleset directory is newer than the cached wordlist, so retraining a grammar invalidates the cache automatically
* Generation is written to a temporary file and atomically moved into place; a failed or interrupted run cleans up its partial file and leaves any existing cache intact
* Base wordlist size is capped by `pcfgPrinceLingMaxCandidates` (default 10,000,000)

#### Spoonman Attack
Derives a baseword list and a hashcat rule file from a corpus of known plaintext passwords — a previous engagement's cracked output, a leak dump, or any password list — such that the baseword x rule cross product reconstructs the corpus exactly (see the memory bound below for the one case where it does not). Contributed as issue #169 by @Spoonman1091.

Each password is split into its letters-only lowercased core (the baseword) plus a rule that rebuilds the original from it, using `l`/`u`/`c` for casing, `T{p}` toggles, `${x}`/`^{x}` for trailing and leading characters, and `i{p}{x}` for interior ones.

* When the current session already has cracked plaintexts (`<hash file>.out` exists and is non-empty), a picker offers those as the corpus ahead of a free-form path — the target's own recovered passwords derive rules describing that target's actual conventions, which is exactly what you want to fire back at the remaining uncracked hashes. Deriving from `.out` and then cracking the same hash file appends new plaintexts to that same file, growing the corpus for the next run; that is the intended feedback loop, not corruption. Sessions with no cracked output yet see no picker at all — just today's path prompt
* Prompts for the corpus, then for how much of the rule file to run: top 50% coverage (listed first and recommended), top 75%, top 95%, top 99%, or the full set
* Rules are sorted by how many passwords each one rebuilds, so a truncated file keeps the most productive rules. Coverage is extremely long-tailed: on a 98.2M-password sample, 50% coverage needed 4,120 rules while 95% needed 16,119,661 and 100% needed 21,029,696 — the last few percent typically costs orders of magnitude more rules than the first half, which is why the smallest tier is listed first and is usually the right choice
* Output is written beside the hash file in `<hash file>.spoonman/`, alongside the other ephemeral wordlists: `basewords.txt`, `rules.full.rule`, the capped rule files, and `coverage.txt` with per-milestone rule counts. Derivation is skipped on later runs of the same hash file unless the corpus has been modified since, and the directory is removed on exit by the temp-file cleanup
* Derivation is bounded in memory. Both counters would otherwise grow for the whole read with nothing written until the end, so a corpus large enough to exhaust RAM lost the entire pass to an OOM kill and produced no output; a measured run against a 31 GB corpus reached 14.1 GB resident at 11% of the file and was still accelerating. Each counter is now capped at 20 million distinct keys (about 1.6 GB apiece), and the lowest-frequency keys are discarded once it is exceeded. If that happens, the run says so on the console and in `coverage.txt`, the output reconstructs the retained keys rather than 100% of the corpus, and the coverage percentages are relative to those. Corpora below the cap are unaffected
* Passwords that cannot be expressed as a rule are written verbatim as their own baseword with a `:` no-op, so coverage stays complete. This covers two hashcat limits: rule positions cannot address past index 35, and hashcat rejects any rule with more than 31 functions — silently, when valid rules share the file
* The derivation self-checks every password by reconstructing it in-process, and reports any failures rather than reporting success
* Corpus lines may carry a hash in front of the password, as cracked output does. A leading field is dropped only when it has the shape of a hash (a hex digest at a known length, or a crypt-style `$id$` string), so `hash:salt:plain` is handled while a plaintext or wordlist entry containing a colon survives intact. `$HEX[...]` plaintexts are decoded. If most lines look like an uncracked dump rather than cracked output, `coverage.txt` records the count and the attack warns — the derived basewords and rules would otherwise be meaningless without any error being raised

#### Rosetta Attack
Mines hashcat `--debug-mode 5` logs for the basewords and rules that already cracked something, then runs their full cross product. Powered by [HashcatRosetta](https://github.com/bandrel/HashcatRosetta), the same library behind [Analyze Hashcat Rules](#analyze-hashcat-rules-rule-file-tools-option-5).

No setup is needed to feed it: `_add_debug_mode_for_rules` appends `--debug-mode 5 --debug-file` to every rule-based hashcat invocation hate_crack makes, so the logs accumulate in `hcatDebugLogPath` (`~/.hate_crack/hashcat_debug` by default, one file per session) as a side effect of normal use. A mode 5 log records only candidates that cracked a hash, in the form `baseword:rule:candidate:wordlist`, which is what makes both halves known-productive against this target population; the trailing wordlist field also shows which list is earning its keep on a multi-wordlist run. HashcatRosetta parses mode 4 and mode 5 alike, so logs written before the switch are still read.

The value is in the cross product rather than the recorded pairs. A pair present in a log has already cracked its hash and will not crack another, but a rule that worked on one baseword has usually never been tried against the others — so N basewords and M rules yield close to N x M untried candidates.

The menu first asks how to rank rules — choices 1-3 below, plus a fourth, unrelated mode:

* Rules can be ranked by application frequency, by how many distinct basewords each one worked on, or by how many unique candidates each one generated. Frequency is the default; baseword spread is the better choice when the goal is a rule set that generalizes past the specific words it was learned from
* Only after one of those three is picked does hate_crack list the logs found in `hcatDebugLogPath` newest-first with their sizes; pick one, pick all of them (up to 20), or type a path to a log from elsewhere
* Prompts for how many top rules to keep (default 100) and how many top basewords (default all). Zero means unlimited for either. The keyspace is the product of the two and is printed before hashcat starts
* Output is written beside the hash file in `<hash file>.rosetta/` as `basewords.txt` and `rules.rule`, alongside the other ephemeral wordlists, and the directory is removed on exit by the temp-file cleanup
* Reading stops at 1,000,000 debug lines, since the analyzer needs the whole batch in memory at once. Truncation is reported on the console rather than assumed harmless — logs from a long run routinely exceed this, in which case the newest log is the one worth selecting
* **LLM Mask Attack** (4) - a different mode entirely, and the only one that needs no debug logs. Prompts for a natural-language description of the passwords you expect (length, character patterns, symbols, etc.), sends it to the locally configured Ollama model, writes the returned masks to `<hash file>.hcmask`, and runs a `-a 3` hashcat mask attack against them

#### Wordlist Tools (option 80)
A submenu of wordlist preprocessing utilities using hashcat-utils binaries. All tools read from and write to files on disk. All file and directory path prompts support tab completion.

| Key | Tool | Description |
|-----|------|-------------|
| 1 | Filter by Length | Keep only words between a min and max length (`len.bin`) |
| 2 | Require Char Classes | Keep words that include all char classes in mask (`req-include.bin`). Mask: 1=lower, 2=upper, 4=digit, 8=symbol (additive) |
| 3 | Exclude Char Classes | Remove words containing any char class in mask (`req-exclude.bin`). Same mask encoding |
| 4 | Extract Substring | Cut bytes from each word at a given offset and optional length (`cutb.bin`) |
| 5 | Split by Length | Create per-length files in an output directory (`splitlen.bin`) |
| 6 | Subtract Wordlist | Remove lines from a wordlist that appear in one or more remove files. Mode 1 uses `rli2.bin` (single file); mode 2 uses `rli.bin` (multiple files) |
| 7 | Shard Wordlist | Split a wordlist into N equal, interleaved parts in one run, written as `base.001`…`base.00N` for distributed cracking (`gate.bin`) |
| 8 | Optimize Wordlists | Dedupe and split the selected wordlists into per-length files under an output directory |
| 9 | Download from Hashmob.net | Browse and download wordlists from Hashmob.net into the configured wordlist directory |
| 10 | Download from Weakpass | Browse and download Weakpass wordlist torrents, with automatic extraction |

All binaries are in `hate_crack/hashcat-utils/bin/`.

#### Rule File Tools (option 81)
Preprocesses hashcat rule files using `cleanup-rules.bin` and `rules_optimize.bin` from hashcat-utils, and downloads rule files from Hashmob.net.

* **Clean** (1) - removes invalid syntax and duplicate rules using `cleanup-rules.bin`. Useful after combining rule files or downloading rules from external sources.
* **Optimize** (2) - consolidates redundant operations using `rules_optimize.bin`. Reduces rule file size and improves cracking speed.
* **Clean and optimize** (3) - runs both operations in sequence via a temporary file, then writes the final result.
* **Download rules from Hashmob.net** (4) - fetches rule files into the configured `rulesDirectory`.
* **Analyze Hashcat rules** (5) - opcode frequency analysis of a rule file, powered by HashcatRosetta.

The three preprocessing operations read from an input file and write to a separate output file (original is never modified).

#### Download Rules from Hashmob.net (Rule File Tools option 4)
Downloads the latest rule files from Hashmob.net's rule repository. These rules are curated and optimized for password cracking and can be used with the Quick Crack and Loopback Attack modes.

* Downloads rule sets in parallel using a thread pool (up to 4 concurrent downloads)
* Skips rules already downloaded locally
* Reports download summary with success/failure counts
* Stores rules in the configured rules directory

#### Analyze Hashcat Rules (Rule File Tools option 5)
Powered by HashcatRosetta (https://github.com/bandrel/HashcatRosetta), this feature analyzes hashcat rule files to provide detailed insights into rule composition and complexity.

* Prompts for a rule file path
* Displays frequency analysis of rule opcodes (operations)
* Helps understand what transformations a rule set performs
* Useful for rule debugging and optimization

#### Download Wordlists from Hashmob.net (Wordlist Tools option 9)
Downloads wordlists from Hashmob.net's collection of cracked passwords and commonly used wordlists.

* Interactive menu for browsing available wordlists
* Progress tracking for large downloads
* Stores wordlists in configured wordlist directory

#### Weakpass Wordlist Menu (Wordlist Tools option 10)
Interactive menu for downloading and managing wordlists from Weakpass.com via BitTorrent.

* Browse available Weakpass wordlist torrents
* Download specific wordlists or entire collections
* Automatic extraction of compressed archives
* Progress tracking for torrent downloads

-------------------------------------------------------------------
### Version History

The full, per-release changelog now lives in [CHANGELOG.md](https://github.com/trustedsec/hate_crack/blob/HEAD/CHANGELOG.md).

Kategorien