심플스 - 프로그램과 책 이야기로 가득한 곳, (Simples.Kr)

  


   심플스 배너



커널 디버거 탐지 기법 우회

Windows Research 조회 수 8599 추천 수 0 2010.09.03 17:29:28
 
다음 코드 2줄로 우회가 가능합니다.

extern PBOOLEAN KdDebuggerEnabled; // 선언..
*KdDebuggerEnabled = FALSE; // 우회 코드

KdDebuggerEnabled 변수를 직접적으로 접근하지 않는 방식을 사용하여도 이 방법은 통합니다.
왜냐하면 결국엔 그 함수들은 저 전역변수를 참조하게 됩니다.
심지어 WinDbg 조차도 저렇게 값을 임의로 바꾸면 Attach가 안됩니다.

따라서 이러한 경우 커널 디버거는 우회가 되는데 WinDbg로 Attach 하여서 디버깅하는데 조금 문제가 생길것입니다.
따라서 디버거를 탐지하는 코드가 실행되는 경우에는 우선 저렇게 전역변수를 FALSE로 바꾸고
디버거 탐지코드가 실행되었다면 다시 KdDebuggerEnabled 커널 전역변수를 TRUE로 바꿔주면
WinDbg로 Attach 도 되고 디버깅이 가능해집니다.

커널 디버거를 탐지하는 대상 코드는 아래와 같고 이러한 코드는 이전에 말했듯이 내부적으로
위에 커널 전역변수를 사용하므로 우회가 됩니다.

bool __stdcall IsDebugPort(PVOID Object)
{
  void *pZwQueryInformationProcess; // eax@2
  bool result; // eax@4
  signed int bDebug; // [sp+10h] [bp-4h]@1
  int v4; // [sp+Ch] [bp-8h]@2
  UNICODE_STRING DestinationString; // [sp+4h] [bp-10h]@3

  bDebug = 0;
  if ( PsLookupProcessByProcessId(Object, &Object) >= 0
    && ((ObOpenObjectByPointer(Object, 0, 0, 0, 0, 0, &v4), ObfDereferenceObject(Object), pZwQueryInformationProcess = (void *)g_ZwQueryInformationProcess, g_ZwQueryInformationProcess)
     || (RtlInitUnicodeString(&DestinationString, L"ZwQueryInformationProcess"), pZwQueryInformationProcess = MmGetSystemRoutineAddress(&DestinationString), g_ZwQueryInformationProcess = (int)pZwQueryInformationProcess, pZwQueryInformationProcess)) )
  {
    ((int (__stdcall *)(int, signed int, signed int *, signed int, _DWORD))pZwQueryInformationProcess)(
      v4,
      7,
      &bDebug,
      4,
      0);                                                       // 이 함수에 두 번째 인자 ProcessDebugPort를 넘기고 있다.
                                                                // 즉, 이것은 디버그중인지 체크한다고 보면 될것이다.
    result = bDebug == -1;                                      // -1(0xFFFFFFFF) 일 경우 디버깅중인 상태입니다.
  }
  else
  {
    result = 0;
  }
  return result;
}
List of Articles
번호 제목 글쓴이 날짜 조회 수
163 문서자료 json 문법 체크 사이트 Lyn 2012-02-28 16572
162 Windows Research SCSI Miniport - IOCTL_SCSI_PASS_THROUGH_DIRECT ( Windows ... lain 2011-06-11 12683
161 Windows Research 커널레벨에서 IAT Hook lain 2011-06-11 14200
160 Windows Research DEVICE_OBJECT에 대한 보안 디스크립터 변경 lain 2011-06-11 11424
159 Windows Research IE Cache 경로 변경하기 lain 2011-06-09 29447
158 Windows Research 32Bit 윈도우즈에서 실제 물리메모리크기 얻어오기 lain 2011-06-09 11875
157 Windows Research VMWare 탐지 기법 우회 - 2 [2] lain 2011-04-04 25887
156 Linux Tip 우분투에 IRC서버 설치후 닉네임 길이와 동접자 조절. [1] 오랑캐꽃 2010-11-26 14914
155 Linux Tip VirtualBox에 우분투 설치 후에 내부 네트워크 접속 설정하기 file esniper 2010-09-10 32497
154 Linux Tip VirtualBox에서 오른쪽 CTRL키 사용하기(VitualBox 호스트키) file [2] esniper 2010-09-10 17711
153 Linux Tip 우분투 설치 후 putty에서 한글 안 깨지도록 설정하기 file esniper 2010-09-10 15961
152 Linux Tip 우분투 ssh or mysql 서버 접속지연이 있는 경우 해결책 esniper 2010-09-10 15186
151 문서자료 고품질의 무료 아이콘들 [3] esniper 2010-09-08 17948
150 Windows Research Sysinternals - Filemon source code file [5] lain 2010-09-04 14167
149 Windows Research Sysinternals - Regmon source code file [1] lain 2010-09-04 13761
148 Windows Research PostQueuedCompletionStatus 함수에 실패 여부도 고려해야 할까? lain 2010-09-04 12336
147 Windows Research SetEvent 함수는 언제 실패할까? lain 2010-09-04 14289
146 Windows Research 커널모드 드라이버에서 사용하는 시간관련 매크로 lain 2010-09-04 11848
145 Windows Research 화면캡쳐방지는 어떻게 구현될까? [3] lain 2010-09-04 25387
144 Windows Research IRP Completion Hook file lain 2010-09-04 12574

  • 이용약관
  • 개인정보취급방침
  • 사이트맵