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

main 함수 래핑 (_main 매크로)애플리케이션의 진입점(main)은 복잡한 다계층 난독화 엔진으로 변환됩니다.
main_body 코드가 실행되기 전에 미니 VM(시뮬레이션된 CPU)이 "암호화된" 명령어 시퀀스를 실행합니다. 이는 실제 진입점과 초기 작업을 숨깁니다. VM 상태(레지스터, 프로그램 카운터, 디스패치 키)는 런타임 무작위 값으로 초기화됩니다._main 매크로 내 중요 루프(프롤로그와 에필로그 모두)는 복잡한 상태 기계로 변환됩니다. 제어 흐름은 직접적이지 않으며, 강력하게 "암호화된" 상태 변수에 의해 결정됩니다. 이러한 상태 변수의 인코딩/디코딩 키는 동적이며, VM 상태, 루프 카운터, 컴파일 타임 무작위성(__COUNTER__, __LINE__, __TIME__ 등) 및 전역 불투명 시드에서 파생됩니다. 이로 인해 제어 흐름의 정적 분석이 매우 어려워집니다.
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):
__except 블록은 프로그램 상태를 변경할 수 있으므로 디버거가 예외를 건너뛰면 추적하기 어렵습니다.Runtime 매크로에는 특정 VM 상태 또는 타이밍으로 인해 조건이 충족되면 __debugbreak()를 트리거하거나 예외를 발생시켜 디버깅 세션을 방해하도록 설계된 조건이 포함되어 있습니다.obf_vm_engine)_main 매크로 난독화의 핵심 구성 요소:
r0, r1, r2), 프로그램 카운터(pc) 및 dispatch_key를 갖춘 CPU를 시뮬레이션합니다. 사용자 정의 "명령어"(핸들러)를 실행합니다.reg_dispatch_idx).get_mem_dispatch_table).mixed_dispatch_idx).
dispatch_key는 지속적으로 변형되어 실행되는 핸들러 시퀀스를 매우 예측 불가능하게 만듭니다.vm_handler_table) 자체가 _main 프롤로그 및 에필로그 내에서 런타임에 변형되어 VM의 동작을 더욱 모호하게 만듭니다.AES8.hpp의 OBFUSCATE_STRING)__FILE__, __LINE__) 및 빌드 시간(__DATE__, __TIME__)에서 파생됩니다.AES8.hpp의 MSVC 특정 기능).Resolve8.hpp의 STEALTH_API_OBFSTR / STEALTH_API_OBF)GetModuleHandle 및 GetProcAddress를 우회하여 초기 해석을 수행합니다.CT_HASH)을 사용합니다. 이를 통해 이러한 매크로를 사용할 때 DLL 및 API 이름의 평문이 바이너리의 가져오기 관련 데이터 또는 문자열 테이블에 나타나는 것을 방지합니다.K8_SYSCALL)Obfusk8는 이제 사용자 모드 후크(EDR/AV) 및 정적 분석 검사를 우회하기 위한 최첨단 간접 시스템 콜 메커니즘을 통합합니다.
K8_SYSCALL("ZwOpenProcess", ...)를 사용하기만 하면 됩니다.OBF_METHOD)Obfusk8는 이제 메서드 기반 난독화를 통해 바이너리 보안에 대한 세밀한 제어를 제공합니다. 전체 프로젝트를 난독화하는 대신(성능에 영향을 줄 수 있음) 특정 고가치 함수나 클래스 메서드를 선택적으로 보호할 수 있습니다.
OBF_METHOD 매크로를 사용하여 메서드를 정의하십시오: ```cpp
OBF_METHOD(ret_type, func_name, params, method_body)
ret_type: 함수의 반환 타입 (예: bool, int, void*).func_name: 메서드의 이름.params: 함수 매개변수 (괄호로 묶어야 함).method_body: { }로 묶인 함수의 실제 로직.이 예제에서 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 호출로 레지스트리 작업을 수행하는 데 도움을 줍니다.