-->

NtQueryInformationProcess를 이용한 안티디버깅

반응형

 

ntdll.dll의 NtQueryInformationProcess를 활용한 안티디버깅 방법과 우회 방법에 대해 알아본다. 참고로 NtQueryInformationProcess는 zwQueryInformationProcess의 wrapper 함수로 동일하다고 생각하면 된다.

 

NtQueryInformationProcess 안티디버깅 방식은 2번째 인자인 PrecessInfomrationClass에 어떤 값을 주느냐에 따라 총 3가지 방법으로 나뉘게 된다. (0x7/0x1E/0x1F)

 

__kernel_entry NTSTATUS NtQueryInformationProcess(
  IN HANDLE           ProcessHandle,
  IN PROCESSINFOCLASS ProcessInformationClass,
  OUT PVOID           ProcessInformation,
  IN ULONG            ProcessInformationLength,
  OUT PULONG          ReturnLength
);

 

 

NtQueryInformationProcess - ProcessDebugPort

디버깅 중에는 디버그 포트가 열린다는 점을 이용, 디버그 포트(ProcessDebugPort)를 체크하는 방법을 사용하는 안티디버깅 방법이다. 디버그 포트 활성화 여부는 커널 모드에서 프로세스를 관리하기 위한 구조체인 EPROCESS의 DebugPort 변수를 통해 확인한다. 

typedef struct _EPROCESS
{
     KPROCESS Pcb;
     EX_PUSH_LOCK ProcessLock;
     LARGE_INTEGER CreateTime;
     LARGE_INTEGER ExitTime;
     EX_RUNDOWN_REF RundownProtect;
     PVOID UniqueProcessId;
     LIST_ENTRY ActiveProcessLinks;
     ULONG QuotaUsage[3];
     ULONG QuotaPeak[3];
     ULONG CommitCharge;
     ULONG PeakVirtualSize;
     ULONG VirtualSize;
     LIST_ENTRY SessionProcessLinks;
     PVOID DebugPort;  // NtQueryInformationProcess()가 이 값을 가져옴
     
     // ...
}

 

 

NtQueryInformationProcess의 2번째 인자에 0x7을 넘겨주면 디버그 포트를 체크할 수 있다. 아래 예를 보면 2번째 인자에 0x7을 주고 있고 현재 디버깅중이기 때문에 3번째 인자로 준 버퍼(ProcessInformation)에 0xFFFFFFFF가 반환된 것을 볼 수 있다. 우회하려면 해당 버퍼 값을 0으로 변경해주면 된다.

 

 

 

NtQueryInformationProcess - ProcessObjectHandle

2번째 인자에 0x1E를 넘겨주면 디버그 오브젝트 핸들(ProcessObjectHandle)을 구할 수 있고 3번재 인자로 넘겨준 버퍼(ProcessInformation)에 핸들 포인터가 담기게 된다. 아래 예를 보면, 현재 디버깅 중인 상태이기 때문에 3번째 인자로 넘겨준 버퍼에 0이 아닌 값이 저장됐고 eax에 0x0이 반환됐다. 우회하기 위해선 버퍼값을 0으로, 반환값은 0xC00003530(STATUS_PORT_NOT_SET)으로 변경하면 된다.

 

 

 

NtQueryInformationProcess - ProcessDebugFlags

마지막으로 위에서 살펴본 디버그 포트 체크, 디버그 오브젝트 핸들 값을 확인하는 방법 외에도 2번째 인자에 0x1F를 주면 ProcessDebugFlags 값으로 디버깅 여부를 플래그로 알려준다. 아래 예를 보면 현재 디버깅 중이기 때문에 3번째 인자(ProcessInformation)으로 준 버퍼에 0x0이 반환됐다. 우회하려면 해당 버퍼 값을 0x1로 변경하면 된다.

 

 

댓글

Designed by JB FACTORY