Backdoor

작성자: amesde9@gmail.com, 1 년 전에, 코딩언어: C, 조회: 957 회.
URL http://www.pastebin.co.kr/view/eece70a6 - 공유: Twitter | Facebook | Google Embed
다운로드 또는 원본 보기
  1. #include <WINDOWS.H>
  2.  
  3. BOOL ATD_VMware_Backdoor_Check() {
  4.  
  5.         unsigned int    a, b;
  6.  
  7.         const UINT VMWARE_MAGIC                 = 'VMXh';       // 0x564D5868
  8.         const USHORT VMWARE_PORT_NUMBER         = 'VX';         // 0x5658
  9.         const UINT VMWARE_CMD_GETVERSION        = 0xA;
  10.         const UINT VMWARE_CMD_GETMEMSIZE        = 0x14;
  11.        
  12.         __try {
  13.                 __asm {
  14.                        
  15.                         // IN 명령어를 사용하기 위해서는 eax 레지스터에 반드시
  16.                         // 통신 채널에 대한 값이 저장되어 있어야 한다.
  17.                         // 'VMXh'는 VMware 환경에서 'IN' 명령어의 특별한 기능으로 생성되는
  18.                         // 게스트 PC와 호스트 PC간의 통신 채널이다(VMware의 magic number).
  19.                         // 0x564D5868 'VMXh'
  20.                         mov eax, VMWARE_MAGIC
  21.  
  22.                         // ebx 에 들어오는 값을 검사하고 싶을 때 사용한다.
  23.                         // ebx의 값을 읽지 않고, 예외 처리로 탐지 여부를 구분하려는 경우는 이 명령을 생략해도 된다.
  24.                         // 굳이 0으로 초기화하지 않아도, magic number 만 아니라면 아무 값이나 들어가도 상관없다.
  25.                         xor ebx, ebx   
  26.  
  27.                         // IN 명령어는 두 개의 인자를 필요로 한다(ecx, dx).
  28.                         // ecx는 I/O 포트로부터 어떤 데이터를 읽어올지에 대한 Command Number이다.
  29.                        
  30.                         // 다음 두 가지 명령 중 하나를 사용할 수 있다.
  31.                         // 0x0A는 호스트로부터 VMware 버전 정보를 요청하기 위해 사용되는 명령값이다.
  32.                         // 0Ah : Get VMware version
  33.                         // 0x14는 메모리 크기를 구하는 명령이다.
  34.                         // 014h : Get memory size(MB)
  35.                         mov ecx, VMWARE_CMD_GETVERSION
  36.  
  37.                         // dx는 접근하는 포트가 무엇인지에 대한 값이다.
  38.                         // 'VX'는 VMware의 I/O 포트 번호(port number)이다.
  39.                         // 0x5658 'VX'
  40.                         mov dx, VMWARE_PORT_NUMBER
  41.  
  42.                         // 대개 in 명령은 포트 입출력(I/O)를 위해 사용된다
  43.                         // 일반적으로 포트 0x5658("VX")에서 데이터를 로드하려고 할 것이다
  44.                         in eax, dx
  45.  
  46.                         // 호스트 OS 환경이라면, Ring3 상의 IN 명령 사용으로 인해
  47.                         // IOPL 권한(privilege) 오류가 발생하여 예외처리 구문으로 빠져나간다.
  48.                         // VMware 환경에서는 예외가 발생하지 않는다. 코드 흐름은 계속 진행되고 'VMXh' 값은 EBX 레지스터로 이동된다.
  49.                         mov a, ebx                      // 저장된 'VMXh' 값을 a 변수에 저장
  50.                         mov b, ecx                      // 저장된 버전 정보를 b 변수에 저장
  51.                 }
  52.         }
  53.        
  54.         __except (EXCEPTION_EXECUTE_HANDLER) {
  55.  
  56.                 MessageBox(NULL, "VM not detected", "TEST", MB_OK);
  57.                 return FALSE;
  58.         }
  59.  
  60.         MessageBox(NULL, "VM detected!", "TEST", MB_OK);
  61.         return TRUE;
  62. }
  63.  
  64. int main() {
  65.  
  66.         ATD_VMware_Backdoor_Check();
  67.         return 0;
  68. }

답글: "Backdoor"

이 곳에 위 붙여넣기에 답글을 달수있습니다.