본문 바로가기

My Study/Reversing

온라인 알까기 가상머신 탐지 우회

어떠한 프로젝트를 하려는데...( 불법 아님 ) 가상머신에서 프로그램이 돌아가지 않아 상당히 애를 먹었습니다.

간단히 vmx의 안에 몇몇 코드를 추가해서 실행해도 되지만 그렇게 될 경우 제 vmware에 설치된 윈도우가 정품인증을 다시 하라고 난리쳐 이 방법은 그냥 사용하지 않았습니다.


지금부터 설명할 게임은 대놓고 가상머신탐지를 합니다. - 2012년 9월 6일 자..

프로그램을 설치하면 해당 폴더에 VPCCheck.dll이 생기는데.. 가상머신 Check하는 dll 같습니다.

그러면 실행 프로그램에서 당연히 해당 dll을 LoadLibrary 할 것이고 DllMain에서 처리를 하던.. 내부적인 함수를 가져와 호출해서 처리하던.. 할 것입니다.



checkVPC라는 함수에서 검사를 하는군요.

그 아래에서 바로 해당 함수를 호출하고 있습니다.


함수 내부를 보겠습니다.



3개의 함수를 call하고 있는데 저중에 가운데 있는 놈이 핵심적인 놈입니다.



내부로 들어오면 다음과 같은 코드들이 존재합니다.

가장 처음엔 0x10001000 함수가 호출되겠죠. 해당 함수부터 보겠습니다.

그 이후로 차례로 함수들을 보겠습니다. 우회법부터 먼저 설명하면 

우회법은.. 저 점프문들을 다 강제 점프 시켜주면됩니다.



내부로 들어가보면 다음과 같은 코드를 만나게 되는데 중간에 4Byte 정도가 디스어셈블링 되지 않았군요.

저 4Byte가 의미하는게 뭔지 구글에서 쳐보니 바로 답이 나왔습니다 :D


SYMANTEC ADVANCED THREAT RESEARCH - DETECTING VIRTUALPC


일단 지금 설명할 부분은 VirtualPC 라는 가상머신을 탐지하는 방법입니다.

가상머신에서 파일 리버싱할 때 다음과 같은 코드를 찾았다고 합니다.

0F 3F x1 x2

0F C7 C8 y1 y2

일반적인 경우에 위 opcode들은 예외발생의 원인이 됩니다. 왜냐하면 0F 3F opcode는 정의되지 않은 opcode 이기 때문이죠.

0F C7 C8 opcode 또한 예외가 발생합니다. 왜냐하면 기존의 opcode의 illegal 인코딩이기 때문이죠?!.

이러한 예외들은 어플리케이션에 의해 trap 되어질 수 있습니다. 하지만 VirtualPC에서 실행될 경우 x1, x2, y1, y2의 값에 의존해 예외가 발생하지 않을 수 있습니다.

 x1, x2에 사용될 수 있는 값의 전체 리스트는 알려져 있지 않습니다. 하지만 VirtualPC의 BIOS 코드는 0A 00, 11 00, 11 01, 11 02 라는 값을 사용합니다. 파일 공유 모듈은 02 01~13 이라는 값과 07 0B 라는 값을 사용합니다. 이런 것들은 게스트와 호스트사이의 통신의 예입니다.

 뭐 그리고 주저리주저리 설명이 많지만 결국 VirtualPC에서는 저 0F 3F 07 0B 를 만나면 예외를 발생시키지 않고 정상적으로 진행한다는 것입니다. 단순히 게스트와 호스트 사이의 통신 명령이기 때문이겠죠.

 결국 저기서 탐지가 되는 것이겠죠. 아래보니 MOV AL,1 이라는 명령어가 있네요.


하지만 제가 테스트하고 있는 환경은 VMware입니다. VMware라는 가상머신도 탐지하는 루틴이 또 존재하겠죠.

일단 찾아보기 전에 해당 문서에 있는 설명을 마저 읽어보겠습니다. 여기 VMware 설명도 되어 있는데 게임회사에서 같은 문서를 읽으며 구현했을태니까요?! ㅋㅋ


VMware도 마찬가지로 가상머신인지 탐지하는 많은 방법들이 있습니다. 여기서 설명하는걸 보니 대략 하드웨어 장치 이름을 검색하는 방법으로 탐지를 많이 한다고 나와있더군요. 예를 들어 마더보드의 제조사 이름으로 할 수도 있습니다. VirtualPC같은 경우는 "Microsoft Corporation" 으로 나온다고 하네요. 일단 코드를 계속 보면서 해당 부분을 찾아보겠습니다.


위 코드에선 전 VMware이기 때문에 탐지 되지 않을 것입니다. 그렇기 때문에 위 코드에선 예외루틴으로 빠져야겠군요.

개발자가 만든 예외루틴으로 바로가기 위해선 아래글을 읽으시면 될 것입니다.

http://ezbeat.tistory.com/284


아무튼 예외루틴이 끝나면 위위 그림에서 0x10001268로 오게됩니다. AL이 1인지 비교하고 다르면 점프하는건데

당연히 다릅니다. 그러면 또 0x10001160 함수로 들어가게 됩니다. 이 함수는 뭘 탐지하는 함수일까요?

함수 내부를 보겠습니다.



중간에 유저모드에서 있어선 안될 명령어가 또 존재하네요. 이 기법은 VMware를 탐지하는 기법입니다. 

제가 아는건 VMware자체적으로 가상머신에 설치된 Windows의 IDT나 LDT를 검사함으로써 탐지하는 것인데 redpill이라고 부러죠..하지만 여기선 다른 방법이 사용되었습니다. 해당 기법에 대한 설명은 다음과 같습니다.

 보호모드에서 작동하는 OS ring3에서 IN 명령어는 예외를 발생시킵니다. 왜냐하면 IN명령어는 특권명령이기 때문입니다.

이 예외는 일반적으로 어플리케이션에 의해 트랩되어 질 수 있습니다. 하지만 만약 VMware에서 실행 중일 때는 예외가 발생하지 않을 수 있습니다. 대신 무조건 발생안하는게 아닌 조건이 있습니다. EAX 레지스터는 'VMXh'라는 값을 가져야합니다.

 이 탐지 방법은 W32/Polip 바이러스에서 사용되었습니다. 아무튼 이 방법을 사용해 VMware 탐지를 하고 있군요.


 하지만 함수를 빠져나와 간단히 점프문을 바꿔줌으로서 우회가 가능합니다 -_-;


이번엔 그 아래 함수를 보겠습니다.



여긴 또 뭘하는 코드일까요?.. GetUserName은 현재 계정의 이름을 얻어오는 함수입니다. 저 같은 경우는 Administrator입니다.

CurrentUser와 비교를 하는데 당연히 다르므로 해당 함수는 그냥 빠져나갑니다.

이 함수에서는 계정이름이 CurrentUser 일 경우 탐지되는 함수 였습니다.



다음 함수입니다. 여기선 해당 게임 실행파일의 전체경로를 얻어와 C:\file.exe 와 비교를 하고 있습니다.

이것도 당연히 아니므로 스킵... 왜 C:\file.exe와 비교를 하는 것일까요? 무슨 탐지 기법이길래... 흠;;


마지막 함수입니다.



여기선 "\\.\VBoxMiniRdrDN" 이라는 디바이스 이름을 얻어오고 있습니다. 이건 딱봐도 VirtualBox를 탐지하는 모듈이군요.

전 아니므로~ skip!


일단 다시 정리를 해보겠습니다.



세번째 네번째는 이해가 잘 안가지만 VirtualPC, VMware, VirtualBox 전부 탐지를 하고 있었습니다.

우회법은 다시 말해서.. 저 점프문을만.. 점프하게 해주면 끝납니다.


아래는 실행결과입니다.



이제 하던일을 계속 해야겠습니다.

'My Study > Reversing' 카테고리의 다른 글

IceSword ?! 뭐하는 놈?  (4) 2012.11.13
바람의나라 가상머신 탐지 우회  (18) 2012.09.10
VERA ( Reversing tool )  (12) 2012.07.31
Age of Empires III 아시아의 왕조 정보  (2) 2012.07.10
WriteProcessMemory Anti Reversing  (0) 2012.06.27