그냥저냥

[Anti VM] IDT 기반 탐지 본문

Reversing/Anti Debugging & Anti VM

[Anti VM] IDT 기반 탐지

ex3llo 2016. 7. 31. 09:34

IDT (Interrupt Descriptor Table)


인터럽트 처리에 관련된 Descriptor 들을 모아둔 내부 데이터 구조체

프로세스당 하나의 IDTR 레지스터가 존재하며, 2개의 OS (Host/Guest) 가 구동중일 경우 Guest OS의 IDT는 재배치된다

IDTR의 내용을 확인하면 IDT의 메모리상 위치를 알 수 있으며, SIDT (Store Interrupt Descriptor Table) 명령으로 IDTR의 내용을 가져올 수 있다


<소스코드>

void main(){     unsigned char idtr[6];     int i;

    __asm{         sidt idtr     }     printf("IDT : 0x");

    for(i=5; i>1; i--)         printf("%2.2x", idtr[i]); }



코드 실행 시 Host OS에서는 0x8003F400 값이 나오며, Guest OS에서는 0xFFC18000 값이 나온다. (단, Guest OS에서 나온 값은 약간 유동적임)

일반적으로 VMWare 가상환경에서는 0xFF?????? , VirtualPC 가상환경에서는 0xE8FFFFFF 값이 나온다고 알려져 있다.

즉, 가상환경 탐지 기준은 IDT 주소가 0xD0000000 보다 크면 가상머신, 작거나 같으면 Host OS로 판단한다.


<결과>

    



IDT를 이용한 탐지 방법의 단점은 오탐 가능성이 높다는 것이다.

단일 프로세서라면 IDTR 레지스터가 1개만 존재하지만, 멀티 프로세서인 경우 각 프로세서마다 IDTR 레지스터가 존재하기 때문에 오탐 가능성이 있다.

또한 IDT를 이용한 탐지 방법은 VMWare의 EPT 옵션 변경으로 간단히 우회 가능하다.  (* EPT : VMWare의 Memory 가상화 기술)


Comments