본문 바로가기

정상을향해48

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.
2장. 커널 조작 - 루트킷 설계 루트킷은 하나 이상의 커널 모듈 또는 드라이버 프로그램을 이용한다. 예를 들어 파일을 숨기는 작업을 위한 디바이스 드라이버와 레지스트리 키를 숨기는 작업을 위한 드라이버를 별도로 사용할 수 있다. 이처럼 여러 드라이버에 필요한 기능 코드를 분산시키면 코드 관리가 쉬워진다. 모든 기능을 다 포함해서 제공하는 하나의 통합적인 드라이버를 다루고 코드를 관리하는 것은 힘들기 때문이다. 복잡한 루트킷 프로젝트는 많은 컴포넌트를 가진다. 그런 것들을 하나의 큰 프로젝트 안에 조직적으로 관리하면 편하다. 다음과 같은 디렉토리 구조를 이용하면 복잡한 루트킷 프로젝트에 도움이 될 것이다. /My Rootkit/src/File Hider 파일을 은닉하기 위한 코드는 복잡할 수 있으며 그 것을 수행하기 위한 기술에는 여러가.. 2014. 1. 10.