Q&A

  • c소스인데 델파이로 어떻게 바꿔야할지 감이 안오네요..조언좀 부탁드려요
구글에서 찾은건데 가상머신에서 실행되는지 체크하는 거라고 하더군요..

#include <stdio.h>
int main () {
  unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
  *((unsigned*)&rpill[3]) = (unsigned)m;
  ((void(*)())&rpill)();

  printf ("idt base: %#x\n", *((unsigned*)&m[2]));
  if (m[5]>0xd0) printf ("Inside Matrix!\n", m[5]);
  else printf ("Not in Matrix.\n");
  return 0;
}

요거 델파이로 어떻게 바꾸면 될까요...
4  COMMENTS
  • Profile
    타락천사 2009.02.24 21:46
    ㅎㅎㅎㅎㅎ

    첨에는 소스 전환 같은 걸 다 올리나.. 생각했는데...
    소스 보니.. 포인터에 익숙하지 않으면 어렵겠군요...ㅋㅋㅋ

    그런데.. 이거이 정말로 가상머신을 체크하는 건가요?

    0번 address 영역을 읽어보려는 것 같긴 한데.....

    아무리 봐도.. 아닌거 같은데요...ㅡㅡ+

    소스를 봐선 아닌것으로 로 판단됩니다.. ㅡㅡ+

  • Profile
    정한구 2009.02.24 22:18
    아래는 발췌한 원문입니다...


    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;
    }
  • Profile
  • Profile
    정한구 2009.02.25 00:25
    타락1004님, 최용일님 감사드립니다...

    vmware detect하는걸 테스트하다가 어셈말고 다른방법이 있을거 같아서 찾아보았네요...

    즐코딩하세요~~