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

  

커널 디버거 탐지 기법 우회

Windows Research 조회 수 17140 추천 수 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
번호 제목 글쓴이 날짜 조회 수
43 문서자료 SCSI Multi-Media Commands - 5 (MMC-5) file lain 2010-09-03 11083
42 문서자료 Seagate - SCSI Commands Reference Manual file lain 2010-09-03 11294
41 문서자료 Intel® Threading Building Blocks: Documents lain 2010-09-03 10746
40 문서자료 Mozilla - Accessibility/AT-Windows-API lain 2010-09-03 8916
39 문서자료 Win32 Assembly Tutorials [1] lain 2010-09-03 10975
38 문서자료 the Operating System resource center lain 2010-09-03 10560
37 문서자료 Bona Fide OSDev Documents lain 2010-09-03 10290
36 문서자료 Keybaord Scan Codes Demystified lain 2010-09-03 10445
35 문서자료 Intel i80x86 CPU Architecture lain 2010-09-03 11032
34 문서자료 Hexray - Failures and troubleshooting lain 2010-09-03 11543
33 Windows Research 윈도우즈 버전이 Windows XP SP2인지 확인하는 다른 방법 [1] lain 2010-09-03 21421
32 Windows Research 유저 레벨에서 API Hook 1부 file [1] lain 2010-09-03 22482
31 Windows Research 유저 레벨에서 API Hook 2부 file [2] lain 2010-09-03 19716
30 Windows Research IDA에 HexRay를 사용할 때의 주의점 [1] lain 2010-09-03 15622
29 Windows Research IDA에서 Microsoft 바이너리 파일을 리버싱 할 때 디버그 심... file [1] lain 2010-09-03 16632
28 Windows Research 커널 모듈 리스트 가져오기 [3] lain 2010-09-03 17369
27 Windows Research VMWare 탐지 기법 우회 [2] lain 2010-09-03 22881
» Windows Research 커널 디버거 탐지 기법 우회 lain 2010-09-03 17140
25 Windows Research ZwQueryInformationFile을 비동기 파일핸들로 호출 시 STATUS... file lain 2010-09-03 15525
24 Windows Research DosPathNameToNtPathName file lain 2010-09-03 13740

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