ML

디버거 환경 탐지 NtQueryInformationProcess(), NtQuerySystemInformation() 우회

728x90
반응형

NtQueryInformationProcess()

 

NtQueryInformationProcess() API를 이용하면 프로세스의 디버깅 관련 정보를 얻어 올 수 있다.

NtQueryInformationProcess MSDN

두번째 파라미터인 PROCESSINFOCLASS ProcessInformationClass의 값에 따라 디버깅 상태를 확인할 수 있는데,

0x07 일 경우 : ProcessDebugPort

0x1E 일 경우 : ProcessDebugObjectHandle

0x1F 일 경우 : ProcessDebugFlags

 

ProcessDebugPort(0x7)

ProcessInformationClass 파라미터에 ProcessDeubgPort(0x7)값을 입력하면 Debug Port를 얻을 수 있다.

만약 프로세스가 디버깅 중이 아니라면 0, 디버깅 중이라면 0xFFFFFFFF 값을 반환한다.

 

ProcessDebugObjectHandle(0x1E)

위와 동일하게 두번쨰 파라미터에 0x1E 값을 넣게 되면 프로세스가 디버깅 중인지 확인할 수 있는데, 디버깅 중이라면 Debug Object Handle 값을 반환하고, 디버깅 중이 아니라면 NULL 값을 반환한다.

 

ProcessDebugFlags(0x1F)

반환값이 0이면 디버깅 상태, 1이면 디버깅 상태가 아니다.

 

회피 방법은, 반환 값을 디버깅 상태가 아닐떄 반환되는 값으로 바꿔주던지,

두번쨰 파라미터 값을 0으로 패치하여 디버깅을 진행

또는, API 후킹을 진행

 

NtQuerySystemInformation()

 

해당 기법은 OS가 Debug Mode로 부팅되었는지를 판단하는 안티 디버깅 기법이다.

※OS Debug Mode

 : WinDbg를 이용한 커널 디버깅을 하기 위해서 기본적으로 시스템 2대를 서로 연결시켜 작업한다. 그 중 디버깅할 시스템의 OS를 Debug Mode로 세팅하여 부팅시키면 Host 시스템의 WinDbg와 연결된다.

 

Windows10 디버깅 모드 설정 방법 : 
https://www.isunshare.com/windows-10/enable-debugging-mode-with-and-without-login-on-windows-10.html

 

Enable Debugging Mode with and without Login on Windows 10

 

www.isunshare.com

첫번째 파라미터인 SYSTEM_INFORAMTION_CLASS SystemInformationClass 파라미터에 원하는 시스템 정보를 입력하면 원하는 정보를 리턴하여준다.

파라미터에 SystemKernelDebuggerInformation인 (0x23)값을 입력하면 현재 OS 시스템이 디버그 모드로 부팅되었는지 알 수 있다. 디버깅일 경우 1을 반환.

 

회피 방법 : Windows 7 -> CMD 창에서 bcdedit /debug off 명령 후 재부팅 하면 일반모드로 부팅.

 

 

 

참고 : 리버싱 핵심원리 , docs.microsoft.com

반응형

댓글

Designed by JB FACTORY