최근 대부분의 보안제품이나 웜바이러스가 유행처럼 SSDT 후킹기법을 사용해서 작동합니다. 이제는 더이상 SSDT 후킹도 최신기술이 아닌 범용기술이 되었습니다. 그래서 점점더 보안소프트웨어와 해킹툴/웜바이러스간의 장벽이 사라지고 있다고 보여집니다. 다양한 해킹기법을 사용한 보안 소프트웨어도 점점더 웜바이러스처럼 견고해지고 있습니다만, 이것은 결국 닭이 먼저나 달걀이 먼저냐의 문제로 보여집니다. 그래서 최근에는 탐지가 쉬운 SSDT 후킹대신에 DKOM 기법을 사용하여 SSDT 후킹 탐지에 걸리지 않는 기법들을 사용하는 추세입니다. DKOM은 의미그대로 직접적으로 커널 오브젝트를 조작하는 방법으로 SSDT 후킹으로 프로세스 숨기기나 네트워크 포트 연결 숨기기가 같은 스텔스 기능을 똑같이 구현할 수 있습니다.
DKOM이 좋은 한가지 예는 보안소프트웨어 자체를 외부의 디버깅이나 프로세스 어태치로부터 자신을 보호하기 위해서 자기자신을 프로세스에서 안보이게 하여 리버싱을 방지하려고 하는 노력도 한가지 예가 될 수있습니다.
1) DKOM으로 숨기기 기법을 한마디로 요약하면
- 모든 운영체제는 메모리에 계정정보를 보통 구조체 형태나 오브젝트 형태로 저장합니다.
- 구동되고 있는 프로세스 리스트를 알아내기 위한 함수가 바로 ZwQuerySystemInfomation() 함수입니다.
- 프로세스 리스트는 EPROCESS 구조체라는 Doubly Linked List 형태로 구성되어 있습니다.
- EPROCESS 구조체는 FLINK와 BLINK를 멤버로 하는 LIST_ENTRY 구조체를 가지고 있습니다.
- 현재 구동중인 프로세스의 주소(EPROCESS 구조체)는 PsGetCurrentProcess 함수를 호출하여 찾을 수 있습니다.
- PsGetCurrentProcess함수의 실제 함수는 IoGetCurrentProcess 함수가 됨
- 이 함수를 디스어셈블하면
mov eax, fs:0x00000124; <-- IoGetCurrentProcess 함수
mov eax, [eax + 0x44]; <-- _EPROCESS의 오프셋
ret
결론적으로 EPROCESS의 BLINK와 FLINK를 포인터를 조작해서 Rootkit 코드의 프로세스를 Skip하도록 FLINK, BLINK포인터를 조작하면 윈도우즈의 작업관리자(taskmgr.exe)에서 해당 Rootkit 프로세스가 보이지 않게 된다.
보통 SSDT 후킹으로 프로세스를 숨기는 경우에는 SSDT 후킹여부를 탐지 및 복구가 가능하지만 DKOM은 탐지가 휠씬 어렵다.
2) 디바이스 드라이버 숨기기
로드된 디바이스 드라이버를 안보이게 하는 기법도 DKOM 기법을 사용해서 구현할 수 있습니다.
디바이스 드라이버 오브젝트인 DRIVER_OBECJ 구조체에서 오프셋 값 0x14 위치에 MODULE_ENTRY 오브젝트라고 하는 것이 있습니다. 이 MODULE_ENTRY 역시 Dubly linked 리스트 구조로 FLINK/BLINK로 각 드라이버 리스트를 정보를 파악하게 되는데 이 FLINK/BLINK 값을 조작하면 Rootkit 커널 드라이버를 드라이버 리스트에서 안보이게 할 수 있습니다.
typedef struct _MODUL_ENTRY {
LIST_ENTRY module_list_entry;
DWORD unknown1[4];
DWORD base;
DWORD driver_start;
DWORD unknown2;
UNICODE_STRING driver_Path;
UNICODE_STRING driver_Name;
} MODULE_ENTRY, *PMODULE_ENTRY;
참조) Rootkit.com 책 참조했습니다.



덧글
까마구 2007/07/05 05:31 #
DKOM이 어떤기법인가 궁금했었는데, 프로세스 링크를 건드리는 방법이군요.물론 저렇게 숨기면 조금 까다롭긴 합니다만, 이것 또한 내 커널 모듈이 먼저 올라가서 프로세스 생성이나 드라이버 로드를 감시하고 있으면 딱 걸린다는.. ㅜ_ㅜ
뭐든 타이밍인것 같습니다.