본문 바로가기

자료

루트킷 프로세스 숨기기(Hiding the Rootkit Process -1)

728x90

 

블로그 인기글

● 메이플스토리 신규 룬패치/자동해제 프로그램 [링크 이동]

● 메이플스토리 거짓말탐지기 알림 프로그램 [링크 이동]

C#에서 TensorFlow 사용하는법 [링크 이동]


 

루트킷은 다양한 방법을 사용하여 프로세스가 탐지 및 종료되지 않도록 숨 깁니다. userland 루트킷이 탐지를 피하기 위해 사용할 수있는 가장 좋은 방법 중 하나는 NtOpenProcess 함수를 연결하고 해당 프로세스에 대해 부정적인 결과를 반환하는 것입니다. 이것은 대부분의 탐지 방법으로부터 루트킷 프로세스를 보호 할뿐만 아니라 종료를 방지 할 수 있습니다.

그러나 안티 루트킷 소프트웨어는 일반적으로 NtQuerySystemInformation을 사용하여 모든 프로세스 ID, 숨겨진 프로세스를 발견하기 위해 프로세스와 관련된 다양한 핸들을 열거합니다. 이러한 탐지를 방지하기 위해 루트킷은 NtQuerySystemInformation을 연결하고 모든 트랙을 포함하도록 결과를 조정합니다.


  • 숨겨진 루트킷 프로세스 감지

 

숨겨진 프로세스를 탐지하는 것은 루트킷이 하나 이상의 방법을 사용하여 존재를 커버 할 수 있기 때문에 똑같이 어렵습니다. 다음은 이러한 루트킷 프로세스를 탐지하는 매우 효과적인 방법입니다.

이러한 모든 감지 방법은 일반적인 접근 방식에서 작동합니다. 먼저 실행중인 프로세스 목록은 EnumProcesses 또는 Process32First와 같은 표준 API 함수를 통해 얻습니다. 그런 다음 아래 방법 중 하나를 사용하여 프로세스를 열거 한 다음 해당 목록을 표준 기능을 통해 이전에 얻은 목록과 비교하여 숨겨진 루트킷 프로세스를 찾습니다.


  •  직접 NT 시스템 호출 구현을 사용하는 HPD

이것은 숨겨진 사용자 영역 루트킷 프로세스를 탐지하는 매우 효과적인 방법입니다. 잘 알려지지 않은 프로세스 열거 방법 중 하나는 첫 번째 매개 변수를 SystemProcessesAndThreadsInformation으로 전달하여 NtQuerySystemInformation 함수를 사용하는 것입니다. 이 방법의 단점은 NtQuerySystemInformation 함수를 후킹 한 다음 결과를 조작하여 쉽게 우회 할 수 있다는 것입니다.

NtQuerySystemInformation은 기본적으로 사용자에서 커널 영역으로 전환 할 코드가 몇 줄없는 스텁입니다. 마지막으로 커널 내에서 NtQuerySystemInformation 함수를 호출합니다. 따라서 여기서 트릭은 함수를 직접 호출하지 않고 NtQuerySystemInformation을 구현하는 것입니다.

다음은 다양한 플랫폼에서 NtQuerySystemInformation을 직접 구현하는 방법을 보여주는 샘플 코드입니다. Windows2000에서 INT 2E 및 XP부터는 'sysenter'명령을 사용하여 사용자에서 커널로 전환합니다.

__declspec(naked)
  NTSTATUS __stdcall DirectNTQuerySystemInformation
          (ULONG SystemInformationClass,
		  PVOID SystemInformation,
		  ULONG SystemInformationLength,
		  PULONG ReturnLength)	
  {
										
										
	  //For Windows 2000
	  if( OSMajorVersion == 5 && OSMinorVersion == 0 )
	  {
		__asm
		{
			mov eax, 0x97
			lea edx, DWORD PTR ss:[esp+4]
			INT 0x2E
			ret 0x10
		}	
	
	}	
	
	//For Windows XP
	if( OSMajorVersion == 5 && OSMinorVersion == 1 )
	{
		__asm
		{
				mov eax, 0xAD     
				call SystemCall_XP
				ret 0x10
				
			SystemCall_XP:
			
				mov edx, esp
				sysenter
		}	
	
	}									
										
	//For Windows Vista & Longhorn
	if( OSMajorVersion == 6 && OSMinorVersion == 0 )
	{
		__asm
		{
				mov eax, 0xF8    
				call SystemCall_VISTA
				ret 0x10
				
			SystemCall_VISTA:
			
				mov edx, esp
				sysenter
		}	
	}
	
	//For Windows 7
	if( OSMajorVersion == 6 && OSMinorVersion == 1 )
	{
		__asm
		{
				mov eax, 0x105    
				call SystemCall_WIN7
				ret 0x10
			SystemCall_WIN7:
				mov edx, esp
				sysenter
		}	
	}					
										
										
     }								
  }

이 기술은 모든 사용자 영역 루트킷 프로세스를 발견 할 수 있으며 루트킷 프로세스가이 기술을 물리 칠 수있는 유일한 방법은 커널로 이동하는 것입니다. 그러나 낮은 수준의 구현으로 인해 프로덕션 코드에서이 방법을 사용하는 데 약간의 위험이 있습니다.

728x90