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

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

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

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
DLLHijackHunter — 자동화된 DLL 하이재킹 발견, 검증 및 확인. 로컬 구성 오류를 무기화되고 확인된 공격 경로로 전환합니다. | Kitploit
도구/GitHubGitHub/ghostvectoracademy/dllhijackhunter
Privilege EscalationVulnerability ScannersPayload GenerationPersistence MechanismsDynamic Code Analysis (DAST)ExploitationLateral MovementPenetration TestingBinary AnalysisLearning & EducationRed Teaming
39644702일 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHub
ghostvectoracademy/dllhijackhunter

DLLHijackHunter

자동화된 DLL 하이재킹 발견, 검증 및 확인. 로컬 구성 오류를 무기화되고 확인된 공격 경로로 전환합니다.

저장소 보기
<p align="center">
  <img src="https://img.shields.io/badge/Platform-Windows-blue?style=for-the-badge&amp;logo=windows" />
  <img src="https://img.shields.io/badge/.NET-8.0_%7C_10.0-purple?style=for-the-badge&amp;logo=dotnet" />
  <img src="https://img.shields.io/badge/License-MIT-green?style=for-the-badge" />
  <img src="https://img.shields.io/badge/Version-2.6.0-orange?style=for-the-badge" />
  <img src="https://img.shields.io/badge/Black%20Hat%20Arsenal-Europe%202026-CC0000?style=for-the-badge" />
  <img src="https://img.shields.io/badge/Black%20Hat%20Arsenal-SecTor%202026-CC0000?style=for-the-badge" />
</p>

<h1 align="center">DLLHijackHunter</h1>
<h4 align="center">By <a href="https://projectmerai.com">ProjectMerai</a></h4>

<p align="center">
  <strong>Windows용 자동화된 DLL 하이재킹 탐지, 검증 및 확인</strong><br/>
  <em>"이 DLL은 하이재킹될 수 있을지도 모른다"에서 "표준 사용자가 SYSTEM이 이 DLL을 로드하도록 만들 수 있다 — 여기에 증거가 있다"까지.</em>
</p>

---

## 목차

- [개요](#overview)
- [빠른 시작](#quick-start)
- [작동 방식](#how-it-works)
- [탐지 대상](#what-it-detects)
- [오탐 줄이기](#reducing-false-positives)
- [검증: 로드 프로브와 카나리](#verification-load-probe-and-canary)
- [점수, 등급 및 공격 체인](#scoring-tiers-and-attack-chains)
- [사용법 참조](#usage-reference)
- [안전성 및 운영 영향](#safety-and-operational-impact)
- [소스에서 빌드하기](#building-from-source)
- [테스트 랩 (HijackRange)](#test-lab-hijackrange)
- [알려진 제한 사항](#known-limitations)
- [비교](#comparison)

---

## 개요

DLLHijackHunter는 Windows 호스트에서 DLL 하이재킹 기회를 찾아내고, 단순히 나열하는 데 그치지 않고 이를 입증하려고 합니다. 이 도구는:

1. 바이너리가 자동으로 실행되는 모든 위치 — 서비스, 예약된 작업, Run 키, 시작 폴더, COM 서버, AppInit/AppCert DLL, IFEO 항목, 자동 상승 UAC 바이너리 — 를 **탐지**하고, 각 가져온 DLL이 어디에서 검색될지 계산합니다.
2. 공격자가 실제로 사용할 수 없는 위치 — API 세트, KnownDLL, 표준 사용자가 쓸 수 없는 디렉터리, 보호된 프로세스 등 — 를 **필터링**합니다.
3. (선택 사항) 실제 Windows 로더로 **검증**하여, 무해한 프로브 DLL을 배치하고 어느 복사본이 검색에서 이기는지 확인합니다.
4. (선택 사항) 무해한 카나리 DLL을 배포하고 서비스/작업/COM 개체를 트리거한 뒤 실제로 실행된 ID를 기록하여 **확인**합니다.
5. 각 발견 사항을 신뢰도와 영향도에 따라 **점수화하고 보고**하며, 발견 사항을 공격 체인(예: *표준 사용자 → SYSTEM*)으로 연관시킵니다.

모든 판단은 스캐너 자체가 상승된 권한으로 실행되는지 여부와 관계없이 **공격자의 관점** — 권한 없는 표준 사용자 — 에서 이루어집니다. 관리자로 실행하면 도구의 가시성(ETW, 카나리, 서비스 트리거)이 높아지지만, 보호된 디렉터리가 쓰기 가능한 것처럼 보이게 하거나 획득한 권한을 부풀리지는 않습니다.

---

## 빠른 시작

`DLLHijackHunter.exe`를 다운로드하거나 빌드한 뒤(자체 포함; .NET 설치 불필요), **상승된** 프롬프트에서:

```powershell
# Passive, read-only triage: no file drops, no service/task starts
.\DLLHijackHunter.exe --profile safe

# Full static analysis without touching the system, JSON report
.\DLLHijackHunter.exe --profile aggressive --no-canary --no-etw -o report.json

# Static analysis + real-loader verification (writes probe DLLs transiently)
.\DLLHijackHunter.exe --profile aggressive --no-canary --no-etw --verify-load -o report.html

# Everything, including ETW and canary confirmation — lab / authorised targets only
.\DLLHijackHunter.exe --profile aggressive -o report.html

# Focus on one application
.\DLLHijackHunter.exe --target "C:\Program Files\MyApp\app.exe" --no-canary
```

> **안티바이러스:** 카나리 및 프로브 DLL은 서명되지 않았고 하이재킹 페이로드처럼 동작하므로 Microsoft Defender가 이를 격리할 수 있습니다. 이 도구는 이를 감지하여 해당 결과를 "하이재킹 불가"가 아닌 **불확정**으로 보고합니다. 테스트 머신에서는 확정적인 결과를 얻으려면 대상 디렉터리와 `%ProgramData%\DLLHijackHunter`를 제외하십시오.

---

## 작동 방식

```mermaid
flowchart TB
    subgraph S1["1 · Discovery"]
        direction LR
        EN["Launch points<br/>services · tasks · Run keys<br/>startup · COM · AutoElevate"] --> PE["PE analysis<br/>imports · delay loads<br/>manifest"] --> SO["Search order<br/>identity-aware PATH"]
        ETW["ETW runtime trace<br/>optional, elevated"]
    end
    subgraph S2["2 · Filter pipeline"]
        direction LR
        HG["Hard gates<br/>API sets · KnownDLLs<br/>writability"] --> SG["Soft gates<br/>manifest · privilege<br/>PPL · LoadLibraryEx"] --> DD["Dedup and<br/>profile filters"]
    end
    subgraph S3["3 · Verification (optional)"]
        direction LR
        LP["Load probe<br/>real Windows loader"] --> CN["Canary<br/>deploy, trigger, confirm"]
    end
    subgraph S4["4 · Output"]
        direction LR
        SC["Scoring and tiers"] --> AC["Attack chains"] --> RP["Console · JSON · HTML"]
    end
    S1 --> S2 --> S3 --> S4
```

| 단계 | 관리자 권한 필요 | 시스템 수정 |
|---|:---:|---|
| 정적 탐색 + 필터 | 아니요 (관리자는 더 많이 확인) | 아니요 |
| ETW 런타임 탐색 | **예** | DLL 로드를 유도하기 위해 자동 시작 서비스(최대 100개)를 **시작**하고 예약된 작업(최대 30개)을 실행 |
| 로드 프로브 (`--verify-load`) | 아니요 | 각 후보 위치에 무해한 프로브 DLL을 잠시 기록한 후 제거하고 원본이 있으면 복원 |
| 카나리 확인 | **예** | 카나리 DLL을 기록하고, 서비스를 중지/시작하고, 작업을 실행하고, COM 개체를 활성화한 후 정리 |

---

## 탐지 대상

### 하이재킹 유형

| 유형 | 의미 | 참고 |
|---|---|---|
| **팬텀(Phantom)** | DLL이 검색 경로 어디에도 존재하지 않음 | 바이너리가 검색하는 어느 위치에나 배치 가능 |
| **검색 순서** | 쓰기 가능한 디렉터리가 정당한 복사본보다 먼저 검색됨 | 쓰기 가능한 디렉터리의 DLL 덮어쓰기 포함 |
| **ENV PATH** | `PATH`의 쓰기 가능한 디렉터리에서 누락된 DLL을 검색 | 서비스는 **머신** PATH에 대해서만 평가됨 — 사용자 자신의 PATH 항목은 서비스가 절대 검색하지 않음 |
| **.local 리디렉션** | `<app>.exe.local\<dll>` 리디렉션 | **매니페스트가 없는** 실행 파일에 대해서만 보고됨 (또는 IFEO `DevOverrideEnable=1`인 경우); 그 외의 경우 로더는 `.local`을 무시하며, KnownDLLs는 절대 리디렉션하지 않음 |
| **사이드로드 (UAC)** | 자동 상승 EXE를 배치된 DLL 옆에 복사 | 매니페스트에 `<autoElevate>true</autoElevate>`가 있는 EXE에만 해당. 자동 상승은 신뢰할 수 있는 위치를 요구하므로 복사본이 해당 검사를 통과해야 함 (예: 모의 `C:\Windows \System32\` 폴더) |
| **AppInit DLLs** | `AppInit_DLLs`가 쓰기 가능한 DLL을 가리킴 | `user32.dll`을 로드하는 모든 프로세스에 로드됨 |
| **AppCert DLLs** | `AppCertDLLs`가 쓰기 가능한 DLL을 가리킴 | 모든 `CreateProcess`/`WinExec` 호출자에 로드됨 |

IFEO `Debugger` 및 `SilentProcessExit\MonitorProcess` 바이너리는 다른 실행 지점과 마찬가지로 열거되고 분석됩니다. CWD 기반 하이재킹은 현재 생성되지 않습니다.

### 대상이 실행되는 계정

올바른 ID는 권한 상승 판정과 영향 점수 모두를 좌우합니다:

- **서비스** — `ObjectName` (LocalSystem, Local Service, Network Service 또는 계정); svchost 서비스는 해당 `ServiceDll`도 분석합니다.
- **예약된 작업** — 작업 주체. `S-1-5-18`과 같은 SID 형식은 `NT AUTHORITY\SYSTEM`으로 매핑됨; 그룹 주체는 로그온한 구성원으로 실행됨 (*Administrators + 최고 권한*만 상승된 것으로 간주). `rundll32`, `cmd /c` 또는 `powershell -File`로 감싼 페이로드도 분석됩니다.
- **Run 키 / 시작 폴더** — 스캐너를 실행하는 계정뿐만 아니라 **로드된 모든 사용자 프로필**(`HKEY_USERS`)과 각 프로필의 시작 폴더에 대해 열거되며, 해당 사용자에게 귀속됨.
- **COM** — 아웃오브프로세스 서버는 `AppID` → `RunAs` / `LocalService`를 따름; 인프로세스 서버는 이를 로드하는 클라이언트로 실행됨.

### 지식 기반 및 PATH 무기화

- **[HijackLibs](https://hijacklibs.net/)** 데이터셋의 번들 스냅샷(약 700개 실행 파일에 걸친 약 590개 DLL, `Resources/hijacklibs.json`)이 교차 참조됩니다. 일치하면 신뢰도가 높아지고 참조가 연결됨; 일치하지 않으면 아무것도 아님. 파일을 `https://hijacklibs.net/api/hijacklibs.json`으로 교체하여 갱신할 수 있음. 데이터셋 © HijackLibs 프로젝트 및 기여자.
- **머신** PATH의 각 쓰기 가능한 디렉터리에 대해, 누락된 DLL을 PATH에서 검색하는 잘 알려진 SYSTEM 서비스(`IKEEXT → wlbsctrl.dll`, `Spooler → ualapi.dll`, `Schedule → WptsExtensions.dll`, `SessionEnv → tsmsisrv.dll`, `WlanSvc → wlanhlp.dll`)에 대한 후보가 생성됩니다.

---

## 오탐 줄이기

**하드 게이트** (후보가 제외됨):

- **API 세트** — 모든 `api-ms-*` / `ext-ms-*` 계약 이름은 검색 순서가 아니라 API set 스키마를 통해 확인됩니다.
- **KnownDLLs** — 레지스트리 시드 목록뿐 아니라 활성 `\KnownDlls` 및 `\KnownDlls32` 객체 디렉터리에서 읽으며, 항상 가장 먼저 매핑되는 `ntdll.dll`도 포함합니다.
- **공격자 기준 쓰기 가능성** — `Users`, `Authenticated Users`, `Everyone`, 또는 `INTERACTIVE`(및 `LOCAL SERVICE`와 같은 비권한 서비스 계정)가 중요한 권한을 보유한 경우에만 해당 위치가 인정됩니다. DLL 드롭의 경우 **파일 생성**, `.local` 디렉터리의 경우 **폴더 생성**이 해당됩니다. 이는 스캐너 자체의 토큰과 무관하게 ACL에서 계산되므로, 권한 상승된 스캔에서도 `System32`, `Program Files`, 또는 드라이브 루트(`C:\`)를 쓰기 가능한 것으로 보지 않습니다.

**소프트 게이트** (신뢰도가 조정되며, 그 이유는 발견 항목의 노트에 기록됩니다):

- DLL의 **매니페스트 / WinSxS** 바인딩.
- **권한 차이** — **표준 사용자 공격자**를 기준으로 측정합니다. SYSTEM, LOCAL/NETWORK SERVICE, 그리고 UAC로 권한 상승된 대상은 권한 상승으로 간주하며, 동일 권한 대상은 지속성 / 방어 회피 발견 항목으로 유지합니다.
- **LoadLibraryEx 완화책** — `SetDefaultDllDirectories`, `AddDllDirectory`, `SetDllDirectory` 임포트.
- **보호된 프로세스** — 알려진 PPL 바이너리, SCM 구성에서 `LaunchProtected`가 설정된 서비스(최신 Windows 및 타사 AV/EDR 서비스 포함), 그리고 `FORCE_INTEGRITY` 이미지.
- **오류 처리된 선택적 로드.**

게이트 평가에 실패하더라도 후보에 불이익은 주어지지 않지만, 실패 사실은 숨기지 않고 해당 노트와 로그에 기록됩니다.

---

## 검증: 로드 프로브 및 카나리

### 로드 프로브 (`--verify-load`)

Phantom, 검색 순서, 및 사이드로드 후보의 경우, 무해한 프로브 DLL이 쓰기 가능한 위치에 복사되고 단기 실행 자식 프로세스가 **실제 Windows 로더**에게 이름 확인을 요청합니다:

| 결과 | 의미 | 효과 |
|---|---|---|
| **Wins** | 로더가 쓰기 가능한 위치를 선택함 | 검색 순서 입증됨; 발견 항목이 **High**에 도달할 수 있음 |
| **LosesToProtected** | KnownDLL, System32, 또는 SxS 복사본이 대신 선택됨 | 거짓 양성 가능성 높음; 신뢰도 −40 |
| **NotResolved** | 이름이 확인되지 않음; 로더 오류가 기록됨 | 결론 없음 |
| **Error** | 프로브를 실행할 수 없음 — 프로브가 **백신에 의해 격리된** 경우 포함 | 결론 없음, 불이익 없음 |
| **Skipped** | `.local`, PATH, AppInit/AppCert는 다른 메커니즘을 사용함 | — |

프로브는 해당 위치가 실제로 어디에 있는지를 모델링합니다. 바이너리의 **자체 디렉터리**에 있는 DLL은 (로더가 그러하듯) System32보다 먼저 테스트되며, 다른 위치는 상황에 따라 고전적 또는 현대적 검색 순서를 사용합니다. 표준 사용자로 실행되며, 모든 프로브는 제거되고 원본 파일은 복원됩니다.

### 카나리 확인

```mermaid
sequenceDiagram
    autonumber
    participant H as DLLHijackHunter
    participant P as Hijack position
    participant T as Service / task / COM
    Note over H: Pick canary for target bitness,<br/>or build an export-forwarding proxy
    H->>P: Back up original DLL, write canary
    H->>T: sc start / schtasks /run / COM activation
    T->>P: Load DLL by name (search order)
    Note over P,T: Canary DllMain records user,<br/>integrity level and SeDebug
    T-->>H: Confirmation file written
    Note over H: Finding marked CONFIRMED
    H->>P: Remove canary, restore original DLL
    H->>T: Restore original service state
```

- **컴파일러가 필요하지 않습니다.** 미리 컴파일된 x64/x86 카나리가 내장되어 있으며, 하이재킹된 DLL에 익스포트가 있을 경우 런타임에 PE 수술을 통해 익스포트 포워딩 프록시가 합성되어 호스트가 계속 작동합니다.
- **자기 위치 탐지.** 카나리는 자신의 로드 경로에서 확인 경로(`%ProgramData%\DLLHijackHunter\canary_<hash>.confirm`)를 도출하므로, 하나의 바이너리가 모든 후보에 사용됩니다.
- **페이로드 없음.** 누가 자신을 로드했는지만 기록합니다. 소스: `src/DLLHijackHunter/Resources/canary_src.c` (`Resources/build_canary.bat`로 재빌드하며, MSVC는 이 경우에만 필요합니다).
- **결과:** `Fired`, `Timeout` (트리거되었으나 로드되지 않음), `Failed` (트리거/배포 불가), `Blocked` (백신에 의해 카나리가 격리됨 — 불확정), `NotTested` (Run 키, Startup, UAC 우회, 수동 대상은 로그온/재부팅 필요).
- **COM 주의사항:** 인프로세스 COM 객체는 스캐너가 실행한 클라이언트에서 활성화되므로, 발동된 카나리는 로드를 증명하지만 그 신원은 스캐너의 것입니다 — 이는 *호출자 컨텍스트*로 기록되며 영향도를 부풀리지 않습니다.

프록시 카나리는 서수 전용 익스포트, 데코레이션된 익스포트 이름, 또는 실제 DLL이 상주해야 하는 호스트의 경우 여전히 불확정일 수 있습니다. 불확정 카나리가 하이재킹이 불가능하다는 것을 의미하지는 **않습니다**.

---

## 점수 산정, 등급, 공격 체인

각 발견 사항은 **신뢰도**(필터, 프로브, 카나리, 지식 베이스에서 산출)와 **영향도** 점수(획득 권한, 트리거 신뢰성, 은밀성, 재부팅 지속성)를 부여받아 0–10의 최종 점수로 합산됩니다.

| 등급 | 요건 |
|---|---|
| **Confirmed** | 카나리 발동 |
| **High** | ≥ 80% **그리고** 증명 신호: 프로브 성공, ETW 관찰, 또는 HijackLibs 일치 |
| **Medium** | ≥ 50% (검증되지 않은 정적 발견 사항은 여기로 상한이 제한되며 `Static-only`로 표시됨) |
| **Low** | ≥ 20% |
| **Informational** | 20% 미만이지만 프로파일의 `--min-confidence` 초과 |

**공격 체인**은 발견 사항들을 서사로 연관시킵니다:

- **직접 경로 (User → SYSTEM)** — 표준 사용자가 심을 수 있는 모든 SYSTEM 발견 사항.
- **사다리 (User → Admin → SYSTEM)** — 직접 경로가 존재하지 않을 때만 표시되는 무음 UAC 우회.
- **장기 전략 (지속성)** — 최적의 자동 시작, 비서비스 발견 사항 (Run 키, Startup, 작업).

---

## 사용법 참조

```text
-p, --profile <name>          aggressive | strict | safe | redteam | uac-bypass   [default: aggressive]
-o, --output <path>           Write a report; format from extension (.json / .html / .htm)
-f, --format <format>         console | json | html                              [default: console]
-t, --target <target>         Binary path, directory, or file name (partial match). Scopes discovery
                              and ETW to that target and skips system-wide PATH weaponisation.
    --min-confidence <0-100>  Override the profile's threshold (only when explicitly passed)
    --no-canary               Disable canary confirmation
    --no-etw                  Disable ETW runtime discovery (no service/task starts)
    --verify-load             Real-loader verification of search order (transient probe DLLs)
    --confirmed-only          Report only canary-confirmed findings
    --lpe-only                Ignore System32 / Program Files / Windows positions
    --canary-settle <sec>     Seconds to wait for a canary to fire after triggering
    --log-file <path>         Write a diagnostic log (enumeration, filter, and probe failures)
-v, --verbose                 Verbose console output
```

### 프로필

| 프로필 | 목적 | 카나리 | ETW | AutoElevate | COM | 동일 권한 발견 항목 | PPL 발견 항목 | 최소 신뢰도 |
|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| **aggressive** | 전체 감사, 실습 환경 | ✅ | ✅ | ✅ | ✅ | 유지 | 유지 | 15% |
| **strict** | 고신뢰도 에스컬레이션만 | ✅ | ✅ | — | — | 제외 | 제외 | 80% |
| **safe** | 프로덕션, 읽기 전용 | — | — | — | — | 유지 | 제외 | 50% |
| **redteam** | 확인된 에스컬레이션만 (`--confirmed-only` 포함) | ✅ | ✅ | — | ✅ | 제외 | 제외 | 50% |
| **uac-bypass** | 자동 상승 벡터 | — | — | ✅ | — | 제외 | 제외 | 20% |

### 출력

- **콘솔** (기본값): 요약, 등급 차트, 발견 항목, 공격 체인. `--output`을 전달하지 않는 한 디스크에 아무것도 기록되지 않습니다 (`.json`/`.html`이 아닌 경로는 발견 항목이 있을 때 JSON 보고서를 받습니다).
- **JSON / HTML**: 참고 사항, 필터 결과, 로드 프로브 및 카나리 결과, 지식 베이스 참조, 공격 체인을 포함한 전체 발견 항목. 아무것도 발견되지 않아도 보고서가 작성되므로, 빈 파일이 스캔 실패를 의미하는 경우는 없습니다.

### 종료 코드

| 코드 | 의미 |
|---|---|
| `0` | 스캔 완료 (발견 항목 유무와 무관) |
| `1` | 처리되지 않은 오류 |
| `3` | `--confirmed-only` (또는 `redteam` 프로필)가 요청되었으나 카나리를 실행할 수 없음 — 권한이 상승되지 않았거나 카나리가 비활성화됨. 거짓 "발견 항목 0개"를 보고하는 대신 거부됨. |

---

## 안전 및 운영 영향

DLLHijackHunter는 소유한 시스템 또는 평가가 명시적으로 승인된 시스템에서만 사용하십시오.

- `--profile safe` (또는 `--no-canary --no-etw`)는 **읽기 전용**입니다 — 프로덕션 트리아지에 적합합니다.
- **ETW 모드**는 카나리 없이도 DLL 로드를 유발하기 위해 서비스를 시작하고 예약된 작업을 실행합니다.
- **카나리 모드**는 DLL을 교체하고(백업/복원 포함), 서비스를 중지 및 재시작하며, 작업을 실행하고 COM 개체를 활성화합니다. 프록시 카나리가 로드된 동안 취약한 서비스가 오작동할 수 있습니다.
- **`--verify-load`**는 프로브 DLL을 쓰기 가능한 위치에 일시적으로 기록합니다.
- 서명되지 않은 카나리/프로브 DLL은 백신에 의해 격리될 수 있으며, 이러한 결과는 "취약하지 않음"이 아니라 판정 불가(`Blocked` / 프로브 `Error`)로 보고됩니다.

---

## 소스에서 빌드

요구 사항: .NET 8 SDK (`net10.0-windows` 대상도 빌드하는 경우 .NET 10 SDK). Linux/macOS에서 빌드하려면 `-p:EnableWindowsTargeting=true`를 사용하면 됩니다.

```powershell
git clone https://github.com/projectmerai/DLLHijackHunter.git
cd DLLHijackHunter

# Self-contained single-file executable (no .NET runtime needed on the target)
dotnet publish src/DLLHijackHunter/DLLHijackHunter.csproj `
    -c Release -f net8.0-windows -r win-x64 --self-contained `
    -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true `
    -o ./publish
```

이 프로젝트는 `net8.0-windows`와 `net10.0-windows`를 멀티 타기팅하므로, `dotnet publish`에는 명시적인 `-f`가 필요합니다.

---

## 테스트 랩 (HijackRange)

`HijackRange/`에는 데모 및 회귀 테스트를 위한 의도적으로 취약한 랩이 포함되어 있습니다:

- **Alpha** — 바이너리 디렉터리가 `BUILTIN\Users`에 의해 쓰기 가능한 SYSTEM 서비스입니다.
- **Beta** — 동일한 패턴의 SYSTEM 예약 작업입니다.
- **Gamma** — 시스템 PATH에 추가된 쓰기 가능한 디렉터리입니다.

`HijackRange\build-all.bat`로 빌드하고, `HijackRange\setup.ps1`(관리자 권한)로 배포하며, `HijackRange\teardown.ps1`로 제거합니다. `HijackRange/demo-script.md`를 참조하세요. 일회용 VM을 사용하세요.

---

## 알려진 제한 사항

- **정적 검색 순서는 근사치입니다.** 런타임 동작(`LoadLibraryEx` 플래그, `SetDefaultDllDirectories`, 매니페스트)은 임포트에서 추론됩니다. 증명을 위해서는 `--verify-load` 또는 카나리를 사용하세요.
- **ETW**는 추적 기간(기본 120초) 동안 발생한 프로세스와 로드만 확인합니다.
- **지속성**("재부팅 후에도 유지")은 재부팅 테스트가 아닌 자동 시작 구성에서 파생됩니다.
- **Run 키 / Startup / UAC 사이드로드** 결과는 자동으로 카나리 확인이 불가능합니다.
- **카나리 및 프로브 DLL은 서명되지 않았으므로** 안티바이러스 또는 애플리케이션 제어 정책에 의해 차단될 수 있습니다.

---

## 비교

| 기능 | **DLLHijackHunter** | Robber | DLLSpy | WinPEAS | Procmon |
|---|:---:|:---:|:---:|:---:|:---:|
| 자동 탐지 | ✅ | ✅ | ✅ | ✅ | ❌ |
| 팬텀 DLL 탐지 | ✅ | ❌ | ✅ | ❌ | ✅ |
| 검색 순서 분석 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 공격자 기준 ACL 검사 | ✅ | 부분적 | ❌ | 기본 | ❌ |
| ETW 런타임 모니터링 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 실제 로더 검증 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 카나리 실행 증명 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 권한 상승 분석 | ✅ | ❌ | ❌ | ❌ | ❌ |
| UAC 우회 탐지 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 런타임 프록시 DLL 생성 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 신뢰도 점수 및 공격 체인 | ✅ | ❌ | ❌ | ❌ | ❌ |
| HijackLibs 상관 분석 | ✅ | ❌ | ❌ | ❌ | ❌ |
| HTML / JSON 보고서 | ✅ | ❌ | ❌ | TXT | ❌ |
| 자체 포함 바이너리 | ✅ | ❌ | ❌ | ✅ | ❌ |

---

## 라이선스

MIT

## 크레딧

**[ProjectMerai](https://projectmerai.com)**가 제작했습니다. 지식 기반 데이터는 [HijackLibs](https://hijacklibs.net/) 프로젝트에서 제공됩니다.
도구 다운로드