Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
hate_crack — TrustedSec 팀의 Hashcat을 통한 크래킹 방법론 자동화 도구. | Kitploit
도구/GitHubGitHub/trustedsec/hate_crack
Password CrackingPassword AttacksHash AnalysisPenetration Testing
GitHubtrustedsec/hate_crack

hate_crack

TrustedSec 팀의 Hashcat을 통한 크래킹 방법론 자동화 도구.

저장소 보기웹사이트
1.9k2874118시간 38분 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
```
  ___ ___         __             _________                       __
 /   |   \_____ _/  |_  ____     \_   ___ \____________    ____ |  | __
/    ~    \__  \\   __\/ __ \    /    \  \/\_  __ \__  \ _/ ___\|  |/ /
\    Y    // __ \|  | \  ___/    \     \____|  | \// __ \\  \___|    <
 \___|_  /(____  /__|  \___  >____\______  /|__|  (____  /\___  >__|_ \
       \/      \/          \/_____/      \/            \/     \/     \/
```

## 설치

소스에서 설치하는 것이 유일하게 지원되는 방법입니다. hate_crack은 PyPI에 **배포되지 않습니다**: `pip install hate-crack`은 의도적으로 실패하며 여기를 다시 가리키는 `0.0.0` 플레이스홀더로 해석됩니다. 이 이름은 다른 누군가가 유사한 이름으로 게시하지 못하도록 하기 위해서만 유지됩니다 — [`packaging/pypi-placeholder/`](https://github.com/trustedsec/hate_crack/blob/main/packaging/pypi-placeholder)를 참조하세요.

### 1. hashcat 설치

Hashcat이 설치되어 있고 PATH에서 사용 가능해야 합니다:

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

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

또는 https://hashcat.net/hashcat/ 에서 미리 빌드된 바이너리를 다운로드하고 `config.json`의 `hcatPath`를 해당 위치로 설정하세요.

### 2. hate_crack 다운로드

서브모듈과 함께 클론하세요 (hashcat-utils, princeprocessor, pcfg_cracker, Corporate_Masks, 그리고 선택적으로 omen에 필요):

```bash
git clone --recurse-submodules https://github.com/trustedsec/hate_crack.git
cd hate_crack
```

하위 모듈 없이 클론했다면, 초기화하세요:

```bash
git submodule update --init --recursive
```

그런 다음 필요하면 설정을 사용자 지정하십시오. hate_crack은 두 개의 설정 파일을 사용하며, 각각 서로 다른 설정 집합을 담당합니다:

- **`config.json`** — 워드리스트 경로, 마스크, 규칙, 튜닝, potfile, hashcat 경로, 후보 제한, 알림 토글, CLI 기본 설정 (35개 설정).
- **`.env`** — 서드파티 통합 설정만: Hashview 및 Hashmob 자격 증명, Pushover 자격 증명, Ollama, 그리고 pipal (14개 설정). git에 추적되지 않으며, 모드 `0600`으로 생성됩니다.

이 구분선이 여기에 있는 데에는 한 가지 이유가 있습니다: `.env`는 비밀을 담을 수 있는 파일이기 때문입니다. 서드파티 서비스의 자격 증명과 설정은 추적되지 않는 `0600` 파일에 들어가고, hate_crack이 로컬에서 수행하는 모든 것은 `config.json`에 남으며, 이 파일은 공유하고, diff하고, 자신의 노트에 체크인해도 안전합니다. 이것이 또한 Pushover *자격 증명*은 `.env`에 있는 반면 Pushover on/off *토글*은 `config.json`에 있는 이유입니다 — 토글은 로컬 기본 설정이지 비밀이 아닙니다.

각 키는 정확히 하나의 집에만 속합니다. 다른 파일에 배치된 키는 무시되며, hate_crack은 해당 키가 속한 파일 이름을 명시한 경고를 출력합니다. 어떤 키든 해당 환경 변수를 export하여 단일 실행에 대해 재정의할 수 있습니다. 대부분의 사용자는 기본 경로가 즉시 작동하므로 이 단계를 건너뛸 수 있습니다.

`config.json`은 영구적이며 일급입니다 — 더 이상 사용되지 않으며 제거 일정도 없습니다. 통합 설정만 이동했습니다.

**단일 `config.json`에서 업그레이드하시나요?** hate_crack이 첫 실행 시 자동으로 마이그레이션합니다: 통합 설정이 새 `0600` `.env`로 복사된 다음, 두 파일이 모두 해당 설정을 주장하지 않도록 `config.json`에서 제거됩니다. 어떤 키가 이동했는지 (값은 절대 아님) 출력하고, 원본을 건드리기 전에 `config.json.pre-split.bak`으로 저장합니다. `config.json`의 다른 모든 것은 키 순서를 포함하여 정확히 그대로 유지됩니다.

**첫 실행:** hate_crack이 두 파일을 모두 생성하므로 할 일이 없습니다. 대신 `.env`를 수동으로 설정하려면 추적되는 템플릿을 복사하십시오:

```bash
cp .env.example .env
chmod 600 .env
```

`.env.example`은 커밋되어 있으며 모든 자격 증명 키가 비어 있는 상태로 제공됩니다. `.env` 자체는 **절대** 커밋되어서는 안 됩니다 — 이는 gitignore 처리되며, 일반적인 백업 표기법도 함께 무시되고, hate_crack은 항상 모드 `0600`(소유자 읽기/쓰기 전용)으로 이를 생성합니다. `.env.example`은 스키마에서 생성됩니다. `hate_crack/config_schema.py`를 변경한 후 `uv run python -m hate_crack.config_writer`로 재생성하세요.

### 3. 의존성 및 hate_crack 설치

가장 쉬운 방법은 `make`(또는 `make install`)를 실행하는 것으로, 이는 OS를 자동 감지하고 다음을 설치합니다:
- 외부 의존성 (p7zip, transmission-daemon / transmission-remote)
- 서브모듈 빌드 (hashcat-utils, princeprocessor, pcfg_cracker, 선택적으로 omen) 및 데이터 전용 Corporate_Masks 마스크 세트 체크아웃
- uv를 통한 Python 의존성 및 `~/.local/bin/hate_crack`에 CLI 심(shim) 생성

```bash
make
```

이것은 멱등적입니다 - 이미 설치된 도구는 건너뜁니다. 강제로 깨끗하게 재설치하려면:

```bash
make reinstall
```

**또는 의존성을 수동으로 설치하세요:**

### 외부 의존성
특정 다운로드/추출 흐름에 필요합니다:

- `7z`/`7za` (p7zip) — `.7z` 아카이브를 추출하는 데 사용됩니다.
- `transmission-daemon` / `transmission-remote` — Weakpass 토렌트를 다운로드하는 데 사용됩니다.

수동 설치 명령:

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
```

그런 다음 Python 종속성과 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
```

-------------------------------------------------------------------
## 프로젝트 구조
핵심 로직은 이제 `hate_crack/` 아래의 모듈로 분리되어 있습니다:

- `hate_crack/cli.py`: argparse 헬퍼 및 구성 재정의.
- `hate_crack/api.py`: Hashview, Weakpass, Hashmob 통합 (다운로드/메뉴/헬퍼).
- `hate_crack/attacks.py`: 메뉴 공격 핸들러.
- `hate_crack/corpus_stats.py`: LLM에 코퍼스를 설명하는 데 사용되는 전체 코퍼스 비밀번호 통계.
- `hate_crack/plaintext.py`: 코퍼스 라인에서 비밀번호를 복구합니다 (해시 접두사 제거, `$HEX[...]` 디코딩). LLM 모드, corpus_stats, rulegen에서 공유됩니다.
- `hate_crack/llm.py`: Atomic Agents를 통한 구조화된 (JSON) LLM 후보 생성.
- `hate_crack/menu.py`: 선택적 화살표 키 탐색을 포함한 공유 메뉴 렌더러.
- `hate_crack/noninteractive.py`: 스크립트 공격 하위 명령용 디스패처.
- `hate_crack/notify/`: 알림 패키지 (Pushover 백엔드, 크랙별 테일러).
- `hate_crack/username_detect.py`: hashcat의 `--username` 사용 여부를 결정하기 위해 `username:hash` 입력 파일을 감지합니다.
- `hate_crack/formatting.py`, `hate_crack/progress.py`: 출력 포맷팅 및 진행 표시 헬퍼.
- `hate_crack/main.py`: 메인 CLI 구현.

최상위 `hate_crack.py`는 여전히 메인 진입점이며 이 모듈들을 조정합니다.

-------------------------------------------------------------------
## 참고 및 감사

이 프로젝트는 여러 외부 프로젝트와 서비스에 의존하며 영감을 받았습니다. 감사합니다:

- Hashview (http://github.com/hashview/)
- Weakpass (https://weakpass.com)
- Hashmob (https://hashmob.net)

-------------------------------------------------------------------
## 사용법

`make`로 설치한 후, 어디서든 hate_crack을 실행하세요:

```bash
hate_crack
# or with arguments:
hate_crack <hash_file> <hash_type> [options]
```

또는 `uv`를 통해 실행:

```bash
uv run hate_crack.py <hash_file> <hash_type>
```

### 도구로 실행 (권장)

저장소 루트에서 `make`를 사용하여 설치하세요 - 이는 서브모듈을 빌드하고 에셋을 번들링합니다:

```bash
cd /path/to/hate_crack
make
hate_crack
```

`make install` 명령은 `~/.local/bin/hate_crack`에 bash shim을 생성하며, 이는 저장소 디렉터리에서 실행되므로 현재 작업 디렉터리와 관계없이 config와 assets를 항상 찾을 수 있습니다.

Config는 다음 위치에서도 검색됩니다:
- 저장소 루트 및 패키지 디렉터리
- `~/.hate_crack`

**참고:** `config.json`의 `hcatPath`는 hashcat 바이너리 위치 전용입니다(hashcat이 PATH에 있으면 선택 사항). Hate_crack assets(hashcat-utils, princeprocessor, pcfg_cracker, Corporate_Masks, omen)는 저장소 디렉터리에서 로드되며 `make install`에 의해 자동으로 번들됩니다.

### 스크립트로 실행
스크립트는 `uv` shebang을 사용합니다. 실행 가능하게 만들고 실행하세요:

```bash
chmod +x hate_crack.py
./hate_crack.py
```

Python을 직접 사용할 수도 있습니다:

```bash
python hate_crack.py
```

### 비대화형 / 스크립트 사용

자동화를 위해 메뉴를 건너뛰고 단일 공격을 직접 실행할 수 있습니다. 공격 이름이 첫 번째 인수이고, 그 뒤에 해시 파일과 hashcat 해시 유형이 옵니다. 전처리 프롬프트(컴퓨터 계정 필터링, LM 우선 브루트 포스, 중복 계정 중복 제거)는 이 모드에서 기본값을 자동으로 수락합니다. 프로세스는 성공 시 `0`, 오류(해시 파일 누락, 숫자가 아닌 해시 유형, 워드리스트 누락 또는 알 수 없는 규칙 파일 이름) 시 0이 아닌 값을 반환하며 종료됩니다.

```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
```

메뉴의 대부분의 공격은 동일한 방식으로 사용할 수 있습니다. 이들은 해시 파일과 해시 유형 외에는 아무것도 필요로 하지 않습니다:

```bash
hate_crack fingerprint hashes.txt 1000
hate_crack pathwell    hashes.txt 1000
hate_crack prince      hashes.txt 1000
hate_crack pcfg        hashes.txt 1000
hate_crack princeling  hashes.txt 1000
hate_crack smartmask   hashes.txt 1000
hate_crack corporate   hashes.txt 1000
hate_crack combinator  hashes.txt 1000     # configured wordlists
hate_crack hybrid      hashes.txt 1000     # configured wordlists
```

각 항목은 메뉴 항목에서 요청하는 설정도 함께 받습니다:

```bash
# Fingerprint, tuned: escalate to 24-character fragments and cap the keyspace
hate_crack fingerprint hashes.txt 1000 --max-expander-len 24 \
    --run-hybrid-on-expanded --keyspace-limit 50000000000

# Skip the fragment/wordlist combination step entirely
hate_crack fingerprint hashes.txt 1000 --no-dictionary-wordlist

# Override the configured wordlists (combinator needs at least two).
# Two wordlists use combinator, three use combinator3, more -- or any
# --separator -- use combinatorX, matching what the menu does.
hate_crack combinator hashes.txt 1000 --wordlist first.txt second.txt
hate_crack combinator hashes.txt 1000 --wordlist a.txt b.txt c.txt
hate_crack combinator hashes.txt 1000 --wordlist a.txt b.txt --separator -
hate_crack hybrid     hashes.txt 1000 --wordlist rockyou.txt

# Corporate masks, lengths 8-12 only
hate_crack corporate hashes.txt 1000 --min 8 --max 12

# Smart mask, skipping templates over 10 billion candidates
hate_crack smartmask hashes.txt 1000 --keyspace-limit 10000000000
```

나머지는 메뉴 항목이 요구하는 하나의 입력을 받습니다:

```bash
# Bandrel methodology (comma-separate multiple companies)
hate_crack bandrel hashes.txt 1000 --company "Acme,Acme Corp"

# Permutation attack over a short targeted wordlist
hate_crack permute hashes.txt 1000 --wordlist names.txt

# Ad-hoc mask -- a literal mask or a .hcmask file, optionally incrementing
hate_crack adhocmask hashes.txt 1000 --mask '?u?l?l?l?d?d'
hate_crack adhocmask hashes.txt 1000 --mask masks/corporate.hcmask
hate_crack adhocmask hashes.txt 1000 --mask '?a?a?a?a?a?a?a?a' \
    --increment-min 4 --increment-max 8
hate_crack adhocmask hashes.txt 1000 --mask '?a?a?a?a' --increment

# N-gram candidates from a corpus
hate_crack ngram hashes.txt 1000 --corpus corpus.txt --group-size 3

# Combipow passphrases (wordlist capped at 63 lines: it generates 2^n-1)
hate_crack combipow hashes.txt 1000 --wordlist words.txt
hate_crack combipow hashes.txt 1000 --wordlist words.txt --no-spaces

# Spoonman: basewords and rules derived from a corpus of known passwords
hate_crack spoonman hashes.txt 1000 --corpus previous-engagement.txt
hate_crack spoonman hashes.txt 1000 --corpus previous.txt --rule-coverage 95
# --rule-coverage accepts 50, 75, 95 or 99 -- the only capped rule files
# derived. Omit it for the full rule set.

# OMEN -- requires a model trained beforehand from the interactive menu
hate_crack omen hashes.txt 1000 --max-candidates 1000000

# Loopback: re-run rules against the plaintexts already cracked
hate_crack loopback hashes.txt 1000 --rules best64.rule
```

`fingerprint`는 메뉴 항목과 그대로 실행했을 때의 동작이 동일하지 않은 유일한 명령입니다. 메뉴 옵션 5는 항상 확장된 프래그먼트에 대해 하이브리드 패스를 실행하지만, 서브커맨드는 `hcatFingerprint` 자체의 기본값인 off로 설정됩니다. 메뉴와 동일하게 동작하게 하려면 `--run-hybrid-on-expanded`를 전달하세요.

다섯 개의 메뉴 항목은 단일 플래그로 전달할 수 없는 입력이 필요하기 때문에 여전히 대화형 전용입니다: Markov 브루트 포스, Random Rules, Rosetta 공격, LLM 공격, 그리고 Extensive Pure_Hate 방법론(단일 공격이 아니라 다른 공격들을 아우르는 오케스트레이터)입니다.

#### 종료 코드

| 코드 | 의미 |
|---|---|
| `0` | 공격이 실행됨 |
| `1` | 잘못된 입력 — 해시 파일 또는 워드리스트 누락, 숫자가 아닌 해시 타입, 알 수 없는 규칙 파일명, 범위를 벗어난 인자 |
| `2` | 알 수 없는 서브커맨드 — 이 빌드의 hate_crack에는 해당 서브커맨드가 없음 |
| `3` | `--exit-code-on-skip` 사용 시에만: 커버리지가 이미 모든 패스를 확인했으므로 아무것도 실행되지 않음 |

종료 코드 `2`와 종료 코드 `3`은 스크립트 기반 드라이버가 "이 버전은 해당 공격을 실행할 수 없음"과 "중복이었음"을 "실행되었으나 아무것도 찾지 못함"과 구분할 수 있게 해줍니다. `--exit-code-on-skip`은 옵트인 방식이므로, 커버리지를 활성화해도 이를 도입하기 전에 작성된 하네스가 실패하기 시작하지 않습니다.

-------------------------------------------------------------------
## 문제 해결

### 업데이트 시 "would clobber existing tag" 오류

오래된 클론은 업데이트를 거부하며 다음과 같은 긴 줄 목록을 출력할 수 있습니다:

```
 ! [rejected]        v2.5.0     -> v2.5.0  (would clobber existing tag)
```

이 문제는 2026년 7월 이전에 생성된 클론에 영향을 줍니다. 당시 공개된 이력이
다시 작성되어 절대 커밋되어서는 안 될 일부 파일이 제거되었고, 이로 인해
모든 커밋에 새 ID가 부여되었습니다. 따라서 오래된 클론의 태그는 이 저장소에
더 이상 존재하지 않는 객체를 가리키게 되며, git은 이미 가지고 있는 태그를
이동시키기를 거부합니다. 체크아웃에는 아무런 문제가 없으며 크래킹 데이터도
위험에 처하지 않습니다.

일회성 재설정으로 복구하십시오. 이 작업은 체크아웃의 로컬 커밋과 편집 내용을
버리므로, git이 추적하는 항목(추적되지 않는 `config.json`과는 달리)을
사용자 정의했다면 먼저 브랜치에 커밋하십시오:

```bash
cd /path/to/hate_crack
git fetch --tags --force origin
git checkout -B main origin/main
make install
```

`--force`는 여기서 태그만 업데이트하며, 커밋은 건드릴 수 없습니다. 이후에는
내장 업데이터가 정상적으로 작동합니다. 2.18 이전 버전은 이 복구를
스스로 수행할 수 없었기 때문에 한 번은 수동으로 해야 합니다.

### 오류: 빌드 디렉터리가 존재하지 않음

다음과 같은 오류가 표시되면:
```
Error: Build directory /opt/hashcat/hashcat-utils does not exist.
Expected to find expander at /opt/hashcat/hashcat-utils/bin/expander.
```

이는 hate_crack 자산이 설치된 패키지에 번들로 포함되지 않았음을 의미합니다.

**경로 이해:**
- config.json의 `hcatPath` → **hashcat 바이너리 위치**를 가리킴 (선택 사항, PATH에 있을 수 있음)
- `hashcat-utils/` 및 `princeprocessor/` → `make install`에 의해 패키지에 번들로 포함됨

**해결 방법:**
서브모듈을 빌드하고 도구를 설치하는 Makefile을 사용하여 재설치하세요:
```bash
cd /path/to/hate_crack  # the repository checkout
make install
```

**기본 구성 (config.json.example):**

대부분의 사용자는 사용자 지정 없이 기본값을 사용할 수 있습니다:
- `hcatWordlists`: `./wordlists` (저장소 루트 또는 HOME/.hate_crack 기준)
- `hcatOptimizedWordlists`: `./optimized_wordlists` (Quick Crack에서 사용하는 디렉터리, 찾을 수 없으면 `hcatWordlists`로 대체)
- `rules_directory`: `./hashcat/rules` (하위 모듈 규칙 포함)
- `hcatTuning`: `` (빈 문자열 - 기본 튜닝 플래그 없음)

**config.json 사용자 지정 예시:**
```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)
  ...
}
```

**구성 로딩:**
- 각 키의 우선순위: `os.environ` > 해당 키 자체의 홈 파일(`.env` 또는 `config.json`) > 내장 기본값
- 누락된 키는 내장 기본값으로 대체됩니다. `config.json.example`은 모든 `config.json` 키를 문서화합니다
- 두 파일 모두 서로 독립적으로 다음 순서로 검색됩니다: **repo root**, 그다음 **설치된 패키지 디렉터리**, 그다음 **`~/.hate_crack`**. 첫 번째 일치가 우선합니다. 두 파일이 서로 다른 디렉터리에서 오는 것은 정상입니다.
- 첫 실행 시 두 파일 모두 생성됩니다 — `config.json`은 `config.json.example`에서, `.env`는 내장 기본값에서 생성됩니다. 이전 `config.json`에 아직 통합 키가 남아 있으면 새 `.env`로 복사되며, hate_crack은 `config.json`에서 삭제해야 할 키를 알려줍니다. hate_crack이 해당 파일 자체를 편집하는 일은 없습니다.
- 매 실행 시 hate_crack은 실제로 로드한 두 파일을 출력합니다:

  ```
  [*] config.json: /home/you/.hate_crack/config.json
  [*] .env:        /home/you/.hate_crack/.env
  ```

  설정이 "적용되지 않는" 문제를 디버깅하기 전에 이 두 줄을 읽어 보세요. 이 줄들이 존재하는 이유는 검색 순서에 두 가지 함정이 있기 때문입니다:

  - **체크아웃이 홈 디렉터리보다 우선합니다.** 저장소 루트가 먼저 검색되므로, 도구를 실행하는 *어떤* 체크아웃에 있는 `.env`나 `config.json`이 `~/.hate_crack`에 있는 것보다 우선합니다. 그리고 체크아웃에서 도구를 실행하는 것이 바로 그 파일들을 그곳에 처음 생성하는 원인이기도 합니다. 이것이 실제 `~/.hate_crack` 설정을 가리는 경우, hate_crack은 이제 두 경로를 모두 명시하는 세 번째 `[!]` 줄로 알려줍니다. 그 줄은 "아래 파일이 무시되고 있다"는 의미로 받아들여야 하며, 두 번째로 똑같이 유효한 설정으로 받아들여서는 안 됩니다.
  - **현재 작업 디렉터리는 절대 검색되지 않습니다.** 우연히 서 있는 디렉터리에 있는 `.env`는 의도적으로 무시됩니다. 참여 디렉터리에는 아무도 설정으로 의도하지 않은 파일들로 가득하기 때문입니다. 저장소 루트나 `~/.hate_crack`에 두세요.

### 오류: ref 'refs/heads/master'와 병합하려 했지만 그러한 ref를 가져오지 못함

다음과 같은 메시지가 보인다면:
```
Your configuration specifies to merge with the ref 'refs/heads/master'
from the remote, but no such ref was fetched.
```

기본 브랜치가 `master`에서 `main`으로 이름이 변경되었습니다. 다음으로 수정하세요:
```bash
git remote set-head origin -a
git branch -m master main
git branch --set-upstream-to=origin/main main
git pull
```

-------------------------------------------------------------------
### Makefile 타겟

**기본 (전체 설치)** - 서브모듈을 빌드하고, 의존성을 설치하며, 도구를 설치합니다:

```bash
make
# or explicitly:
make install
```

이것은 멱등적입니다 - 이미 설치된 도구는 건너뜁니다.

**강제로 깨끗하게 재설치:**

```bash
make reinstall
```

**빠른 업데이트** - 변경 사항을 가져온 후 서브모듈을 다시 빌드하고 도구를 재설치합니다:

```bash
make update
```

**Uninstall** - OS 종속성과 도구를 제거합니다:

```bash
make uninstall
```

**hashcat-utils만 빌드:**

```bash
make hashcat-utils
```

**테스트 실행** - 필요할 때 HATE_CRACK_SKIP_INIT를 자동으로 처리합니다:

```bash
make test
```

**커버리지 보고서:**

```bash
make coverage
```

**빌드/테스트 아티팩트 정리:**

```bash
make clean
```

## 개발

### 개발 환경 설정

선택적 개발 의존성(린터 및 테스트 도구 포함)과 함께 프로젝트를 설치하세요:

```bash
make dev-install
```

### 린터 및 타입 검사 실행하기

변경 사항을 푸시하기 전에 로컬에서 다음 검사를 실행하세요. 모든 검사를 실행하려면 `make lint`를 사용하거나 개별 검사를 실행하세요:

**Ruff (린팅 및 포매팅):**
```bash
make ruff
# or manually:
uv run ruff check hate_crack tests tools packaging hate_crack.py
```

이슈 자동 수정:
```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 (타입 검사):**
```bash
make ty
# or manually:
uv run ty check hate_crack
```

**모든 검사를 함께 실행:**
```bash
make lint
```

### 테스트 실행

테스트는 서브모듈이 빌드되지 않은 경우를 자동으로 감지하고 `HATE_CRACK_SKIP_INIT=1`을 자동으로 설정합니다.

```bash
make test
```

또는 pytest를 직접 실행하세요:

```bash
uv run pytest -v
```

커버리지 포함:

```bash
make coverage
```

pytest를 사용하는 경우:

```bash
uv run pytest --cov=hate_crack
```

### Git Hooks (prek)

Git hooks는 [prek](https://github.com/j178/prek)(v0.3.3+)로 관리됩니다. 다음 명령으로 hooks를 설치하세요:

```bash
prek install --hook-type pre-push --hook-type pre-commit
```

`prek.toml`에 정의된 훅을 pre-commit 로컬 저장소 TOML 스키마를 사용하여 설치합니다:
- **pre-push** (로컬 훅): ruff, ruff-format, ty, pytest, pytest-lima, bandit
- **pre-commit** (`pre-commit/pre-commit-hooks`에서): trailing-whitespace,
  end-of-file-fixer, check-yaml, check-merge-conflict, check-added-large-files,
  detect-private-key

pre-commit 자동 수정기는 파일을 제자리에서 다시 작성하므로, 실행 후 다시 스테이징하고 커밋해야 합니다.

참고: prek 0.3.3은 최상위 수준에서 `repos = [...]`를 기대합니다. 이전 `[hooks.<stage>] commands = [...]` 형식은 지원되지 않습니다.

### 화살표 키 메뉴 탐색

메뉴는 기본적으로 클래식한 번호 매기기 `print()` + `input()` 선택 방식을 사용하며, 이는 여러 자릿수 키를 모두 허용합니다.

`simple-term-menu`를 통한 화살표 키 탐색을 활성화하려면 `HATE_CRACK_ARROW_MENU=1`을 설정하세요. 이 모드에서는 화살표 키로 이동하거나 옵션 번호(예: `99`와 같은 여러 자릿수 포함)를 입력하고 Enter를 누를 수 있습니다. 다른 것을 입력하면 목록이 필터링됩니다. 화살표 키 모드는 TTY도 필요하므로 출력이 파이프될 때는 비활성화됩니다.

목록을 출력한 후 입력을 받는 선택기(워드리스트, 규칙, Weakpass 목록, Hashview 워드리스트 및 규칙 ID)는 `HATE_CRACK_ARROW_MENU` 없이 모든 백엔드에서 Up/Down을 허용합니다. Up은 마지막으로 나열된 키를 채우고, 다시 Up은 그 이전 키를, Down은 되돌아갑니다. 여전히 숫자, 경로 또는 `1,3`과 같은 목록을 입력할 수 있습니다. 화살표로 채워진 키 바로 뒤에 `,`, `+` 또는 `-`를 입력하면 키가 확장됩니다. `plain` 및 `rich` 백엔드에서는 해당 프롬프트 하나에 대해 나열된 키를 readline 기록에 로드하는 방식으로 작동하므로, 이후 자신의 기록은 복원되고 목록 프롬프트 내에서는 접근할 수 없습니다.

### 개발 의존성

선택적 `[dev]` 그룹에는 다음이 포함됩니다:
- **ty** - 정적 타입 검사기
- **ruff** - 빠른 Python 린터 및 포매터
- **pytest** - 테스트 프레임워크
- **pytest-cov** - 커버리지 보고

-------------------------------------------------------------------
공통 옵션:
- `--download-hashview`: 크래킹 전에 Hashview에서 해시를 다운로드합니다.
- `--hashview`: 해시, 워드리스트 및 작업을 관리하기 위한 대화형 Hashview 메뉴.
- `--hashview --help`: Hashview 명령줄 옵션을 표시합니다.
- `--weakpass`: Weakpass에서 워드리스트를 다운로드합니다.
- `--rank`: 특정 등급의 Weakpass 워드리스트만 표시합니다 (0=전체, -1=S/A/B 등급). 등급: 7=S, 6=A, 5=B, 4=C, 3=D, 2=E, 1=F.
- `--hashmob`: Hashmob.net에서 워드리스트를 다운로드합니다.
- `--hashmob-masks`: Hashmob.net에서 마스크를 다운로드합니다.
- `--download-torrent <FILENAME>`: 특정 Weakpass 토렌트 파일을 다운로드합니다.
- `--download-all-torrents`: 캐시에서 사용 가능한 모든 Weakpass 토렌트를 다운로드합니다.
- `--wordlists-dir <PATH>` / `--optimized-wordlists-dir <PATH>`: 워드리스트 디렉터리를 재정의합니다.
- `--pipal-path <PATH>`: pipal 경로를 재정의합니다.
- `--restore-potfile`: 시작 시 hashcat POT 파일에서 `<hashfile>.out`을 재구성하여 기존 내용을 대체한 후 정상 메뉴로 계속 진행합니다. 이 플래그가 없으면 POT 조회는 `.out`이 아직 존재하지 않을 때만 실행됩니다. 메뉴 옵션 93은 확인 프롬프트와 함께 요청 시 동일한 작업을 수행합니다.
- `--maxruntime <SECONDS>`: 최대 런타임을 재정의합니다.
- `--bandrel-basewords <PATH>`: bandrel 기본 단어 파일을 재정의합니다.
- `--update`: 최신 릴리스로 업데이트하고 재설치합니다. 체크아웃이 다른 브랜치에 있는 경우 `main`으로 전환합니다. 릴리스 태그가 그곳에 있기 때문입니다.
- `--nightly`: 대신 `nightly-dev` 브랜치에서 최신 나이틀리로 업데이트합니다. 나이틀리는 CI를 통과했지만 컷 릴리스의 일부가 아닙니다. `--update --nightly`로도 작성할 수 있습니다.
- `--no-optimized-kernel` (또는 `--no-optimize`): 전체 실행 동안 hashcat에 `-O`를 전달하지 않습니다. `config.json`의 `optimizedKernelAttacks`를 재정의하고 `hcatTuning`에 넣은 모든 `-O`를 제거합니다. 구성에 아무것도 다시 기록되지 않으므로 이 실행에만 적용됩니다. 하위 명령과 함께 사용할 경우 하위 명령 앞에 배치하세요: `./hate_crack.py --no-optimize quick hashes.txt 1000 --wordlist words.txt`.
- `--debug`: 디버그 로깅을 활성화합니다 (stderr에 기록).

### Hashview 통합

hate_crack은 중앙 집중식 해시 관리 및 분산 크래킹을 위해 Hashview와 통합됩니다.

#### 대화형 메뉴

대화형 Hashview 메뉴에 접근합니다:
```bash
hate_crack.py --hashview
```

메뉴 옵션:
- **(1) 크랙된 해시 업로드** - 현재 세션에서 크랙된 결과를 Hashview에 업로드
- **(2) 워드리스트 업로드** - 워드리스트 파일을 Hashview에 업로드
- **(3) 워드리스트 다운로드** - Hashview에서 워드리스트 다운로드
- **룰 다운로드** - Hashview에서 룰 파일 다운로드(압축 해제된 평문, `hashcat -r`에 바로 사용 가능). 룰 ID 프롬프트에서 `a`(또는 `all`)를 입력하면 하나 대신 나열된 모든 룰을 다운로드
- **모든 룰 다운로드** - Hashview가 나열한 모든 룰 파일을 한 번에 다운로드. 개별 룰 실패는 나머지를 중단하지 않고 보고됨
- **(4) 남은 해시 다운로드** - 남아 있는 크랙되지 않은 해시 다운로드(크래킹을 위해 전환할지 프롬프트)
- **(5) 발견된 해시 다운로드** - 평문 비밀번호와 함께 이미 크랙된 해시 다운로드(참조/분석용)
- **(6) 해시파일 업로드 및 작업 생성** - 새 해시파일을 업로드하고 크래킹 작업 생성
- **(99) 메인 메뉴로 돌아가기** - 메인 메뉴로 돌아가기

**중요: 발견된 해시 다운로드 vs 남은 해시 다운로드**
- **남은 해시 다운로드 (4)**: 크래킹이 필요한 크랙되지 않은 해시를 다운로드합니다. 사용 가능한 경우 발견된 해시와 자동으로 병합되며, 크래킹을 위해 이 해시파일로 전환할지 프롬프트합니다.
- **발견된 해시 다운로드 (5)**: 이미 크랙된 해시를 hash:cleartext 형식으로 다운로드합니다. 이는 참조용이며 더 이상 크랙할 수 없습니다. 전환 프롬프트는 표시되지 않습니다.

#### 명령줄 인터페이스

Hashview 작업은 명령줄을 통해서도 수행할 수 있습니다:

크랙된 해시 업로드:
```bash
hate_crack.py --hashview upload-cracked --file <output_file>.out --hash-type 1000
```

워드리스트 업로드:
```bash
hate_crack.py --hashview upload-wordlist --file <wordlist>.txt --name "My Wordlist"
```

규칙 파일을 다운로드합니다(압축 해제된 상태로 저장되며, `hashcat -r`에 바로 사용 가능):
```bash
hate_crack.py --hashview download-rules --rules-id 4 --output best64.rule
```

Download left hashes (크래킹되지 않은 해시, 크래킹용):
```bash
hate_crack.py --hashview download-left --customer-id 1 --hashfile-id 123
```

Download found hashes (already-cracked hashes with cleartext):
```bash
hate_crack.py --hashview download-found --customer-id 1 --hashfile-id 123
```

해시파일을 업로드하고 작업을 생성합니다:
```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"
```

#### 구성

`.env`에 Hashview 자격 증명을 설정하세요 (이는 통합 설정이므로 `config.json`에 존재하지 않습니다):
```
HASHVIEW_URL=https://hashview.example.com
HASHVIEW_API_KEY=your-api-key-here
HASHVIEW_VERIFY_TLS=true
```

---

[Read more](https://github.com/trustedsec/hate_crack)
도구 다운로드