1. Core Concepts: Rules, Masks & Hybrid
GovCracker supports all Hashcat attack modes through a guided interface without a command line. The three core attack principles differ greatly in scope, keyspace, and runtime – the right choice determines success or failure.
Rule-Based Attack (-a 0)
Applies transformation rules to a wordlist. sommer becomes, e.g., Sommer2024!. Ideal when a good base wordlist is available (known passwords, company name, personal data).
In GovCracker: Attack mode “Wordlist“ → load rule file(s) via the file selector.
Mask Attack (-a 3)
Generates candidates purely position-based. Each position has a charset. No dictionary needed. Ideal for known patterns (first name + year + special character).
In GovCracker: Attack mode “Mask Attack“ → mask field, custom charsets, increment options and Markov toggle directly configurable.
Hybrid Attack (-a 6 / -a 7)
Combines a wordlist with a mask. Mode -a 6: word first, mask appended. Mode -a 7: mask first, word appended. Very effective for patterns like sommer2024!.
In GovCracker: Attack mode “Hybrid Attack“ with direction selector and mask input field.
More Attack Modes
Combinator Attack (-a 1)
Combines one word from each of two wordlists into a candidate. police + 2024 becomes police2024. Optional inline rules with -j/-k for both sides. Available in GovCracker via the Combinator mode.
Pure Wordlist Attack (-a 0)
Dictionary attack without rules – the fastest method, directly hits known or leaked passwords. Always recommended as the first step. In GovCracker: Wordlist mode without a rule file.
Recommended Attack Order
- Wordlist (rockyou, project-specific)
- Wordlist + best64.rule
- Wordlist + rockyou-30000.rule
- Hybrid: Wordlist +
?d?d?d?d - Mask: typical patterns / .hcmask
- Brute-Force (short lengths only)
2. Masks & Built-in Charsets
A mask is a character template. Each placeholder defines which characters are tested at that position. Fixed characters can be embedded directly. The mask length determines the candidate length (when increment is disabled).
Built-in Charsets
| Placeholder | Name | Characters | Count | Typical Use |
|---|---|---|---|---|
?l | Lowercase | abcdefghijklmnopqrstuvwxyz | 26 | Names, regular words |
?u | Uppercase | ABCDEFGHIJKLMNOPQRSTUVWXYZ | 26 | First letter, abbreviations |
?d | Digits | 0123456789 | 10 | Digits, PINs, years |
?h | Hex lowercase | 0123456789abcdef | 16 | MD5-like passwords, hashes as PW |
?H | Hex uppercase | 0123456789ABCDEF | 16 | Like ?h, but uppercase |
?s | Special | !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ | 33 | Special characters, password policies |
?a | All printable | ?l + ?u + ?d + ?s | 95 | Full brute-force (slow!) |
?b | All bytes | 0x00–0xff | 256 | Binary contexts, encoding issues |
?? | Literal ? | The literal ? character | 1 | When ? appears in the password |
Mask Examples with Fixed Characters
Fixed characters are written directly into the mask – only placeholders start with ?.
| Pattern | Mask | Explanation | Examples |
|---|---|---|---|
| First name + 4 digits | ?u?l?l?l?l?d?d?d?d | Uppercase, four lowercase, four digits | Maria1985, Klaus2019 |
| Fixed company name + number | Firma?d?d?d?d! | Fixed prefix, four digits, fixed ! | Firma2024! |
| 4-digit PIN | ?d?d?d?d | All 10,000 combinations | 0000–9999 |
| 6-digit PIN | ?d?d?d?d?d?d | All 1,000,000 combinations | 000000–999999 |
| Word + special character | ?l?l?l?l?l?l?s | Six lowercase letters + special character | sommer!, winter? |
| License plate-like | ?u?u?u?d?d?d?d | Three uppercase letters, four digits | ABC1234 |
| Date | ?d?d.?d?d.?d?d?d?d | European date format | 01.01.1985 |
| Complex 8 characters | ?u?l?l?l?d?d?d?s | Typical password policy | Haus1985! |
3. Custom Charsets (-1 to -4)
Hashcat allows up to four custom charsets. They are defined with -1–-4 (or --custom-charset1 to --custom-charset4) and used in the mask as ?1–?4. Built-in charsets can be combined.
| Parameter | Long Form | Placeholder | Charset Definition | Examples |
|---|---|---|---|---|
-1 CS | --custom-charset1=CS | ?1 | Character string or combined built-ins | -1 ?l?d ?1?1?1?1?1?1 |
-2 CS | --custom-charset2=CS | ?2 | Character string or combined built-ins | -2 ABCDEF ?2?2?d?d |
-3 CS | --custom-charset3=CS | ?3 | Character string or combined built-ins | -3 !?_$ ?l?l?3 |
-4 CS | --custom-charset4=CS | ?4 | Character string or combined built-ins | -4 äöüß ?l?l?4?4 |
-1 ?l?d defines all lowercase letters and digits. A direct character string like -1 aeiou is also possible and works well for vowel-based analysis.?l?d or !@#$). GovCracker automatically passes them as -1–-4 parameters to the engine.4. Mask Options & Increment Mode
Beyond the mask itself, various options control the behavior of the mask attack – especially the increment mode for variable password lengths.
| Option | Meaning | Default | Examples |
|---|---|---|---|
-a 3 | Enables the mask attack / brute-force mode | – | hashcat -a 3 -m 1000 hashes.txt ?l?l?l?d |
--increment | Tries all lengths from 1 (or --increment-min) up to the mask length | off | ?l?l?l?l?l?l --increment → tries 1–6 characters |
--increment-min=N | Start length for increment mode | 1 | --increment-min=6 |
--increment-max=N | Maximum length; must not exceed mask length | mask length | --increment-max=10 |
--hex-charset | Interprets custom charsets as hex bytes | off | --hex-charset -1 c3a4c3b6 |
-s N | Skip: skips the first N candidates (for checkpointing) | 0 | -s 5000000000 |
-l N | Limit: stops after N candidates | no limit | -l 1000000000 |
--keyspace | Outputs the keyspace (number of candidates) for the mask without cracking | – | hashcat -a 3 ?u?l?l?l?d?d?d?d --keyspace |
.hcmask files a file selector is provided – GovCracker processes lines sequentially and shows progress per mask line.5. Hashcat Mask Files: .hcmask
An .hcmask file contains multiple masks, optionally with their own custom charsets per line. Hashcat processes lines sequentially. Sorting by probability or expected runtime can significantly improve efficiency.
Format of an .hcmask Line
[?1,][?2,][?3,][?4,]mask
| Element | Meaning | Required? |
|---|---|---|
?1, | Custom Charset 1 for this line (overrides global -1) | optional |
?2, | Custom Charset 2 for this line | optional |
?3, | Custom Charset 3 for this line | optional |
?4, | Custom Charset 4 for this line | optional |
| mask | The actual mask (required field) | yes |
Complete Example: forensics.hcmask
# Comment lines start with #
# Line 1: First name (6 chars) + year → most common pattern
?u?l?l?l?l?l?d?d?d?d
# Line 2: lowercase letters + digit at end
?l?l?l?l?l?l?l?d
?l?l?l?l?l?l?d?d
# Line 3: Company name pattern
Company?d?d?d?d!
Firma?d?d?d?d!
# Line 4: Custom charset (lower + digit) at every position
?l?d,?1?1?1?1?1?1?1?1
# Line 5: with special char at end
?u?l?l?l?l?l?d?d?s
# Line 6: PIN pattern (4–6 digits)
?d?d?d?d
?d?d?d?d?d?d
# Line 7: Date pattern
?d?d?d?d?d?d?d?d
hashcat -m 1000 -a 3 hashes.txt forensics.hcmask
.hcmask files:- A literal
?character:?? - A comma inside a charset field:
\, - Comments: lines starting with
#
6. Keyspace & Runtime Estimation
The keyspace is the total number of candidates for a mask. It is the product of the charset sizes at all positions.
$$\text{Keyspace} = \prod_{i=1}^{n} |\text{Charset}_i|$$
Runtime Formula
$$t = \frac{\text{Keyspace}}{\text{Hashrate (H/s)}}$$
Example: ?u?l?l?l?d?d?d?d with NTLM (~100 GH/s on RTX 4090): approx. 0.12 seconds. With MD5-crypt (-m 500, ~1 MH/s): over 130 hours.
--keyspace option in the integrated terminal for pre-checks.7. Markov Chains & Smart Masks
GovCracker supports Markov chain-based character sequence probabilities via .hcstat2 files. This tries more probable character combinations first – ideal for larger keyspaces. The Markov function can be toggled in the mask attack dialog; threshold and a custom .hcstat2 file can be configured there directly.
| Option | Meaning | Examples |
|---|---|---|
--markov-hcstat2=FILE | Use Markov statistics file | --markov-hcstat2=hashcat.hcstat2 |
--markov-threshold=N | Only use transitions with probability ≥ N (0 = all) | --markov-threshold=50 |
--markov-classic | Classic Markov mode (Hashcat v5 compatibility) | – |
--markov-disable | Disable Markov (pure brute-force) | – |
8. Rule Basics
Rule Special Options
| Option | Meaning | Examples |
|---|---|---|
-r file.rule | Load rule file (combinable up to 4×) | -r rules/best64.rule |
-j RULE | Single rule left (applied before the -r rule) | -j c |
-k RULE | Single rule right (applied after the -r rule) | -k $! |
--stdout | Output candidates without cracking | hashcat words.txt -r test.rule --stdout |
--debug-mode=1 | Logs which rule cracked each found hash | --debug-mode=1 --debug-file=out.rule |
--debug-mode=2 | Like 1, but also log the original word | --debug-mode=2 |
--debug-mode=3 | Like 2, but also log the transformed word | --debug-mode=3 |
--debug-mode=4 | Like 3, but also log the hash | --debug-mode=4 |
--debug-file=FILE | Output file for debug information | --debug-file=matched.txt |
--generate-rules=N | Generate and apply N random rules | --generate-rules=10000 |
--generate-rules-func-min=N | Minimum number of functions per random rule | --generate-rules-func-min=1 |
--generate-rules-func-max=N | Maximum number of functions per random rule | --generate-rules-func-max=5 |
--generate-rules-func-sel=LISTE | Allowed functions for random rules | --generate-rules-func-sel=lcuoTt |
--generate-rules-seed=N | Reproducible random seed | --generate-rules-seed=42 |
0. After 9: A = 10, B = 11, ..., Z = 35. Position * refers to the last character in some functions.9. Alle Rule-Funktionen (Standardfunktionen)
All functions below are compatible with John the Ripper. The test word for the Output column is p@ssW0rd (8 characters).
Case & Order
| Name | Syntax | Description | Output (p@ssW0rd) |
|---|---|---|---|
| Nothing (Passthrough) | : | Pass word through unchanged | p@ssW0rd |
| Lowercase all | l | Lowercase all characters | p@ssw0rd |
| Uppercase all | u | Uppercase all characters | P@SSW0RD |
| Capitalize | c | Capitalize first character, lowercase rest | P@ssw0rd |
| Invert Capitalize | C | Lowercase first character, uppercase rest | p@SSW0RD |
| Toggle Case (alle) | t | Toggle case of all letters | P@SSw0RD |
| Toggle @ Position N | TN | Toggle case at position N only | T3 → p@sSW0rd |
Rotation & Duplication
| Name | Syntax | Description | Output (p@ssW0rd) |
|---|---|---|---|
| Reverse | r | Reverse the word | dr0Wss@p |
| Duplicate | d | Duplicate the word | p@ssW0rdp@ssW0rd |
| Duplicate N times | pN | Append the word N additional times | p2 → word × 3 |
| Reflect | f | Word + reversed word | p@ssW0rddr0Wss@p |
| Rotate Left | { | Rotate first character to the end | @ssW0rdp |
| Rotate Right | } | Rotate last character to the front | dp@ssW0r |
| Duplicate first N chars | zN | Duplicate first character N times at the front | z2 → ppp@ssW0rd |
| Duplicate last N chars | ZN | Duplicate last character N times at the end | Z2 → p@ssW0rddd |
| Duplicate all chars | q | Duplicate every character | pp@@ssssWW00rrdd |
Append & Insert
| Name | Syntax | Description | Output (p@ssW0rd) |
|---|---|---|---|
| Append Char | $X | Append character X to the end | $1$! → p@ssW0rd1! |
| Prepend Char | ^X | Prepend character X to the front | ^2^1 → 12p@ssW0rd |
| Insert @ N | iNX | Insert character X at position N | i4! → p@ss!W0rd |
Delete & Extract
| Name | Syntax | Description | Output (p@ssW0rd) |
|---|---|---|---|
| Truncate Left | [ | Delete the first character | @ssW0rd |
| Truncate Right | ] | Delete the last character | p@ssW0r |
| Delete @ N | DN | Delete character at position N | D3 → p@sW0rd |
| Extract Range | xNM | Extract M characters starting at position N | x04 → p@ss |
| Omit Range | ONM | Delete M characters starting at position N | O12 → psW0rd |
| Truncate @ N | 'N | Truncate everything from position N | '6 → p@ssW0 |
Replace & Overwrite
| Name | Syntax | Description | Output (p@ssW0rd) |
|---|---|---|---|
| Overwrite @ N | oNX | Overwrite character at position N with X | o3$ → p@s$W0rd |
| Replace all X with Y | sXY | Replace all occurrences of X with Y | ss$ → p@$$W0rd |
| Purge X | @X | Remove all occurrences of X | @s → p@W0rd |
10. Hashcat-specific Functions
These functions are Hashcat-specific and not compatible with John the Ripper. The test word for the Output column is p@ssW0rd.
Swap & Shift
| Name | Syntax | Description | Output (p@ssW0rd) |
|---|---|---|---|
| Swap Front | k | Swap the first two characters | @pssW0rd |
| Swap Back | K | Swap the last two characters | p@ssW0dr |
| Swap @ N,M | *NM | Swap characters at positions N and M | *34 → p@sWs0rd |
| Bitwise Shift Left | LN | ASCII value at position N × 2 (bitwise left shift) | L2 → character value doubled |
| Bitwise Shift Right | RN | ASCII value at position N ÷ 2 (bitwise right shift) | R2 → character value halved |
| ASCII Increment | +N | Increment ASCII value at position N by 1 | +2 → p@tsW0rd (s→t) |
| ASCII Decrement | -N | Decrement ASCII value at position N by 1 | -1 → p?ssW0rd (@→?) |
Block Duplication & Title Case
| Name | Syntax | Description | Output (hello world) |
|---|---|---|---|
| Replace N with N+1 | .N | Replace character at N with character at N+1 | .1 → p@ssW0rd → psssW0rd |
| Replace N with N–1 | ,N | Replace character at N with character at N–1 | ,1 → ppssW0rd |
| Duplicate Block Front | yN | Duplicate the first N characters at the front | y3 → p@sp@ssW0rd |
| Duplicate Block Back | YN | Duplicate the last N characters at the end | Y3 → p@ssW0rd0rd |
| Title Case | E | Lowercase all, capitalize after each space | Hello World |
| Title mit Separator X | eX | Like E, but after separator X | e- → Hello-World |
| Toggle nach N-tem Sep. | 3NX | Toggle case of character after the N-th separator X | 30- → Hello-world→Hello-World |
11. Memory Operations (M, 4, 6, X)
Memory operations allow temporary storage and reuse of intermediate states within a rule line. The concept is powerful but error-prone – always test with --stdout.
| Name | Syntax | Description | Beispiel & Ausgabe |
|---|---|---|---|
| Memorize | M | Stores the current word state in the memory register. Memory is set at the beginning of rule execution. | M → current state saved |
| Append Memory | 4 | Appends the stored memory content to the current word | uM l4 → p@ssW0rd + uppercase stored, then lowercase + memory: p@ssw0rdP@SSW0RD |
| Prepend Memory | 6 | Prepends the stored memory content | rMr6 → reverse, save, reverse back, memory prepended: dr0Wss@pp@ssW0rd |
| Extract Memory | XNMI | Inserts M characters from memory starting at position N into position I of the current word | lMX428 → complex, memory-based |
Memory Usage Examples
# Original word + uppercase version
# sommer → sommerSOMMER
M u4
# Original word + reversed version
# sommer → sommerremmos
M r4
# Word “mirrored” + space in between
# hello → hello olleh
M $ r4
# Suppress duplicate (Q-Reject after memory comparison)
# Discards if word == memory (i.e. rule changed nothing)
r M r Q
M call is the current state saved.12. Reject Rules
Reject rules discard candidates based on conditions. They work only with -j/-k (inline rules) or hashcat-legacy — in regular rule files they are ignored by hashcat.
| Name | Syntax | Condition (rejected if…) | Examples | Typical Use |
|---|---|---|---|---|
| Reject less | <N | Word length > N (discards long words) | <8 | Keep only short passwords |
| Reject greater | >N | Word length < N (discards short words) | >5 | Only words with at least 6 characters |
| Reject equal length | _N | Length ≠ N | _8 | Only exactly 8-character candidates |
| Reject contains | !X | Character X is present | !z | No z allowed |
| Reject not contains | /X | Character X is not present | /1 | Must contain a 1 |
| Reject equal first | (X | Does not start with X | (p | Only words starting with p |
| Reject equal last | )X | Does not end with X | )d | Only words ending with d |
| Reject equal @ N | =NX | Character at position N is not X | =0A | Position 0 must be A |
| Reject contains count | %NX | X occurs fewer than N times | %2a | At least 2× 'a' required |
| Reject memory match | Q | Current word == memory content | rMrQ | Discard palindromes / unchanged words |
13. Hex Bytes in Rules
Non-printable characters or special characters can be specified in rules as hex escape sequences \xNN. This is useful for encoding-specific passwords, null bytes, or characters outside the ASCII range.
# Append letter 'd' (0x64)
hashcat words.txt -j '$\x64' --stdout
# penguin → penguind
# Append null byte (forensic special case)
$\x00
# Append umlaut ä (UTF-8: c3 a4)
$\xc3$\xa4
# Replace: 'a' with ä (UTF-8)
sa\xc3\xa4
ä = \xc3\xa4. The charset file (.hcchr) can be used to define complete character sets for specific code pages. For Windows code page 1252: --encoding=cp1252.14. Known Rule Sets & Recommendations
Hashcat ships with several high-quality rule files. The choice depends on the target scenario.
| Rule File | Rules | Use Case | Strength |
|---|---|---|---|
best64.rule | 64 | First step, fast, covers most common patterns | Empfohlen |
rockyou-30000.rule | 30.000 | Strong coverage of typical password patterns | Stark |
dive.rule | 99.950 | Maximum transformation; slow but comprehensive | Sehr umfangreich |
T0XlC.rule | 8.478 | Leet-speak, special character substitutions | Spezialisiert |
InsidePro-HashManager.rule | 17.238 | Hashing patterns, numbers, appendages | Umfangreich |
unix-ninja-leetspeak.rule | 2.306 | Leet-speak substitutions | Spezialisiert |
hob064.rule | 64 | Similar to best64, alternative selection | Schnell |
OneRuleToRuleThemAll.rule | 52.000+ | Community-based, broad coverage | Sehr umfangreich |
Key Rules from best64.rule
# No change
:
# Lowercase
l
# Capitalize
c
# Reverse
r
# Append digit 1
$1
# Exclamation mark
$!
# Capitalize + 1
c$1
# Year 2022
$2$0$2$2
# Duplicate
d
# Delete last character
]
# Delete first character
[
# Replace all s with $
ss$
# Replace all o with 0
so0
15. Hashcat Brain – Intelligent Deduplication
Hashcat Brain is an optional server-client system for candidate deduplication. A Brain server records which candidates have already been tested – connected clients skip these automatically. This prevents duplicate work across parallel sessions using the same wordlists or rules.
Components
| Component | Role | Example Command |
|---|---|---|
| Brain-Server | Central deduplication service; remembers all tested candidates in a fast in-memory structure | hashcat --brain-server --brain-server-timer=5 |
| Brain-Client | Cracking instance (e.g. GovCracker) that queries the server before each candidate block and skips duplicate blocks | hashcat ... --brain-client --brain-client-features=3 |
Brain Feature Level
| Value | Meaning | Recommendation |
|---|---|---|
1 | Deduplication by hash value of the candidate (content) | Basic deduplication |
2 | Deduplication by attack position (skip/limit-based, for distributed attacks) | Cluster use |
3 | Both combined (Feature 1 + 2) | Both combined (Feature 1 + 2) |
When Brain is Useful – and When It's Not
The decision depends entirely on the GPU hashrate of the target algorithm. Brain is only useful when the cracking rate is low enough that the network overhead of the Brain server does not become a bottleneck.
NTLM – Brain is counterproductive
NTLM achieves around 300 billion hashes per second on an RTX 4090. The GPU tests candidates so fast that any network communication with the Brain server immediately becomes the bottleneck. The GPU is almost entirely idle, waiting for the server.
Brain throughput (realistic): ~200–500 MH/s
Effective performance with Brain: < 0.2% of GPU capacity
→ Never activate Brain for NTLM.
VeraCrypt – Brain is ideal
VeraCrypt with AES cascade (-m 13711) achieves only around 500–1,000 hashes per second on an RTX 4090. The Brain server has more than enough capacity to deduplicate every candidate without slowing down the GPU.
When multiple GovCracker instances (e.g. GovCluster) run with the same wordlist, Brain prevents the same candidate from being tested multiple times against the expensive hash.
Brain overhead: negligible
Benefit with 3 instances + same wordlist: up to 3× faster total coverage
→ Definitely use Brain for VeraCrypt, KeePass, bcrypt.
Brain Rule of Thumb by Algorithm
| Algorithm | Hashrate (RTX 4090) | Brain? | Reason |
|---|---|---|---|
NTLM (-m 1000) | ~300 GH/s | Nein | GPU exceeds Brain capacity by factor ~600 |
MD5 (-m 0) | ~160 GH/s | Nein | Same reason as NTLM |
SHA-256 (-m 1400) | ~22 GH/s | Nein | Still too fast for Brain |
WPA2 (-m 22000) | ~2 MH/s | Bedingt | Only useful with many parallel clients |
bcrypt cost 5 (-m 3200) | ~200 kH/s | Ja | Brain overhead low, deduplication useful |
VeraCrypt AES (-m 13711) | ~500 H/s | Ja | GPU so slow that Brain causes no losses |
KeePass AES (-m 13400) | ~1 kH/s | Ja | Same reason as VeraCrypt |
BitLocker (-m 22100) | ~500 kH/s | Ja | Useful with multiple parallel sessions |
16. Common Errors & Best Practices
Common Errors
| Problem | Cause | Solution |
|---|---|---|
| Keyspace explodes / runtime unrealistic | ?a on too many positions | Restrict pattern: ?u?l?l?l?l?d?d?d?d instead of ?a×9. Always check --keyspace first. |
| Shorter passwords not found | Mask has fixed length | Use --increment with --increment-min and --increment-max. |
Custom charset ?1 causes error | -1 missing in the command or in the .hcmask line | Define charset before the mask: -1 ?l?d or integrate into the .hcmask line. |
| Question mark interpreted as placeholder | ? introduces a placeholder | Write a literal question mark as ??. |
Comma in .hcmask disrupts parsing | Comma is the delimiter between charset and mask | Escape comma with \, when it is part of the charset. |
| Rules produce unexpected candidates | Multiple rule files multiply each other | Test with --stdout | head first; check rule files individually. |
| Wrong hash mode | -m does not match the hash format | Use Hashcat --example-hashes; compare format with example hash. In GovCracker: automatic hash detection. |
| Umlauts / non-ASCII do not work | Encoding mismatch between wordlist and Hashcat | Set --encoding, use .hcchr file, or use --hex-charset with hex-encoded characters. |
| Memory rule behaves unexpectedly | Memory initialization misunderstood | Memory is pre-loaded with the original word; call M explicitly to save an intermediate state. Debug with --stdout. |
| GPU thermally throttled / cracking stops | Temperature too high, insufficient cooling | Set --gpu-temp-abort; improve case cooling; in cluster operation use GovCluster agent on dedicated machines. |
Recommended Workflow
- 1Identify hashes correctly: Always determine the correct
-mmode first. In GovCracker the automatic hash detection handles this step. Wrong mode = no hits, even if the password is in the wordlist. - 2Build a project-specific wordlist: Collect names, locations, company terms, known passwords from context. A single specific word can be decisive.
- 3Start with small rule sets: Begin with
best64.rule, then expand if needed. Don't start immediately withdive.rule– it costs enormous time. - 4Hybrid before brute-force: Wordlist +
?d?d?d?dor +?d?d?d?d?scovers the majority of real passwords and is much faster than blind brute-force. - 5Keep masks realistic: Derive patterns from context (organization's password policies, known password frequencies). Check keyspace with
--keyspacein advance. - 6Validate candidates in advance: Always test every new rule or mask with
--stdout | headbefore investing GPU time. - 7Save sessions with
--session: Always start long attacks with a session name. Resume with--restoreafter interruption. - 8Document results: Log all hits and successful rules with
--outfileand--debug-file. In GovCracker results are saved automatically and can be exported. - 9Stay within legal boundaries: Only attack lawfully seized evidence or authorized systems. Document Hashcat actions and record them in the report.