BLOG main image
분류 전체보기 (137)
궁시렁 (39)
컴쟁이의 연구실 (65)
리버싱 (17)
배워보자 (3)
좋은 곳 (9)
seyool님의 언팩미#1 들여다보기.
jz in reverse engineering
MS API 드래프트 제 1버전 공개
낚시광준초리의 Blog 세상(IT-Fo..
[Kernel] KeServiceDescriptorTa..
我好电脑,我是一名的程序设计员..
SSDT에 대한 고찰
::거듭나기::
불필요한 관심
^0^range.Net - 신은 불공평하다..
138,103 Visitors up to today!
Today 3 hit, Yesterday 28 hit
daisy rss
^0^range.net
'가상머신탐지'에 해당되는 글 1건
2007/12/21 10:19
Pascal 코드
program wvvare;
{$APPTYPE CONSOLE}
uses
  SysUtils;

function IsVMwarePresent(): LongBool; stdcall;
begin
   Result := False;
  {$IFDEF CPU386}
   try
     asm

             mov     eax, 564D5868h
             mov     ebx, 00000000h
             mov     ebx, 00000000h
             mov     ecx, 0000000Ah
             mov     edx, 00005658h
             in      eax, dx
             cmp     ebx, 564D5868h
             jne     @@exit
             mov     Result, True
     @@exit:
     end;
   except
     Result := False;
   end;
{$ENDIF}
end;

function running_inside_vpc: boolean; assembler;
asm
   push ebp
   mov  ecx, offset @@exception_handler
   mov  ebp, esp
   push ebx
   push ecx
   push dword ptr fs:[0]
   mov  dword ptr fs:[0], esp
   mov  ebx, 0
   mov  eax, 1
  db 00Fh, 03Fh, 007h, 00Bh
   mov eax, dword ptr ss:[esp]
   mov dword ptr fs:[0], eax
   add esp, 8
   test ebx, ebx
   setz al
   lea esp, dword ptr ss:[ebp-4]
   mov ebx, dword ptr ss:[esp]
   mov ebp, dword ptr ss:[esp+4]
   add esp, 8
   jmp @@ret
   @@exception_handler:
   mov ecx, [esp+0Ch]
   mov dword ptr [ecx+0A4h], -1
  add dword ptr [ecx+0B8h], 4
  xor eax, eax
  ret
   @@ret:
end;
begin
if IsVMwarePresent()
   then
     writeln( 'Found VMware!');

begin
if   running_inside_vpc
   then
     writeln( 'Found VirtualPC!');
end;
end.


2008.11.21 vbdream님이 c언어로 작성해주신 코드를 다음과 같이 추가합니다..
#include 
#include 

int __stdcall IsVMWarePresent()
{
	int Result = 0;
	__try
	{
		__asm
		{
			pushad
				mov	eax, 564D5868h
				mov	ebx, 00000000h
				mov	ebx, 00000000h
				mov	ecx, 0000000Ah
				mov	edx, 00005658h
				in	eax, dx
				mov Result, ebx
		}
		if(Result == 0x564D5868)
		{
			return 1;
		} else {
			return 0;
		}
	} __except(EXCEPTION_EXECUTE_HANDLER)
	{
	}
	return Result;
}

__declspec(naked) int __stdcall running_inside_vpc(void)
{
	__asm
	{
		push ebp
			mov ecx, offset exception_handler
			mov ebp, esp
			push ebx
			push ecx
			push dword ptr fs:[0]
		mov dword ptr fs:[0], esp
			mov ebx, 0
			mov eax, 1
			__emit 00Fh
			__emit 03Fh
			__emit 007h
			__emit 00Bh

			//lbl_continue:
			mov eax, dword ptr ss:[esp]
		mov dword ptr fs:[0], eax
			add esp, 8
			test ebx, ebx
			setz al
			lea esp, dword ptr ss:[ebp-4]
		mov ebx, dword ptr ss:[esp]
		mov ebp, dword ptr ss:[esp+4]
		add esp, 8
			jmp lbl_ret

exception_handler:
		mov ecx, [esp+0Ch]
		mov dword ptr [ecx+0A4h], -1
			add dword ptr [ecx+0B8h], 4
			xor eax, eax

lbl_ret:
		ret
	}
}

// 엔트리 포인트
int main(int argc, char **argv)
{
	if(IsVMWarePresent() || running_inside_vpc())
	{
		printf("VM Running! ";
	} else {
		printf("VM doesn't Running! ";
	}
	return 0;
}

출처:
http://rootkits.ru/library/ShowLib.aspx?id_l=25
http://www.excode.ru/art4050.html
http://chitchat.at.infoseek.co.jp/vmware/backdoor.html
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback Address :: http://0range.net/trackback/195 관련글 쓰기
BlogIcon 홍가이버 | 2007/12/21 19:19 | PERMALINK | EDIT/DEL | REPLY
글 잘보고 갑니다...
seyool | 2007/12/23 03:08 | PERMALINK | EDIT/DEL
안티디버그루틴과 같이 사용하면 좋을 것 같아서
찾게되었습니다.
BlogIcon window31 | 2007/12/26 18:29 | PERMALINK | EDIT/DEL | REPLY
와 멋진데요~!
혹시 저 나라 말을 할줄 아시는건가요 ;;
seyool | 2007/12/27 16:05 | PERMALINK | EDIT/DEL
그럴리가요 하하 ^0^
chpie | 2007/12/29 12:24 | PERMALINK | EDIT/DEL | REPLY
러시아어의 압박이 강하군요... -_-;;;
BlogIcon seyool | 2008/01/02 12:17 | PERMALINK | EDIT/DEL
chpie // 새해 복많이 받으세요~
보고싶다 | 2008/01/04 21:47 | PERMALINK | EDIT/DEL | REPLY
바보야! 내가 뽀뽀하자구할때 뽀뽀왜 안했냐?
바보...ㅠ.ㅠ
seyool | 2008/01/05 00:22 | PERMALINK | EDIT/DEL
누구세요??
겨울비 | 2008/01/08 13:00 | PERMALINK | EDIT/DEL | REPLY
이거이거 이거봐라~ 편안한 삶 살게해주마~~~!!!
BlogIcon seyool | 2008/01/08 15:29 | PERMALINK | EDIT/DEL
응.. 나도 편케 살고 싶어 ㅎㅎ
MUST | 2008/11/18 20:19 | PERMALINK | EDIT/DEL | REPLY
킁; 이런 질문 하는거 매우 부끄럽습니다만.. 뭐 하나만 질문 하겠습니다;;
이 코드를 응용해서 VMWare, VirtualPC를 탐지해주는 Console Program을 만들려고 하는데요..
도저히 안되겠어서 말이죠; 혹시 도움좀 주실수 있으실런지요?
가상 머신이 탐지되면 탐지했다는 스트링을 printf 해주려고 하는데..
BlogIcon vbdream | 2008/11/18 22:10 | PERMALINK | EDIT/DEL
저도 예전에 구글링하다 위 델파이 소스를 본적이 있는것 같은데요. 아마 위 소스 코드는 원래는 C 코드 였는데 델파이 코드로 바꾼 걸겁니다.

여하튼 C언어로 한번 번역해보았습니다. 즐프하세요.

#include <stdio.h>
#include <excpt.h>

int __stdcall IsVMWarePresent()
{
int Result = 0;
__try
{
__asm
{
pushad
mov eax, 564D5868h
mov ebx, 00000000h
mov ebx, 00000000h
mov ecx, 0000000Ah
mov edx, 00005658h
in eax, dx
mov Result, ebx
}
if(Result == 0x564D5868)
{
return 1;
} else {
return 0;
}
} __except(EXCEPTION_EXECUTE_HANDLER)
{
}
return Result;
}

__declspec(naked) int __stdcall running_inside_vpc(void)
{
__asm
{
push ebp
mov ecx, offset exception_handler
mov ebp, esp
push ebx
push ecx
push dword ptr fs:[0]
mov dword ptr fs:[0], esp
mov ebx, 0
mov eax, 1
__emit 00Fh
__emit 03Fh
__emit 007h
__emit 00Bh

//lbl_continue:
mov eax, dword ptr ss:[esp]
mov dword ptr fs:[0], eax
add esp, 8
test ebx, ebx
setz al
lea esp, dword ptr ss:[ebp-4]
mov ebx, dword ptr ss:[esp]
mov ebp, dword ptr ss:[esp+4]
add esp, 8
jmp lbl_ret

exception_handler:
mov ecx, [esp+0Ch]
mov dword ptr [ecx+0A4h], -1
add dword ptr [ecx+0B8h], 4
xor eax, eax

lbl_ret:
ret
}
}

// 엔트리 포인트
int main(int argc, char **argv)
{
if(IsVMWarePresent() || running_inside_vpc())
{
printf("VM Running!\n";);
} else {
printf("VM doesn't Running!\n";);
}
return 0;
}
BlogIcon seyool | 2008/11/19 09:23 | PERMALINK | EDIT/DEL
MUST // 모르는것은 부끄러운게 아닌거 같습니다. 저도 궁금하면 곧잘 질문하곤 합니다.
vbdream // 답변달기도 전에 벌써 답글을 올리셨군요.. 감사합니다 (_._)
BlogIcon vbdream | 2008/11/19 23:01 | PERMALINK | EDIT/DEL
seyool // 네. 그렇지요 ^^;

MUST // 참고적으로 이렇게 하는 것보단, 좀 더 편한 방법이 있는데요. Joanna Rutkowska가 발표한 Redpill의 기법을 이용하면 깔끔한 코드로 Virtual PC/VMWare/Parallels을 전부 감지할 수 있습니다.

SIDT [] 로 IDTR을 구해서 (전 이 명령어가 Ring3에서 됐다는게 매우 신기하더군요...^^;) 주소값이 0xd1000000 이상인지 체크하는 테크닉으로 매우 쉽게 감지하더군요...^^; 참고하세요.

redpill 코드 인용 (살짝 손보셔야할듯... DEP를 고려해서):
int swallow_redpill () {
unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
*((unsigned*)&rpill[3]) = (unsigned)m;
((void(*)())&rpill)();
return (m[5]>0xd0) ? 1 : 0;
}
MUST | 2008/11/19 19:32 | PERMALINK | EDIT/DEL | REPLY
두분 다 정말 감사드립니다~ :)
BlogIcon vbdream | 2008/11/24 20:26 | PERMALINK | EDIT/DEL
음...... 님이 도비님이셨네요 -_-;

왠만하면 떳떳하게 'masterdoby' 라고 하고 다녀주세요.
BlogIcon seyool | 2009/08/21 16:22 | PERMALINK | EDIT/DEL | REPLY
seyool | 2009/09/30 09:32 | PERMALINK | EDIT/DEL | REPLY
VMWare 탐지를 우회하는 설정도 존재를 하는군요..
http://lain32.egloos.com/4536437
Name
Password
Homepage
Secret
prev"" #1 next