본문 바로가기

정상을향해/OS·Kernel Driver·Rootkit15

2장. 커널 조작 - 재부팅시 자동 시작 루트킷 드라이버는 시스템이 부팅되는 시점에 로드되어야 한다. 이 문제에 대해 곰곰이 생각해 보면, 시스템이 부팅되는 시점에 로드되는 소프트웨어가 상당히 다양하고 많다는 사실을 깨닫게 될 것이다. 다음은 시스템에 부팅되는 시점에 루트킷을 로드할 수 있는 다양한 방법이다. Run 키를 이용 (오래된 신뢰할 수 있는 방법) Run 키를 이용하면 임의의 프로그램을 부팅 시점에 실행시킬 수 있다. Run 키에 의해 실행된 프로그램은 자신에게 삽입된 루트킷 파일을 생성해서 그것을 로드한다. 로드된 루트킷은 탐지되지 않기 위해 자신을 위한 Run 키의 값을 감출 수 있다. 모든 바이러스 스캐너는 Run 키를 검사하기 때문에 이 방법은 상당히 위험한 방법이다. 하지만 루트킷이 일단 로드되면 키 값은 보이지 않게 된다... 2014. 1. 15.
2장. 커널 조작 - 파일 핸들 생성 및 심볼릭 링크 추가 파일 핸들 생성 유저 모드 프로그램이 커널 드라이버를 사용하려면 유저 모드 프로그램은 해당 드라이버의 핸들을 구해야 한다. 이것은 드라이버가 이름 있는 디바이스로서 등록된 경우에만 가능하다. 일단 드라이버가 이름 있는 디바이스로 등록했다면 유저 모드 프로그램은 파일의 경우와 동일한 방법으로 디바이스 이름을 이용해 핸들을 수할 수 있다. 이는 유닉스에서 모든 것이 파일로 취급되는 것과 상당히 유사하다. 다음은 커널 모드 드라이버가 디바이스를 등록하는 과정을 보여주고 있다. const WCHAR deviceNameBuffer[] = L"\\Device\\MyDevice"; PDEVICE_OBJECT g_RootkitDevice;// 디바이스 오브젝트에 대한 전역 포인터 변수 NTSTATUS DriverEnt.. 2014. 1. 10.
2장. 커널 조작 - 디바이스 드라이버 기본 개념 루트킷은 유저 모드(User Mode)와 커널 모드(Kernel Mode) 요소를 모두 쉽게 포함할 수 있다. 유저 모드에서는 네트워킹, 원격 제어와 같은 대부분의 기능을 담당하고, 커널 모드에서는 은닉 기능과 하드웨어 접근에 관련된 기능을 담당한다. 대부분의 루트킷은 커널 레벨에서의 조작을 필요로 한다. 유저모드와 커널모드 요소를 모두 포함하고 있는 루트킷 유저 모드 프로그램은 커널 레벨 드라이버와 다양한 방법으로 서로 통신할 수 있다. 그 중에서 가장 일반적인 방법이 I/O Control(IOCTL) 명령을 이용하는 것이다. IOCTL 명령은 유저 애플리케이션과 커널 드라이버간의 통신을 위해서 프로그래머가 정의하는 명령이다. 유저 모드와 커널 모드 요소를 모두 포함하는 루트킷을 만들기 위해서는 이후에.. 2014. 1. 10.
2장. 커널 조작 - 윈도우 디바이스 드라이버 개발 윈도우 XP와 윈도우 2000 플랫폼에서 동작하는 간단한 디바이스 드라이버를 작성해보자. 다음은 단순히 "Hello World!"를 출력하는 디바이스 드라이버다. mydriver.c #include "ntddk.h" NTSTATUS DriverEntry ( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath ) { DbgPrint("Hello World!"); return STATUS_SUCCESS; } 이 코드를 커널에 로드해 동작시키면 디버그 문자열이 출력될 것이다. Device Driver Development Kit (DDK) 윈도우 디바이스 드라이버를 개발하려면 Driver Development Kit(DDK)이 필요하다... 2014. 1. 10.