게임 핵(Hack)과의 전쟁: 커널 안티치트(Kernel Anti-Cheat)의 비밀

by DD
2개월 전
조회수 4

커널 안티치트(Kernel Anti-Cheat)는 게임의 무결성을 지키기 위해 커널 레벨에서 작동하며, 사용자 모드(Usermode)의 취약점을 보완한다.

BattlEye, EasyAntiCheat, Vanguard, FACEIT AC 등 주요 안티치트 시스템의 아키텍처와 구성 요소, 그리고 부팅 시점의 드라이버 로딩 방식에 대한 차이점을 설명한다.

ObRegisterCallbacks, PsSetCreateProcessNotifyRoutineEx 등 윈도우 커널 콜백(Callback)을 활용한 프로세스 및 스레드 감시 기법을 소개한다.

메모리 보호(Memory Protection), 후킹 탐지(Hook Detection), 드라이버 수준의 보호(Driver-Level Protections) 등, 안티치트 시스템의 핵심 기술들을 상세히 분석한다.

커널 안티치트(Kernel Anti-Cheat)의 3-Layer 아키텍처(Three-Component Model)

현대적인 커널 안티치트(Kernel Anti-Cheat)는 일반적으로 3-Layer 아키텍처(Three-Component Model)를 따른다. 이는 커널 드라이버(Kernel Driver), 사용자 모드 서비스(Usermode Service), 그리고 게임 내 DLL(Game-injected DLL)로 구성된다. 기술적으로 보면, 커널 드라이버는 ring 0에서 실행되며, 시스템 콜(System Call)을 가로채고 메모리를 스캔하며 보호 기능을 수행한다. 사용자 모드 서비스는 네트워크 통신, 벤(Ban) 관리, 원격 측정(Telemetry)을 담당하며, 게임 내 DLL은 게임 프로세스 내에서 사용자 모드 검사를 수행한다. 이러한 분리는 아키텍처적, 보안적 이점을 제공한다.

커널 콜백(Kernel Callbacks)을 활용한 감시 및 제어

윈도우 커널(Windows Kernel)은 보안 제품을 위해 설계된 다양한 콜백 등록 API를 제공하며, 안티치트(Anti-Cheat)는 이를 적극적으로 활용한다. 특히, ObRegisterCallbacks는 프로세스 및 스레드 핸들(Handle)에 대한 접근을 제어하여 외부 프로세스가 게임 메모리에 접근하는 것을 방지한다. PsSetCreateProcessNotifyRoutineEx는 새로운 프로세스 생성 및 종료를 감지하고, PsSetCreateThreadNotifyRoutine은 게임 프로세스 내 스레드 생성 시점을 감지하여 코드 인젝션(Code Injection)을 탐지한다. 이러한 콜백들은 시스템 전반의 활동을 감시하고, 잠재적인 위협을 식별하는 데 핵심적인 역할을 한다.

메모리 보호(Memory Protection) 및 코드 무결성 검사

안티치트(Anti-Cheat)는 게임 메모리(Game Memory)를 보호하기 위해 다양한 기술을 사용한다. 핸들 접근 제어(Handle Access Control)를 통해 외부 프로세스의 메모리 읽기 및 쓰기를 제한하는 것이 기본적인 방법이다. 또한, 주기적인 메모리 무결성 해싱(Periodic Memory Integrity Hashing)을 통해 게임 실행 파일 및 핵심 DLL의 코드 섹션(.text sections)을 검사하여 코드 변조 여부를 확인한다. 특히, 수동 매핑 코드(Manually Mapped Code)를 탐지하기 위해 VAD(Virtual Address Descriptor) 트리를 직접 순회하며, 실행 가능한 메모리 영역이 파일에 의해 지원되지 않는지 확인한다. 이러한 기술들은 게임의 코드 변조를 방지하고, 핵(Hack) 사용을 어렵게 만든다.

후킹(Hooking) 및 인젝션(Injection) 탐지 기술

안티치트(Anti-Cheat)는 게임 내에서 사용되는 후킹(Hooking) 및 인젝션(Injection) 기술을 탐지하기 위해 다양한 방법을 사용한다. IAT 후킹(IAT Hooking)을 탐지하기 위해, 임포트 주소 테이블(Import Address Table, IAT)의 주소를 확인하여 예상 주소와 일치하는지 검사한다. 인라인 후킹(Inline Hooking)을 탐지하기 위해, 함수 시작 부분의 바이트를 검사하여 변조 여부를 확인한다. 또한, SSDT 무결성 검사(SSDT Integrity Checking)를 통해 시스템 서비스 디스크립터 테이블(System Service Descriptor Table, SSDT)의 변조를 감지한다. 이러한 기술들은 핵(Hack)이 게임의 핵심 기능을 가로채거나 변조하는 것을 방지한다.

드라이버 수준의 보호(Driver-Level Protections) 및 BYOVD 공격 방어

안티치트(Anti-Cheat)는 드라이버 수준에서 다양한 보호 기법을 사용한다. 서명되지 않은 드라이버(Unsigned Driver)테스트 서명 드라이버(Test-Signed Driver)의 로딩을 감지하여, 무단 커널 코드 실행을 방지한다. 특히, BYOVD(Bring Your Own Vulnerable Driver) 공격에 대응하기 위해, 취약한 드라이버의 사용을 차단하는 블록리스트(Blocklist)를 활용한다. 또한, PiDDBCacheTableMmUnloadedDrivers와 같은 커널 내부 구조를 모니터링하여, 드라이버의 은폐 시도를 탐지한다. 이러한 기술들은 드라이버 수준에서의 공격을 방어하고, 게임의 보안을 강화한다.

How Kernel Anti-Cheats Work: A Deep Dive into Modern Game Protection