1. 개요
프로세스가 작업 관리자 등에서 나오지 않도록 자기 자신을 숨기는 것을 의미한다.악성 프로그램들은 프로세스로 실행되므로 컴퓨터를 많이 다루는 사용자가 이를 발견하면 작업 관리자 등에서 이를 강제로 종료시킬 수 있다. 그러므로 사용자가 악성 프로그램의 실행 사실을 알 수 없게 조작하는 것을 말한다. 이런 경우 백그라운드 프로세스를 통해 종료해야 하지만, 그것도 현재 악성 프로그램이 실행 중이라는 사실을 알아야 가능하다.
2. 종류
은닉 코드가 어느 영역에서 작동됨에 따라 사용자 모드와 커널 모드로 나뉜다.사용자 모드 - 프로세스의 Win32 API[1]를 직접 후킹하여 원본 Win32 API를 호출하고 반환된 프로세스 목록에서 자신을 빼버리는 것이다. 이렇게 하면 프로그램 화면에서 나오지 않는다. 이를 하는 DLL 파일을 만들고 실행중인 모든 프로세스에 삽입하는 것인데 문제는 이후 실행되는 프로세스는 이 방법이 먹히지 않는다는 것이다. 그러면 이후 실행되는 프로세스에도 DLL 파일을 삽입하도록 프로세스 생성 API도 후킹해야 한다.
커널 모드 - 시스템 콜 테이블 호출[2]을 후킹하면 된다. 커널 모드에서 동작해야 하는 단점이 있지만 실행중인 프로세스는 물론 이후 실행되는 프로세스에도 별도의 후킹 없이 자동 적용되는 장점이 있다. 하지만 루트킷이 아닌 이상 대부분은 사용자 모드를 이용하게 된다.
DKOM(Direct Kernel Object Manipulation) - 커널 모드에서 프로세스 객체(EPROCESS)의 연결 리스트를 직접 조작하여 은닉하는 기법이다. EPORCESS 구조체는 불투명한 구조체[3]이므로 EPORCESS 정보 중 ActiveProcessLinks의 오프셋을 구해서 조작한다.
프로세스의 연결 리스트를 조작하여 목록에서 빼버려도 정상적으로 동작한다. 왜냐하면 윈도우의 스케줄링은 스레드 단위로 동작하고 있으므로 프로세스의 연결 리스트를 조작하여 빼버려도 문제가 되지 않는 것이다. 참고로 이를 응용하면 드라이버도 숨길 수 있다.
단점은 윈도우 업데이트마다 오프셋이 바뀔 수 있기에 업데이트에 대응하여 변경된 오프셋을 알아내고 적용해야 한다. Windows 10과 Windows 11의 경우 빌드마다 오프셋이 바뀐다.
3. 탐지 방법
어떤 방법이든 메모리 단위로 검사하면 다 알 수 있다. 메모리를 파일로 덤프하고 프로그램을 이용해서 그 파일을 검사하면 모든 프로세스를 확인할 수 있다.
[1]
주로 ntdll.dll의 NtQuerySystemInformation 함수를 후킹한다.
[2]
윈도우는 SSDT
[3]
몇몇 구조체는 공개되어 있지 않은 불투명한 구조체인 경우가 있다. SDK에서는 이들 구조체는 void*로만 되어 있다.