Hide Process 2007. 06
목차 I. II. III. IV. V. VI. VII. Process Native API SSDT Hooking Memory Protection Hook Procedure 참고자료 Q & A
PROCESS ▪ Windows 에서 모든 프로그램은 Process 단위로 관리 ▪ 모든 Process는 Thread를 가지고 있음 ▪ EPROCESS 구조체를 이용하여 프로세스들을 관리함. 즉, 모든 Process는 EPROCESS 구조체에 기록된다. 프로세스 환경블록 스레드 블록 Windows 프로세스 블록 핸들 테이블 프로세스 주소공간 시스템 주소공간
EPROCESS ▪ EPROCESS의 구조체의 형태 프로세스 블록들의 리스트 헤드 ActiveProcessLinks
Process 감추기 ▪ EPROCESS 구조체를 사용한 Linked List를 변조
Native API ▪ Windows Native API는 NtXXX, ZwXXX의 두 계열이 있음 • 모든 User Mode Application들은 System Service를 받기 위해 Native API를 호출 • Native API는 SYSENTER를 호출하며 이 명령에 의해 KiSystemService 내부함수가 호출 • KiSystemService는 SSDT를 참고하여 해당 Native API의 Entry Point를 가져 옴 • User Mode 에서의 Native API 호출 - 모두 NtXXX 계열의 API를 호출 • Kernel Mode 에서의 Native API 호출 - NtXXX API 호출 : 직접 System Service 호출(실제 Service Code) - ZwXXX API 호출 : SYSENTER를 호출 -> KiSystemService -> NtXXX API
NtQuerySystemInformation ▪ 프로세스 목록을 요구할 때(작업 관리자) 호출되는 Native API NTSTATUS WINAPI NtQuerySystemInformation( SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength ); IN OUT
NtQuerySystemInformation ▪ 프로세스 목록을 요구할 때(작업 관리자) 호출되는 Native API Application SystemInformationClass = SystemProcessesAndThreadsInformtion Call NtQuerySystemInformation PVOID SystemInformation = _SYSTEM_PROCESS_INFORMATION
_SYSTEM_PROCESS_INFORMATION 다음 프로세스 프로세스의 이름 프로세스 ID
SSDT ▪ System Service Dispatch Table ▪ 이용 가능한 모든 시스템 서비스들의 주소를 가지고 있음 ▪ 인터럽트 발생 시 Windows는 이 테이블을 참고하여 적절한 결과 값을 되돌려 줌
SSDT Hook ▪ SDT에 기록된 시스템 서비스의 Entry Point를 바꿔치기 하는 것
KiServiceTableⅠ ▪ KiServiceTable(SSDT)는 unexported 구조체 ▪ KeServiceDescriptorTable에 KiServiceTable에 대한 단서 존재 typedef struct ServiceDescriptorTable { SDE ServiceDescriptor[4]; } SDT; typedef struct ServiceDescriptorEntry { PDWORD KiServiceTable; PDWORD CounterTableBase; DWORD ServiceLimit; PBYTE ArgumentTable; } SDE; ServiceDescriptor[0].KiServiceTable == SSDT
KiServiceTableⅡ ▪ WINDBG를 이용해 구조체를 살펴볼 수 있음 KiServiceTable[0] == NtAcceptConnectPort KiServiceTable[0] KiServiceTable[1] KiServiceTable[2] KiServiceTable[3]
ZwQuerySystemInformation ▪ 모든 ZwXXX API는 처음 시작이 mov eax, index number 의 형태를 가진다 ▪ Index Number는 OpCode 다음 바이트부터 4바이트를 차지한다 KeServiceDescriptor.ServiceDescriptor[0].KiServiceTable[0AD] == NtQuerySystemInformation
Change Function ▪ NewZwQuerySystemInformation으로 바꿔치기
Memory Protection Change ▪ CR0 Register를 이용해 write protection 제거 Write Protection
NewZwQuerySystemInformationⅠ ▪ 프로세스 이름을 검사하여 Link를 조작함
NewZwQuerySystemInformationⅡ ▪ 프로세스 이름을 검사하여 Link를 조작함 숨기기를 원하는 프로세스 이름이면
참고 자료 1. Win2K Kernel Hidden Process, SIG2 G-TEC 2. Inside Windows Rootkits, SIG2 G-TEC 3. 아무도 모르는 Process, Devguru 4. http://snoya.ye.ro/driver/inwin2k/ch06b.htm Process Internals 5. Attack Native API, Devguru 6. http://somma.egloos.com/2731001, 드라이버 쪼물딱거리기 3탄
Q & A Q & A