본문 바로가기
정상을향해/OS·Kernel Driver·Rootkit

2장. 커널 조작 - 루트킷 설계

by 사이테일 2014. 1. 10.

루트킷은 하나 이상의 커널 모듈 또는 드라이버 프로그램을 이용한다.


예를 들어 파일을 숨기는 작업을 위한 디바이스 드라이버와 레지스트리 키를 숨기는 작업을 위한 드라이버를 별도로 사용할 수 있다.


이처럼 여러 드라이버에 필요한 기능 코드를 분산시키면 코드 관리가 쉬워진다.


모든 기능을 다 포함해서 제공하는 하나의 통합적인 드라이버를 다루고 코드를 관리하는 것은 힘들기 때문이다.


복잡한 루트킷 프로젝트는 많은 컴포넌트를 가진다.


그런 것들을 하나의 큰 프로젝트 안에 조직적으로 관리하면 편하다.


다음과 같은 디렉토리 구조를 이용하면 복잡한 루트킷 프로젝트에 도움이 될 것이다.



/My Rootkit

/src/File Hider


파일을 은닉하기 위한 코드는 복잡할 수 있으며 그 것을 수행하기 위한 기술에는 여러가지가 있다.


그 중에서 상당히 많은 양의 코드가 필요한 경우도 있다.


예를 들어 어떤 파일 은닉 기술은 매우 많은 수의 함수 콜을 후킹해야 하며 각 함수를 후킹하기 위해서 상당히 많은 코드가 필요하다.



/src/Network Ops


마이크로소프트 윈도우에서 네트워크 관련 기능을 수행하려면 NDISTDI 드라이버 코드가 필요하다.


이런 드라이버 코드는 상당히 큰 경향이 있으며 경우에 따라서는 외부 라이브러리를 이용하기도 한다.


※ NDIS : Network Driver Interface Specification

    TDI : Transport Driver Interface


/src/Process Hider


프로세스 은닉은 Direct Kernel Object Manipulation(DKOM) 기술을 이용한다.


이를 위해 역 어셈블리를 이용해서 구한 데이터 구조체와 기타 다른 정보를 이용한다.



/src/Boot Service


대부분의 루트킷은 컴퓨터가 재부팅되면 다시 자동으로 시작될 필요가 있다.


이를 위해 작은 서비스 프로그램을 이용해서 컴퓨터 부팅 시간에 루트킷을 자동으로 실행시킨다.


컴퓨터의 재시작과 함께 루트킷 또한 자동으로 재시작시키는 것은 복잡한 주제일 수 있다.


하지만 간단한 레지스트리 키 변경 방법을 이용하면 부팅 과정에서 특정 파일을 실행시키는 것이 가능하다.


그런데 레지스트리 변경 방법은 너무나 쉽게 탐지되기 때문에 루트킷 개발자들은 하드디스크 레벨에서 커널을 직접 패치하거나 시스템 부트 로더 프로그램을 수정하는 좀 더 복잡한 방법을 이용한다.



/inc


인클루드 파일들은 일반적으로 typedef, enums, I/O Control(IOCTL) 코드를 포함하며,


다른 파일들에 의해 공통적으로 사용되는 파일들이기에 이 디렉토리에 모아 관리할 필요가 있다.



/bin


컴파일된 파일들은 모두 이 디렉토리에 위치시킨다.



/lib


컴파일러는 자체적으로 사용하는 라이브러리 파일들을 가지고 있다.


이와 마찬가지로 공격자도 추가적인 라이브러리 파일들을 이 디렉토리를 이용해 관리, 사용한다.




출처 : 루트킷 윈도우 커널 조작의 미학 - 에이콘 / 그렉 호글런드, 제임스 버틀러 저