본문 바로가기
카테고리 없음

[ROOTKIT #3] "Hello, world!" 드라이버

by dladbru 2014. 5. 29.

################################################

강의는 City님의 강의를 기반으로함을 재차 말씀드립니다.

################################################


InstDvr.zip

어느 프로그래밍이나 단골로 나오는 "Hello, world!" 드라이버를 만들어 봅니다.
우선 첨부한 InstDrv.zip 을 다운받아서 자신의 룻킷 폴더에 풀어주세요.
 
자신의 c 소스 파일을 열어서 아래와 같이 코딩하고 저장합니다. (제 경우는 empier.c)
코드를 올릴까 하다가 코딩하면서 얻는게 있을거라는 생각에 이미지로 올렸습니다 ;)


[ 코드 해석 ]

 

대문자는 이미 선언된 데이타 타입이나 상수, 매크로에 해당합니다.

예) VOID, NTSTATUS, IN PDRIVER_OBJECT

 

줄번호를 기준으로 해석을 달아봅니다.

 

1   주석문

3   헤더파일

5   MyUnload 함수 Prototype

7~13  드라이버가 로딩될때 시작되는 함수입니다. 함수명은 반드시 DriverEntry 이여야 하며

     두개의 인자; 드라이버 객체 myDriver 와 부수적으로 참조할 수 있는 레지스트리 경로

     myRegistryPath 를 받게됩니다. 드라이버 로딩시 커널은 드라이버 객체를 생성해서

     바로 이곳으로 그 객체를 보내주며 드라이버 작동에 필요한 여러가지 셋업이 이루어집니다. C에서 main함수와 같다고보시면 될것같습니다.

10  디버깅 메시지를 출력해서 이 부분이 수행되고 있음을 알 수 있습니다.

11  드라이버 언로드시 호출하게 될 함수는 MyUnload 라고 설정합니다.

12  상태가 정상적임을 리턴

15~18  드라이버 언로드시 호출되는 MyUnload 함수입니다. 인자로 드라이버 객체가 필요하겠죠?

17  지금은 아무 일도 안하고 단지 디버깅 메시지만 출력합니다.



[ 배치 파일 ] my.bat

 

DDK 실행하여 build 명령어로 컴파일하면 드라이버 파일이 하위 디렉토리

objfre_wxp_x86\i386 에 생성되는데 약간 불편하므로 간단한 배치파일을 만듭니다.

아크로에디터로 빈문서 하나 만들고 아래의 코드를 입력하여 my.bat 로 저장하고 my 를 실행하면

objfre_wxp_x86\i386 에 생성된 드라이버 파일이 현재 룻킷 폴더에 복사됩니다.

 

@echo off
build
copy .\obj%BUILD_ALT_DIR%\i386\*.sys .

 

x86 Free Build Environment 를 실행시키고 cd \MyFirstRootkit 으로 경로를 바꾼후 my 를 실행하면;






제 경우, 드라이버 파일 empier.sys 가 생성되고 현재 룻킷 폴더에 복사됩니다.

혹여, 에러가 나신다면 자신의 c파일이 있는 경로에 생성된 에어로그를 확인해 보셔요

드라이버를 로딩하는 코드를 작성해야 하지만 우선 유틸을 이용해서 테스트해보록 하죠.

첨부했던 파일이 간단한 드라이버 로딩 유틸입니다.

INSTDRV.exe 를 실행하고 지난 시간에 다운했던 Debugview.exe 를 실행합니다.

Debugview 로 디버깅 메시지를 볼 수 있습니다.


 (XP가 아니신분들은 관리자 권한으로 실행해주세요!)


아래처럼 내 드라이버 경로를 적고

- Install : 설치

- Start : 로딩

- Stop : 언로딩

- Remove : 제거




Start, Stop 버튼을 누를때 아래처럼 디버깅 메시지를 볼 수 있고

처음으로 만든 "Hello, world!" 드라이버가 잘 작동됨을 알 수 있습니다.





[ 과제 ]  직접 해 보셔영~ ;)


반응형

댓글