본문 바로가기

My Study/Reversing

가상 머신 탐지 기법

요새 바이러스다 뭐다 분석을 하기 위해서는 가상 머신에서 분석을 해야할 것입니다.
바이러스를 본컴에서 직접 돌리면서 분석할 사람은 없을꺼 같군요. 그래서 몇몇 바이러스들은 바이러스 분석가들이 가상머신에서 분석한다는 것을 알고 그것도 막을려고 합니다. 그래서 나온 기법이 가상 머신에서 프로그램이 작동 중인지 아닌지를 판단해서 작동하면 죽어버리는 것입니다.

이에 대한 내용으로 두 가지를 알아보려고 합니다.

1. LDT를 사용하는 방법
LDT란 무엇일까요?? Local Descriptor Table의 약자로 말 그대로 디스크립터 테이블 입니다.
이에 대한 내용은 인터넷을 찾아봐도 많이 나오고 제 블로그에도 쓴 적이 있으니 자세한 설명은 넘어가겠습니다.

그러면 이 LDT를 가지고 어떻게 탐지를 할 것인가.. LDT는 GDT와 다르게 각 태스크 단위로 정의할 수 있습니다.
아래는 LDT의 구조입니다.


어떻게 검사를 하는지 소스코드를 보겠습니다.

위 소스코드가 전부 입니다. 소스를 이해하는데 크게 어려운 부분은 없을 것입니다.
프로그램을 가상머신에서 돌리게 되면 VMware라는 문장이 출력 될 것입니다.
이제 소스를 응용시켜서 리버서나 크래커를 방해할 수 있겠지요..

2. IDTR를 사용하는 방법
IDTRInterrupt Descriptor Table Register입니다.
해당 레지스터는 IDT의 주소를 포함하고 있는 레지스터이고 해당 테이블은 인터럽트를 처리하는 방법을 제공하는 테이블입니다.
해당 테이블은 단 하나밖에 존재하지 않습니다. 그렇기 때문에 레지스터 또한 하나만 존재합니다.
그러면 생각해 볼 수 있는 것이 VMware에서 OS를 돌리게 되면 어쩔 수 없이 두개의 IDT이 존재 할 수밖에 없습니다.
그렇기 때문에 두개의 IDT이 같은 주소에 있으면 안되므로 두 IDT은 다른 주소에 존재하게 됩니다.

그러면 가상머신이 아닌 곳에서의 IDT 주소와 가상 머신에서의 IDT주소를 구해보도록 하겠습니다.

a. 가상머신 아닌 곳
실험 결과 하나의 값이 계속해서 나왔습니다.

가상머신이 아닌 곳에서는 IDT의 주소 값이 0xC59007FF라는 값 입니다.

b. 가상머신

가상머신에서는 IDT위치가 0x800007FF입니다.


두 결과를 가지고 탐지를 하면 됩니다.

위 소스코드를 보면 IDT의 주소를 얻어와서 해당 주소가 0xA0000000 보다 작으면 가상머신에서 실행 중인 것입니다.

위 코드를 응용해서 안티리버싱 소스를 짜면 될꺼 같습니다.