ETW TI

ETW

ETW(Event Tracing for Windows)는 Windows에서 커널ㆍ드라이버 컴포넌트가 이벤트를 발생시키고, 이에 대한 추적 기능을 제공하는 프레임워크입니다.

ETW는 다음 세 가지 구성 요소로 이루어진 아키텍처입니다.

  • Providers : 이벤트를 발생시키는 주체(커널, 드라이버, 유저모드 DLL/EXE 등)

  • Controllers : 추적 세션을 시작 및 중지하고 공급자를 활성화

  • Consumers : Providers가 제공한 이벤트를 추적하는 애플리케이션

터미널에서 logman.exe를 사용하여 이벤트 제공자 목록을 확인할 수 있습니다. 다음은 대표적인 제공자인 Microsoft-Windows-Kernel-Process에 대한 정보입니다.

제공자에 대한 쿼리를 통해 해당 제공자는 프로세스, 스레드 등과 같은 이벤트를 발생시킨다는 것을 알 수 있습니다.

ETW TI

ETW TI는 ETW 위에 올라간 특정 보안용 제공자 세트입니다. ETW와 달리 API들이 공개되어 있지 않으며, 밝혀진 정보는 리버서들에 의해 분석된 극소수의 정보만이 알려져 있습니다.

또한 ETW 제공자가 생성한 추적 이벤트들은 어떤 소비자든 상관없이 이벤트 추적 세션을 구독할 수 있는 반면, ETW TI는 ELAM(Early Launch Anti Malware) 서명 드라이버에서만 구독할 수 있습니다.

EtwpDebuggerData는 ETW 내부 상태를 커널 디버거에서 볼 수 있도록 모아둔 ntoskrnl에 존재하는 전역 심볼입니다.

공식적으로 이에 대해 밝혀진 문서는 없지만, 이 구조체의 4번째 인자는 _ETW_SILODRIVERSTATE* 구조체 포인터이며 이 구조체에는 Silo(호스트/컨테이너 파티션)에서 ETW가 돌아가기 위해 필요한 모든 전역 런타임 상태가 담겨있습니다.

Silo에 대한 정보 중에서 EtwpGuidHashTable 구조체는 64개의 버킷으로 구성되어 있고, 각각의 버킷에는 GUID 해시 계산에 따라 동일한 값을 가진 제공자 객체들로 이루어져 있습니다.

앞서 확인했던 제공자의 GUID는 다음과 같은 구조체로 이루어져 있는데, 계산식을 거친 이후 0~63의 값으로만 나누어 저장될 버킷을 지정합니다.

제공자의 GUID가 {22FB2CD6-0E7B-422B-A0C7-2FAD1FD0E716} 라고 했을 때 구조는 다음과 같습니다.

버킷에 들어갈 해시를 계산하는 GUID 해시 계산식은 다음과 같습니다.

위 GUID는 (0x22FB2CD6 ^ (0x0E7B ^ 0XA0 ^ 0X1F)) & 0x3F 계산이 되고 결과적으로 18이 나옵니다.

즉 GUID가 {22FB2CD6-0E7B-422B-A0C7-2FAD1FD0E716} 인 제공자는 18번 버킷에 저장되며, 이러한 계산으로 18이 나온 제공자들은 모두 같은 버킷 내에 저장됩니다.

각각의 버킷 내에는 세 개의 이중 연결 리스트가 있으며 저장되는 주소 순서대로 다음과 같습니다.

  • EtwTraceGuidType : ETW 제공자 정보

  • EtwNotificationGuidType : 알림/콜백용 특수 GUID

  • EtwGroupGuidType : 제공자 그룹

추적 이벤트를 생성하는 제공자를 무력화 시키기 위해서는 EtwTraceGuidType에 관심을 가져야 합니다.

리스트 엔트리가 가리키는 주소는 _ETW_GUID_ENTRY 구조체로 확인할 수 있습니다.

0xffff890a`2d26dc50 주소가 가리키는 제공자는 GUID가 {dfba1e0c-6d07-4b8a-8175-3e320a16f3f8} 이며, 현재 상태는 ProviderEnableInfo를 통해 확인할 수 있습니다.

이는 현재 제공자가 비활성 상태인 것을 의미하며, 만약 무력화해야 하는 제공자의 IsEnabled 값이 1이라면 0으로 패치함으로써 비활성화 할 수 있습니다.

References

Last updated