A high-performance credential extractor that parses massive url:user:pass files and extracts matching entries by domain — boundary-aware matching, multi-threaded I/O, zero-copy memory maps.
| Category | Detail |
|---|---|
| Domain matching | Boundary-aware + case-insensitive — subdomains, URLs, emails; rejects false positives |
| Performance | Memory-mapped I/O, rayon parallelism, SIMD-accelerated byte search, live per-chunk progress |
| I/O | Single-file, multi-file batch (-a), recursive directory walk (-r) |
| Output control | Deduplication, append mode (-A), match limit (-M), quiet mode (-q) |
| Safety | Refuses to write when output collides with an input path |
| Formats | Configurable ASCII divider — :, |, ;, or any printable ASCII separator |
| UX | Styled CLI with live progress bar, full interactive TUI, graceful cancel |
| Platform | Linux, macOS, Windows — pre-built binaries on every release |
# Pre-built binary (recommended)
curl -LO https://github.com/sinescode/ulpExtractor/releases/latest/download/ulpExtractor-linux-x86_64.tar.gz
tar xzf ulpExtractor-linux-x86_64.tar.gz
./ulpExtractor
# Or build from source
git clone https://github.com/sinescode/ulpExtractor.git && cd ulpExtractor
cargo build --release
./target/release/ulpExtractorulpExtractor -d netflix.com -i combo.txt
ulpExtractor -d netflix.com -i combo.txt -o results.txt
ulpExtractor -d netflix.com -i huge_dump.txt -M 100 # limit to 100 matches
ulpExtractor -d netflix.com -i combo.txt -q # no progress barulpExtractor -d netflix.com -a # all .txt in current dir
ulpExtractor -d netflix.com -a -x txt,csv,json # specific extensions
ulpExtractor -d netflix.com -a -r # recursive
ulpExtractor -d netflix.com -a --dir ./data -t 8 # custom dir, 8 threads
ulpExtractor -d netflix.com -i extra.txt -A # append to existing outputulpExtractor # empty form
ulpExtractor --tui -d netflix.com -i dump.txt # pre-filled formKeyboard
| Key | Action |
|---|---|
Tab / ↑ ↓ |
Move between fields |
← → / Space |
Toggle mode, checkboxes, advanced |
Enter |
Run extraction (or toggle focused control) |
? |
Help overlay |
Esc / q |
Cancel extraction or quit |
r |
Re-run last config (results screen) |
Ctrl+U |
Clear focused text field |
Ctrl+W |
Delete previous word |
| Flag | Description | Default |
|---|---|---|
-d, --domain |
Domain to extract credentials for (normalized, case-insensitive) | required |
-i, --input |
Input file path | — |
-a, --all |
Scan all files matching extensions in a directory | — |
-r, --recursive |
Walk directories recursively (with -a) |
— |
-x, --extensions |
File extensions to include (comma-separated) | txt |
--dir |
Target directory for -a |
. |
-o, --output |
Output file path | output.txt |
-A, --append |
Append to output instead of overwriting | — |
-t, --threads |
Number of worker threads (capped at 64) | 4 |
-D, --divider |
Field separator character (printable ASCII) | : |
-M, --max-matches |
Stop after N unique matches | unlimited |
-q, --quiet |
Suppress the progress bar | — |
--tui |
Open the interactive TUI (optionally pre-filled) | — |
<url_or_domain><divider><user><divider><password>
The domain may appear as a bare host, subdomain, inside a URL path, or in an email:
netflix.com:john:secret123
www.netflix.com:user@mail.com:pass456
https://platform.deepseek.com/login:admin:pass789
user@example.com:somepass
Matching is boundary-aware and case-insensitive — deepseek.com matches platform.DeepSeek.COM but not mydeepseek.com. Output is user<divider>password, one per line, deduplicated.
Domain input is normalized: schemes (https://), paths, userinfo, and trailing ports are stripped before matching.
- Output path must not collide with any input file (prevents truncating dumps).
- The TUI asks before overwriting an existing non-append output file.
- Cancel (Esc / Ctrl-C) flushes partial unique matches already found.
Requires Rust 1.70+ (rustup).
cargo build --release
# → target/release/ulpExtractor