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

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

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, 윈도우 바이너리용

저장소 보기
79382313개월 전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, 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()를 트리거하거나 예외를 발생시켜 디버깅 세션을 방해하도록 설계된 조건이 포함되어 있습니다.

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"
  2. 매크로 구문
    OBF_METHOD 매크로를 사용하여 메서드를 정의하십시오: ```cpp OBF_METHOD(ret_type, func_name, params, method_body)
  • 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"); }

// 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; })

*여기에서 전체 예제를 확인할 수 있습니다: [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 호출로 레지스트리 작업을 수행하는 데 도움을 줍니다.
도구 다운로드