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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Obfusk8 — Obfusk8: 경량 난독화 라이브러리, C++17 기반 / Header Only, 윈도우 바이너리용 | Kitploit
도구/GitHubGitHub/x86byte/obfusk8
Exploit FrameworksReverse EngineeringShellcodeCryptographyPenetration TestingRed TeamingPayload Development
GitHubx86byte/obfusk8

Obfusk8

Obfusk8: 경량 난독화 라이브러리, C++17 기반 / Header Only, 윈도우 바이너리용

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Obfusk8: C++17 기반 난독화 라이브러리

Obfusk8는 경량 헤더 전용 C++17 라이브러리로, 애플리케이션의 난독화를 크게 향상시켜 리버스 엔지니어링을 훨씬 더 어렵게 만들도록 설계되었습니다. 코드의 로직과 데이터를 보호하기 위해 다양한 컴파일 타임 및 런타임 기술을 사용합니다.

banner


목차

  1. 핵심 난독화 전략
  2. 의존성
  3. 시각화
  4. 엔진 분석 및 탐지 프로필
  5. 구조적 및 포렌식 특성
  6. 사용법
  7. 빌드
  8. 데모
  9. 기여 및 피드백

핵심 난독화 전략

1. main 함수 래핑 (_main 매크로)

애플리케이션의 진입점(main)은 복잡한 다계층 난독화 엔진으로 변환됩니다.

  • 가상 머신(VM) 실행 (개념적): 실제 main_body 코드가 실행되기 전에 미니 VM(시뮬레이션된 CPU)이 "암호화된" 명령어 시퀀스를 실행합니다. 이는 실제 진입점과 초기 작업을 숨깁니다. VM 상태(레지스터, 프로그램 카운터, 디스패치 키)는 런타임 무작위 값으로 초기화됩니다.
  • 간접 제어 흐름 평탄화(ICFF): _main 매크로 내 중요 루프(프롤로그와 에필로그 모두)는 복잡한 상태 기계로 변환됩니다. 제어 흐름은 직접적이지 않으며, 강력하게 "암호화된" 상태 변수에 의해 결정됩니다. 이러한 상태 변수의 인코딩/디코딩 키는 동적이며, VM 상태, 루프 카운터, 컴파일 타임 무작위성(__COUNTER__, __LINE__, __TIME__ 등) 및 전역 불투명 시드에서 파생됩니다. 이로 인해 제어 흐름의 정적 분석이 매우 어려워집니다.
    • 두 개의 개별 ICFF 엔진(obf_icff_ns_dcff 및 obf_icff_ns_epd)이 서로 다른 상태 전이 로직 및 키 생성과 함께 사용되어 분석을 더욱 복잡하게 만듭니다.
  • 가짜 제어 흐름(OBF_BOGUS_FLOW_* 매크로): _main 전체에 수많은 오해를 유발하는 점프 패턴과 복잡한 조건부 구조가 주입됩니다. 이는 불투명 조건문(항상 true 또는 false로 평가되지만 계산 비용이 많이 들거나 정적으로 결정하기 어려운 조건)과 결합된 goto 문을 사용합니다. 이는 디스어셈블러와 디컴파일러에게 잘못된 경로의 미로를 만듭니다.
    • 다양하고 복잡한 가짜 흐름을 생성하기 위해 OBF_BOGUS_FLOW_LABYRINTH, , , , 및 을 포함합니다.

2. 가상 ISA 엔진 (obf_vm_engine)

_main 매크로 난독화의 핵심 구성 요소:

  • 맞춤형 미니 CPU 시뮬레이션: 휘발성 레지스터(r0, r1, r2), 프로그램 카운터(pc) 및 dispatch_key를 갖춘 CPU를 시뮬레이션합니다. 사용자 정의 "명령어"(핸들러)를 실행합니다.
  • 난독화된 명령어: VM 명령어 핸들러는 혼합 부울 산술(MBA) 및 비트 조작을 사용하여 강력하게 위장된 작업을 수행합니다. 핸들러에는 산술, 비트 논리, 키 맹글링, 정크 시퀀스, 조건부 업데이트, 메모리 시뮬레이션 및 PC 맹글링이 포함됩니다.
  • 동적 디스패치: 다음 VM 명령어 핸들러의 선택은 여러 디스패치 메커니즘을 통해 무작위화됩니다.
    • 레지스터 기반 디스패치 (reg_dispatch_idx).
    • 메모리 테이블 기반 디스패치 (스크램블된 함수 포인터 테이블 get_mem_dispatch_table).
    • 혼합 디스패치 (mixed_dispatch_idx). dispatch_key는 지속적으로 변형되어 실행되는 핸들러 시퀀스를 매우 예측 불가능하게 만듭니다.
  • 핸들러 테이블 변이: VM 명령어 핸들러 테이블(vm_handler_table) 자체가 _main 프롤로그 및 에필로그 내에서 런타임에 변형되어 VM의 동작을 더욱 모호하게 만듭니다.

3. 컴파일 타임 문자열 암호화 (AES8.hpp의 OBFUSCATE_STRING)

  • 숨겨진 문자열: 수정된 AES 암호를 사용하여 컴파일 타임에 모든 문자열 리터럴을 암호화합니다.
  • 동적 키: 암호화 키는 문자열 인스턴스별로 고유하며, 문자열 내용, 파일 위치(__FILE__, __LINE__) 및 빌드 시간(__DATE__, __TIME__)에서 파생됩니다.
  • 적시 복호화: 문자열은 런타임에 접근될 때만 스택에서 복호화되어 메모리에서의 평문 수명을 최소화합니다.
  • (선택 사항) PE 섹션 미끼: 일반적인 패커 서명을 모방하도록 설계된 사용자 정의 PE 섹션에 암호화된 문자열을 저장하여 분석가를 오도할 수 있습니다(AES8.hpp의 MSVC 특정 기능).

4. 은밀한 Windows API 호출 (Resolve8.hpp의 STEALTH_API_OBFSTR / STEALTH_API_OBF)

  • IAT 은닉: 가져오기 주소 테이블(IAT)에 Windows API에 대한 직접적이고 쉽게 식별 가능한 항목을 남기지 않습니다.
  • PEB 기반 해석: 런타임에 PEB(프로세스 환경 블록) 데이터 구조를 직접 파싱하여 로드된 DLL의 기본 주소와 API 함수의 주소를 동적으로 찾습니다. 이 메커니즘으로 아직 해석되지 않은 경우 표준 GetModuleHandle 및 GetProcAddress를 우회하여 초기 해석을 수행합니다.
  • 해시된 이름: 조회를 위해 DLL 및 API 이름의 컴파일 타임 해싱(사용자 정의 알고리즘 CT_HASH)을 사용합니다. 이를 통해 이러한 매크로를 사용할 때 DLL 및 API 이름의 평문이 바이너리의 가져오기 관련 데이터 또는 문자열 테이블에 나타나는 것을 방지합니다.

5. 간접 시스템 콜 엔진 (K8_SYSCALL)

Obfusk8는 이제 사용자 모드 후크(EDR/AV) 및 정적 분석 검사를 우회하기 위한 최첨단 간접 시스템 콜 메커니즘을 통합합니다.

  • "정렬 모자" 해석: 엔진은 종종 후킹되거나 모니터링되는 ntdll.dll의 .text 섹션을 읽는 대신 내보내기 디렉터리를 구문 분석합니다. Zw로 시작하는 함수를 필터링하고 메모리 주소별로 정렬한 후 인덱스를 기반으로 시스템 콜 번호(SSN)를 추론합니다. 이를 통해 실행 코드를 전혀 건드리지 않고 SSN을 해석할 수 있습니다.
  • 측면 가젯 실행: 엔진은 자체 바이너리에 syscall(0F 05) 명령어를 포함하지 않습니다. 대신 런타임에 ntdll.dll 메모리 내에서 유효한 syscall; ret 가젯을 찾습니다.
  • 깨끗한 호출 스택: ntdll 가젯으로 점프하는 사용자 정의 썽크가 할당됩니다. OS 커널 및 보안 센서에 대해 시스템 콜이 ntdll.dll에서 합법적으로 발생한 것처럼 보여 깨끗한 호출 스택을 유지합니다.
  • 사용법: NtOpenProcess 대신 K8_SYSCALL("ZwOpenProcess", ...)를 사용하기만 하면 됩니다.

6. 메서드 기반 난독화 (OBF_METHOD)

Obfusk8는 이제 메서드 기반 난독화를 통해 바이너리 보안에 대한 세밀한 제어를 제공합니다. 전체 프로젝트를 난독화하는 대신(성능에 영향을 줄 수 있음) 특정 고가치 함수나 클래스 메서드를 선택적으로 보호할 수 있습니다.


사용 방법

  1. 패스 포함
    프로젝트에 메서드 난독화 로직을 포함해야 합니다: ```cpp #include "../transform/PASSES/obf_cmethods.cxx"
    root@kitploit:~
  2. 매크로 구문
    OBF_METHOD 매크로를 사용하여 메서드를 정의하십시오: ```cpp OBF_METHOD(ret_type, func_name, params, method_body)
    root@kitploit:~
  • ret_type: 함수의 반환 타입 (예: bool, int, void*).
  • func_name: 메서드의 이름.
  • params: 함수 매개변수 (괄호로 묶어야 함).
  • method_body: { }로 묶인 함수의 실제 로직.

예제: 일반 메서드 vs 난독화된 메서드

이 예제에서 PrintStatus는 일반적인 읽기 가능한 함수입니다. Obfusk8_PrintStatus는 Obfusk8에 의해 보호됩니다.```cpp #include "../Instrumentation/materialization/state/Obfusk8Core.hpp" #include "../Instrumentation/materialization/transform/K8_UTILS/k8_utils.hpp" // for the printf_, u can change the printf_ with anything else...

class Obfusk8_C { public: // standard method which is visible to reverse engineers void PrintStatus(void) { printf_("method\n"); }

root@kitploit:~
// Obfuscated method protected by Obfusk8
OBF_METHOD_(void, Obfusk8_PrintStatus, (void),
{
    printf_("same method but Obfuscated\n");
})

};

_main({ Obfusk8_C *pp = new Obfusk8_C; pp->PrintStatus(); pp->Obfusk8_PrintStatus(); delete pp; })

root@kitploit:~
*여기에서 전체 예제를 확인할 수 있습니다: [obfusk8_methods.cpp](https://github.com/x86byte/Obfusk8/blob/main/Obfusk8/EXAMPLES/obfusk8_methods.cpp)*

---
### 6. 내장 스텔스 기능이 있는 API 추상화 클래스
Obfusk8은 일반적인 Windows API 세트를 캡슐화하는 헬퍼 클래스를 제공합니다. 이 클래스들은 생성 시 자동으로 스텔스 API 해석 메커니즘(`STEALTH_API_OBFSTR`)을 사용하여, 명백한 정적 임포트 흔적을 남기지 않고 기본 Windows 함수들이 해석되도록 보장합니다.

   - **`K8_ProcessManipulationAPIs::ProcessAPI` (`k8_ProcessManipulationAPIs.hpp`)**:
     *   프로세스 조작을 위한 Windows API에 편리하게 접근할 수 있도록 제공합니다. 예: `OpenProcess`, `TerminateProcess`, `CreateRemoteThread`, `VirtualAllocEx`, `WriteProcessMemory`, `ReadProcessMemory`, `GetProcAddress`, `GetModuleHandleA`, `NtQueryInformationProcess`, `SuspendThread`, `GetCurrentProcessId`.
     *   **자동 스텔스 해석**: `kernel32.dll` 및 `ntdll.dll`에서 필요한 함수들을 스텔스 방식으로 해석합니다.
     *   정적 분석 공격 표면을 줄이면서 프로세스 관련 작업 수행을 단순화합니다. `NtQueryInformationProcess` 사용을 위한 `PROCESSINFOCLASS` 열거형을 포함합니다.

   - **`k8_CryptographyAPIs::CryptographyAPI` (`k8_CryptographyAPIs.hpp`)**:
     *   일반적인 Windows Cryptography API (CAPI/CNG) 함수에 대한 래퍼를 제공합니다. (실제 파일의 구현에 따라 기능이 결정됩니다. 제공된 코드 조각은 중복되었습니다. 일반적인 CAPI 함수인 `CryptAcquireContextA`, `CryptCreateHash` 등을 가정합니다.)
     *   **자동 스텔스 해석**: 주로 `advapi32.dll` (및 코어 함수용 `kernel32.dll`)에서 필요한 함수들을 스텔스 방식으로 해석합니다.
     *   암호화 API 사용 노출을 최소화하면서 암호화 작업을 용이하게 합니다.

   - **`k8_NetworkingAPIs::NetworkingAPI` (`k8_NetworkingAPIs.hpp`)**:
     *   `wininet.dll` (예: `InternetOpenA`, `HttpOpenRequestA`, `FtpPutFileA`), `urlmon.dll` (예: `URLDownloadToFileA`), `ws2_32.dll` (예: `socket`, `connect`, `WSAStartup`), `shell32.dll` (예: `ShellExecuteA`), `dnsapi.dll` (예: `DnsQuery_A`), `mpr.dll` (예: `WNetOpenEnumA`) 등 다양한 네트워킹 함수에 쉽게 접근할 수 있도록 제공합니다.
     *   **자동 스텔스 해석**: 생성자에서 `STEALTH_API_OBFSTR` 및 `OBFUSCATE_STRING`을 사용하여 각 DLL(및 `kernel32.dll`의 `LoadLibraryA`/`GetLastError`)에서 필요한 모든 함수들을 명백한 임포트 흔적을 남기지 않고 해석합니다.
     *   난독화된 네트워크 요청 및 기타 네트워크 관련 작업을 간편하게 수행할 수 있도록 합니다.

   - **`RegistryAPIs::RegistryAPI` (`k8_RegistryAPIs.hpp`)**:
     *   `RegSetValueExA`, `RegCreateKeyExA`, `RegOpenKeyExA`, `RegQueryValueExA`, `RegCloseKey` 등 일반적으로 사용되는 Windows 레지스트리 함수를 래핑합니다.
     *   **자동 스텔스 해석**: 생성 시 `advapi32.dll` (및 `kernel32.dll`)에서 함수들을 스텔스 방식으로 해석합니다.
     *   추적 가능성이 낮은 API 호출로 레지스트리 작업을 수행하는 데 도움을 줍니다.

### 7. 핵심 난독화 기본 요소 (`Obfusk8Core.hpp`의 매크로들)
다음은 라이브러리 전체, 특히 `_main` 매크로 및 VM 엔진에서 광범위하게 사용되는 구성 요소입니다.
*   **혼합 부울-산술 (MBA)**: 간단한 수학 및 논리 연산(ADD, SUB, XOR, NOT, MUL)을 복잡하지만 동등한 비트 연산 및 산술 공식의 시퀀스로 변환합니다(예: `OBF_MBA_ADD`, `OBF_MBA_XOR`). 이러한 변환은 디컴파일러가 원래 형태로 단순화하기 매우 어렵도록 설계되었습니다.
*   **불투명 조건문**: 조건이 항상 true로 평가되는(예: `OBF_OPAQUE_PREDICATE_TRUE_1`) 또는 항상 false로 평가되는(예: `OBF_OPAQUE_PREDICATE_FALSE_1`) 조건부 분기를 삽입합니다. 이러한 조건은 `__COUNTER__`, `__LINE__`, `__TIME__` 및 `_obf_global_opaque_seed`를 포함하는 복잡한 정적 평가가 어려운 표현식으로 구성됩니다. 이는 오해를 유발하는 코드 경로를 만들고 데드 코드를 보호하거나 특정 실행 흐름을 강제하는 데 사용될 수 있습니다.
*   **정크 코드 삽입**:
    *   `OBF_CALL_ANY_LOCAL_JUNK`: `obf_junk_ns`에 정의된 여러 작고 무작위화된 정크 함수 중 하나를 호출합니다. 이러한 함수는 사소한 휘발성 연산을 수행하며 컴파일 타임에 무작위로 선택됩니다. 이들의 목적은 코드 엔트로피를 높이고, 단순한 코드 패턴을 깨뜨리며, 잠재적으로 시그니처 기반 탐지 또는 분석 도구를 오해하게 하는 것입니다.
    *   `NOP()`: 최적화 프로그램에 의한 쉬운 제거를 방지하고 전역 시드를 미묘하게 수정하도록 설계된 휘발성 연산을 삽입하는 매크로입니다.
*   **역어셈블리 및 역분석 방지 트릭**:
    *   **난독화된 점프 (`OBF_JUMP_*` 매크로)**: 조건 또는 대상이 난독화된 `goto` 문을 생성하며, 종종 불투명 조건문이나 MBA에 의존합니다.
    *   **난독화된 상태 전이 (`OBF_SET_NEXT_STATE_*` 매크로)**: ICFF에서 사용되며, 이러한 매크로는 난독화된 점프와 유사한 난독화 기술을 사용하여 평탄화된 제어 흐름 디스패처의 다음 상태 변수를 설정합니다.
    *   **스택 조작 (`OBF_STACK_ALLOC_MANIP`, `OBF_FAKE_PROLOGUE_MANIP`)**: 스택에 가변 크기 청크를 할당하고 이에 대한 가짜 조작을 수행합니다. 가짜 프롤로그는 스택 분석을 혼란스럽게 하려고 시도합니다.
    *   **난독화된 함수 호출 (`OBF_CALL_VIA_OBF_PTR`)**: 함수 포인터가 사용 전후에 동적 키로 XOR되어 실제 호출 대상을 난독화합니다.
    *   `K8_ASSUME(0)`: 데드 코드 경로에서 MSVC 컴파일러에 해당 경로에 도달할 수 없음을 암시하는 데 사용되며, 만약 패치로 인해 어시션이 위반될 경우 분석을 더욱 혼란스럽게 할 수 있는 다른 최적화 또는 코드 생성을 허용할 수 있습니다.

### 의존성

Obfusk8 라이브러리는 모듈식입니다. 핵심 기능은 다음에 의존합니다.

- `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp`: (이 파일) 주요 난독화 매크로 및 기본 요소를 조율하고 제공하는 중앙 헤더입니다.
- `Obfusk8/Instrumentation/materialization/transform/AES8.hpp`: AES 기반 컴파일 타임 문자열 암호화 및 선택적 PE 섹션 조작 기능을 제공합니다.
- `Obfusk8/Instrumentation/materialization/transform/Resolve8.hpp`: PEB 기반 스텔스 Windows API 해석을 구현합니다.
* `Obfusk8/Instrumentation/materialization/transform/k8_indsys.hpp`: **간접 시스템 콜 엔진**을 조율합니다. 전환 스텁의 수명 주기를 관리하고 측면 메모리 가젯을 통해 시스템 콜을 실행하기 위한 인터페이스를 제공합니다.
* `Obfusk8/Instrumentation/materialization/transform/getpeb8.hpp`: 초기 부트스트랩 및 **PEB 검색**을 용이하게 합니다. 사용자 정의 해싱 로직, 네이티브 구조체 정의, SSN 추론을 위한 "Sorting Hat" 알고리즘을 포함합니다. 모든 모듈 열거 작업의 저수준 기반 역할을 합니다.
선택적 헬퍼 API 클래스는 별도의 헤더에 제공되며, 일반적으로 하위 디렉토리에 있습니다:
- `k8_ProcessManipulationAPIs/k8_ProcessManipulationAPIs.hpp`: 스텔스 프로세스 조작 API용.
- `k8_CryptographyAPIs/k8_CryptographyAPIs.hpp`: 스텔스 암호화 API용.
- `k8_NetworkingAPIs/k8_NetworkingAPIs.hpp`: 스텔스 네트워킹 API용.
- `k8_RegistryAPIs/k8_RegistryAPIs.hpp`: 스텔스 레지스트리 API용.

### 시각화

  *   **ida graph**:
    
      ![image](https://assets.kitploit.com/production/public/readmes/8984/3e59704c1c37835ddc2e47faf69914ba1fb63943fcd37a983f5690bcc4b4e373.png)
     
  *   **ida pro의 일부 청크**:
    
      ![image](https://assets.kitploit.com/production/public/readmes/8984/5c24307f490de40a07f88ca20821999c19912088d3047ca9446a84dfda2d0ec7.png)
      ![image](https://assets.kitploit.com/production/public/readmes/8984/edd0c5deae9d9d69006ca4bb1cd0cc0d2ba3e9794ac242460028fe438388c338.png)
      ![image](https://assets.kitploit.com/production/public/readmes/8984/341057315e4d3ea12c920df05ce3e6bcd13ecbc86386ffc3265e80b34f3bdcee.png)
    
  *   **Detect It Easy 시그니처 결과**:
    
      ![image](https://assets.kitploit.com/production/public/readmes/8984/007b2a1139fc33a9ff82675e10c8fe99f6be7b1d012ce773a5b7464db6b299ab.png)

  *   **VirusTotal의 크라우드소싱 YARA 규칙**:

      ![yararules](https://assets.kitploit.com/production/public/readmes/8984/b168f882e1f945399908ab0cf4638a151e6991f98ec03460d305c1eca0b482cd.png)

  *   **메모리 맵 (die에서)**:

      ![map](https://assets.kitploit.com/production/public/readmes/8984/75d11fce1656cc1944251d0e46f14c88ed9b8684acf5d1230c53f4d7385aaaf8.png)
  
  *   **섹션**:

      ![sections](https://assets.kitploit.com/production/public/readmes/8984/bdb9bef4c155c4af8a73656ab5bdba533cf3283b7b729d9fa42fbb125e208978.png)

  *   **바운드 파일**:

      ![bfiles](https://assets.kitploit.com/production/public/readmes/8984/fe8cf0d963706cdd0fc532144e0e9b118daad7f3ca6d53705b4691b5f8c0aba2.png)

### 엔진 분석 및 탐지 프로필

Obfusk8은 정적 시그니처 기반 탐지 엔진을 우선시하여 우회하도록 설계되었습니다. 업계 표준 벤더에 대한 테스트 결과, 핵심 난독화 로직은 주요 보안 제품에서 탐지되지 않습니다:

*   **Microsoft Defender**: 탐지되지 않음
*   **Kaspersky**: 탐지되지 않음
*   **ESET-NOD32**: 탐지되지 않음
*   **BitDefender**: 탐지되지 않음

정적 시그니처는 우회되지만, 특정 차세대 AV 및 EDR(예: CrowdStrike 또는 Symantec)은 "suspicious" 또는 "high Confidence Malicious"로 레이블이 지정된 휴리스틱 플래그를 생성할 수 있습니다. 이러한 탐지는 일반적으로 식별 가능한 악성 코드보다는 높은 아키텍처 복잡성과 사용자 지정 PE 섹션의 존재로 인해 발생합니다.

### 구조 및 포렌식 특성

*   **엔트로피 관리**: 현재 구현은 약 6.2의 전체 엔트로피를 생성합니다. 이는 로직을 난독화할 만큼 충분히 높으면서도 일반적인 "패킹된 파일" 경보(엔트로피 7.0 이상)를 피할 수 있도록 의도적으로 균형을 맞춘 것입니다.
*   **섹션 사용자 정의**: 기본 구성에는 23개의 PE 섹션이 포함되어 있으며, 그 중 일부는 알려진 상용 보호기를 모방하기 위해 가짜 이름(예: `.themida`, `.vmp0`, `.enigma2`)을 사용합니다.
    *   **휴리스틱 최적화**: 의심 점수를 더욱 낮추기 위해 사용자는 이러한 섹션 이름을 일반 문자열(예: `.data_01`, `.rdata_aux`)로 변경할 수 있습니다. 섹션 이름을 표준화하면 휴리스틱 "고유성" 점수가 낮아져 바이너리가 일반적인 컴파일된 애플리케이션처럼 보이게 됩니다.
*   **임포트 난독화**: 라이브러리는 중요한 Windows API에 대한 Import Address Table (IAT) 공격 표면을 성공적으로 제거합니다. PEB를 통한 해석 및 간접 시스템 콜 엔진을 활용하여 바이너리는 깨끗한 콜 스택을 유지하며, 동작 모니터가 시스템 콜을 보호된 코드 영역으로 추적하는 것을 방지합니다.
     - **간략한 설명**:
        *   **SSN 추론**: ntdll.dll의 명령 스트림에 흔히 배치되는 사용자 모드 후크를 우회하기 위해, 엔진은 상대적 정렬 알고리즘을 사용합니다. 내보내기 디렉토리를 파싱하고 모든 Zw 접두사 함수를 메모리 주소별로 정렬함으로써, 엔진은 상대적 인덱스를 기반으로 System Service Numbers (SSN)를 추론합니다. 이를 통해 프레임워크는 함수 프롤로그의 후크된 바이트를 읽지 않고도 올바른 시스템 콜 인덱스를 식별할 수 있습니다.
동적 시스템 콜 스텁: 라이브러리는 사용자 영역 바이너리 내에서 정적 시스템 콜 명령어를 사용하는 대신, 동적으로 실행 가능한 메모리를 할당하여 일시적인 전환 스텁을 호스팅합니다. 엔진은 이러한 스텁에 사용자 정의 셸코드 시퀀스(`mov r10, rcx; mov eax, ssnnumber; syscall; ret`)를 채워 시스템 콜을 간접적으로 실행합니다.
        *   **체인 부트스트래핑**: 해석 과정은 자체 부트스트래핑됩니다. 엔진은 초기 해석 호출을 사용하여 후속 간접 시스템 콜을 위한 환경을 설정합니다. 이는 모듈 열거부터 함수 실행까지 전체 수명 주기가 동작 모니터에 대해 불투명하게 유지되고 깨끗한 콜 스택을 유지하도록 보장합니다.
*   **안티 포렌식**: 혼합 부울-산술 (MBA) 및 다층 가상 명령어 집합 아키텍처 (V-ISA)를 사용하면 메모리 덤프를 획득하더라도 기본 로직이 자동화된 역난독화 도구를 통해 재구성하기 어렵습니다.

### 사용법

1.  주 프로젝트 파일(예: `main.cpp`)에 `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp`를 포함합니다.
    ```cpp
    #include "Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp" // 필요에 따라 경로 조정
    ```
2.  `main` 함수의 본문을 `_main`으로 감쌉니다:
    ```cpp
    _main({
        // 애플리케이션의 원래 main 코드를 여기에 작성
        // 예:
        // OBFUSCATE_STRING("Hello, Obfuscated World!").c_str();
        
        // API 래퍼 클래스 사용
        k8_NetworkingAPIs::NetworkingAPI* netAPI = new k8_NetworkingAPIs::NetworkingAPI;
        if (netAPI->IsInitialized() && netAPI->pInternetOpenA) {
            HINTERNET hInternet = netAPI->pInternetOpenA(OBFUSCATE_STRING("MyAgent").c_str(), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
            if (hInternet) {
                // ... hInternet 사용 ...
                netAPI->pInternetCloseHandle(hInternet);
            }
        }

        delete netAPI;
    })
    ```
3.  중요한 문자열 리터럴에는 `OBFUSCATE_STRING("your string")`을 사용합니다. API 호출에 필요한 경우 `.c_str()` 메서드를 통해 복호화된 문자열에 접근하거나, `Obfusk8/Instrumentation/materialization/transform/AES8.hpp`에서 제공하는 `.print_to_console()` 등의 다른 메서드를 사용합니다.
4.  직접적인 스텔스 API 호출에는 `STEALTH_API_OBFSTR("dll_name.dll", "FunctionNameA")`를 사용하거나, 편의성과 내장된 스텔스 기능을 위해 API 래퍼 클래스(예: `K8_ProcessManipulationAPIs::ProcessAPI`, `k8_NetworkingAPIs::NetworkingAPI`)를 사용하는 것이 좋습니다.
5.  성능에 민감하지 않은 코드의 중요 섹션에 `OBF_BOGUS_FLOW_*`, `OBF_CALL_ANY_LOCAL_JUNK`, `NOP()` 및 기타 기본 요소를 추가 난독화 계층으로 산발적으로 사용합니다.

* main.cpp 파일을 참조하십시오.

### 빌드

*   **컴파일러 요구 사항**: 이 라이브러리는 C++17용으로 설계되었습니다. Microsoft C++ 컴파일러(`cl.exe`)가 주 대상이며, 특히 PE 섹션 기능 및 SEH 사용에 적합합니다.
*   **Windows에서 `cl.exe` (MSVC 컴파일러) 얻기**:
    1.  **Visual Studio 설치**: `cl.exe`를 얻는 가장 쉬운 방법은 Visual Studio를 설치하는 것입니다. Visual Studio Community 에디션은 [Visual Studio 웹사이트](https://visualstudio.microsoft.com/downloads/)에서 무료로 다운로드할 수 있습니다.
    2.  **워크로드 선택**: 설치 중에 "C++를 사용한 데스크톱 개발" 워크로드를 선택했는지 확인하십시오. 이 워크로드는 C++ 컴파일러, Windows SDK 및 기타 필요한 도구를 설치합니다.
    3.  **개발자 명령 프롬프트 사용**: 설치 후 시작 메뉴에서 "VS용 개발자 명령 프롬프트"(예: "x64 Native Tools Command Prompt for VS 2022")를 검색하여 실행합니다. 이 명령 프롬프트는 `cl.exe`를 사용하는 데 필요한 환경 변수(PATH, INCLUDE, LIB)를 자동으로 설정합니다.
*   **포함 경로**:
    *   `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp`가 포함된 디렉토리가 컴파일러의 포함 경로에 있는지 확인하십시오.
    *   `Obfusk8/Instrumentation/materialization/transform/AES8.hpp`, `Obfusk8/Instrumentation/materialization/transform/Resolve8.hpp` 및 API 래퍼 디렉토리(예: `k8_NetworkingAPIs/`)가 `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp`와 동일한 디렉토리에 없으면 해당 경로도 올바르게 구성되었는지 확인하십시오. `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp`는 API 래퍼의 내부 포함을 위해 `../Obfusk8Core.hpp`와 같은 상대 경로를 사용하므로 디렉토리 구조가 중요합니다. `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp`가 이 라이브러리의 포함 디렉토리 루트에 있는 경우, API 래퍼는 `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp`가 예상하는 위치에 상대적인 `k8_NetworkingAPIs/`와 같은 하위 디렉토리에 있어야 하거나 `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` 자체 내에서 포함 경로를 조정해야 합니다.
*   **컴파일 예제 (개발자 명령 프롬프트 사용)**:
    `main.cpp`와 Obfusk8 헤더가 올바르게 구조화되어 있다고 가정하면, 다음과 유사한 명령을 사용하여 컴파일할 수 있습니다:
    ```bash
    cl /std:c++17 /EHsc main.cpp
    ```
    *   `x64 Native Tools Command Prompt for VS 2022`를 연 후:
      
        ![x64 Native Tools Command Prompt for VS 2022](https://assets.kitploit.com/production/public/readmes/8984/86c7ebae9ed88a06bb6de06a0766ebeebd213ac98a9f353af8db4dd462acd849.jpg)

    *   `/std:c++17`: C++17 표준 지정.
    *   `/EHsc`: C++ 예외 처리 모델 지정.
    *   `main.cpp`: 소스 파일.
    *   `/I"path/to/your/obfusk8_includes"`: (선택 사항, 헤더가 기본 경로에 없는 경우) `Obfusk8/Instrumentation/materialization/state/Obfusk8Core.hpp` 및 해당 종속성이 있는 디렉토리를 추가합니다. 하위 디렉토리에 있는 경우 `Obfusk8Core.hpp` 내의 상대 경로가 레이아웃과 일치하는지 확인하십시오.
    *   **라이브러리에 관한 참고 사항**: 스텔스 API 해석은 난독화된 함수에 대한 정적 링크를 피하는 것을 목표로 하지만, Windows SDK 헤더 자체는 난독화되지 않은 SDK 사용 또는 내부 유형(예: `Ws2_32.lib`, `Wininet.lib`, `Advapi32.lib` 등)을 해결하기 위해 링커가 특정 `.lib` 파일을 사용할 수 있어야 할 수 있습니다. `cl /std:c++17 /EHsc main.cpp`와 같은 간단한 프로젝트의 경우 표준 Windows 라이브러리이면 링커가 자동으로 해결하는 경우가 많습니다.

*   **CMAKE**: cmake를 사용하여 Obfusk8을 빌드할 수도 있습니다.
   1. 리포지토리를 클론하고 이동: `git clone https://github.com/x86byte/Obfusk8.git` 그리고 디렉토리로 이동 `cd Obfusk8`
   2. 파일 구성 및 생성: `cmake CMakeLists.txt`
   3. 빌드 도구 자동 선택 및 컴파일: `cmake --build .`
   *   `x64 Native Tools Command Prompt for VS 2022`를 연 후:
     
        ![x64 Native Tools Command Prompt for VS 2022](https://assets.kitploit.com/production/public/readmes/8984/0f644508b0677934acc81220dfe0131598c22302f78aefaea101cc38e413cb2b.png)

*   **CMAKE && Microsoft Visual Studio**:
    *   Microsoft Visual Studio를 연 후 `Ctrl + B`를 클릭하여 프로젝트를 컴파일합니다:
      
       ![Microsoft Visual Studio](https://assets.kitploit.com/production/public/readmes/8984/23789327b22943c754f4a06e036cb2c7521c5b764d4c78f1363ed0edf974cb1e.png)
        
*   **바이너리 크기 및 향후 개선 사항에 대한 고려 사항**:
    *   **크기 영향**: 특히 정크 코드 인라인, MBA 확장, 평탄화된 제어 흐름과 같은 기술을 사용하는 헤더 전용 난독화를 광범위하게 사용하면 최종 바이너리 크기가 크게 증가할 수 있습니다. 작은 프로그램의 경우 적용된 난독화 강도에 따라 수 KB에서 잠재적으로 2MB 이상으로 커질 수 있습니다.
    *   **사용자 정의 및 패킹 (향후 방향)**:
        *   현재 Obfusk8은 코드 내 난독화에 중점을 둡니다. 바이너리 크기가 중요한 제약 조건인 경우 사용자는 다양한 매크로 사용(예: `OBF_CALL_ANY_LOCAL_JUNK`의 밀도 줄이기 또는 `_main` 루프의 복잡성 줄이기)을 세밀하게 조정해야 할 수 있습니다.
        *   난독화 후 상당한 크기 감소를 위해서는 외부 PE 패커(UPX, MPRESS 또는 사용자 정의 솔루션 등)를 통합하거나 사용하는 것이 별도의 단계가 될 것입니다.
        *   Obfusk8의 향후 개발은 난독화 강도에 대한 더 세분화된 제어 옵션을 탐색하거나 라이브러리 내에서 직접 경량 패킹/압축 스텁을 통합하는 것을 모색할 수 있지만, 이는 복잡성을 크게 증가시킬 것입니다.


### 빌드 후 PE 난독화
Obfusk8은 컴파일된 바이너리에서 포렌식 아티팩트를 제거하여 더욱 강화하는 빌드 후 스크립트를 포함합니다.

*   **스크립트 위치**: `Obfusk8/SCRIPTS/obfuscate_pe.ps1`
*   **수행 작업**:
    1.  **Rich 헤더 제거** — 컴파일러 버전 및 툴체인 세부 정보를 드러내는 MSVC 빌드 환경 지문을 제거합니다.
    2.  **TimeDateStamp 스푸핑** — PE 헤더 타임스탬프를 고정된 값으로 대체하여 빌드 시간을 난독화합니다.
    3.  **디버그 디렉토리 정리** — PDB 경로 또는 빌드 메타데이터를 유출할 수 있는 디버그 디렉토리 항목을 제거합니다.
*   **사용법**:
    컴파일 후 빌드 후 단계로 실행:
    ```powershell
    PowerShell -NoProfile -ExecutionPolicy Bypass -File Obfusk8/SCRIPTS/obfuscate_pe.ps1 -Path "path\to\Obfusk8.exe"
    ```
    스크립트는 바이너리를 제자리에서 수정합니다. 백업이 생성되지 않습니다.

### 데모
   [[Obfusk8: C++17 기반 난독화 라이브러리 - IDA pro 그래프 뷰] ~동영상 데모](https://youtu.be/B9g4KSg3tHQ)

### 기여 및 피드백이 프로젝트 Obfusk8는 고급 C++ 난독화 기술에 대한 지속적인 탐구입니다. 현재 버전은 다양한 상호 얽힌 전략을 통해 강력한 기반을 마련합니다.

*   **귀하의 피드백은 매우 중요합니다**: Obfusk8 개발자로서 저는 여러분의 관점, 통찰력, 그리고 모든 피드백에 큰 관심을 가지고 있습니다. 새로운 기능 제안, 기존 기술 개선, Obfusk8로 보호된 코드에 대한 성공적(또는 실패한) 리버스 엔지니어링 시도 보고, 또는 라이브러리의 사용성과 효과에 대한 일반적인 의견 등 무엇이든 환영합니다.
*   **기여**: 모든 기여를 환영하며 크게 감사드립니다. 이 프로젝트는 커뮤니티의 의견과 실제 테스트를 통해 경계를 넓히고 코드 보호를 위한 더욱 강력한 도구로 발전합니다. 자유롭게 의견을 공유하고, 이슈를 제기하며, 발전에 기여해 주세요!.
      *    **[Obfusk8에 기여하는 방법?](https://opensource.guide/how-to-contribute/)**

### 특별 감사
*   [sadMosquito](https://github.com/sadMosquito) — 이슈 제보 및 프로젝트 테스트에 감사드립니다

**면책 조항**
난독화는 방어 계층일 뿐, 완벽한 해결책이 아닙니다. 충분한 기술과 시간을 가진 결심한 공격자는 종종 난독화된 코드를 리버스 엔지니어링할 수 있습니다. Obfusk8은 그러한 시도에 대한 장벽을 크게 높이는 것을 목표로 합니다. 다른 보안 조치와 함께 사용하십시오.

**연락하기**
피드백을 공유하거나, 난독화 기술에 대해 논의하거나, 리버스 엔지니어링 시도를 보고하거나, 또는 단순히 기술적인 대화를 나누고 싶다면 언제든지 직접 연락주세요. 저는 항상 건설적인 대화와 협업에 열려 있습니다 (난독화 관련 프로젝트나 다른 어떤 것이든 협업하게 되어 기쁩니다).

- x : https://x.com/x86byte  
- telegram: https://t.me/x86byte  
- discord: @x86byte
도구 다운로드
OBF_BOGUS_FLOW_GRID
OBF_BOGUS_FLOW_SCRAMBLE
OBF_BOGUS_FLOW_WEAVER
OBF_BOGUS_FLOW_CASCADE
OBF_BOGUS_FLOW_CYCLONE
  • 분석 방지 및 디버깅 방지 트릭(Runtime 매크로, SEH):
    • 강제 예외 및 SEH: 구조적 예외 처리(SEH)를 사용하여 강제 예외를 포함하는 경로를 만듭니다. __except 블록은 프로그램 상태를 변경할 수 있으므로 디버거가 예외를 건너뛰면 추적하기 어렵습니다.
    • 디버거 검사 (개념적): Runtime 매크로에는 특정 VM 상태 또는 타이밍으로 인해 조건이 충족되면 __debugbreak()를 트리거하거나 예외를 발생시켜 디버깅 세션을 방해하도록 설계된 조건이 포함되어 있습니다.