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

[ROOTKIT #6] 간단한 드라이버 로더

by dladbru 2014. 6. 22.
>잘안보이는 스샷은 클릭하셔서 확대해서 보시면 됩니다!<

지난 시간에는 드라이버를 로딩하기 위해 INSTDRV.exe 유틸을 사용했으나
이번에는 자신이 직접 로딩하는 간단한 드라이버 로딩 프로그램(유저모드) 작성을 알아봅니다.
Service Control Manager(SCM) 을 이용하게 되는데 우선 SCM 핸들을 구해온후
내 드라이버 서비스를 만들고 서비스를 시작함으로써 로딩이 완료됩니다.
마찬가지로 SCM 핸들과 내 드라이버 서비스 핸들을 구해온 후 서비스를 중지시키고 삭제함으로써
언로딩이 완료됩니다.
 




[ 코드 해석 ]


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

 

9   드라이버 이름을 deitycity 로 정합니다.

10   드라이버 경로를 c:\MyFirstRootkit\empier.sys 로 정합니다.

12~23   로딩함수를 호출한후 유저가 엔터를 치면 언로딩함수가 호출되는 간단한 메인 함수

25~69   드라이버 로딩 함수

27   SCM 핸들 변수 선언

28   내 드라이버 서비스 변수 선언

30   OpenSCManager 함수를 호출하여 SCM 핸들을 구합니다.

31~34   SCM 핸들 오픈 실패시 처리

36~48   CreateService 함수를 호출해서 내 드라이버 서비스를 만듭니다.

           인자로 SCM 핸들, 내 드라이버 이름 MY_DRIVER, 경로 MY_PATH 가 사용되고 있슴에 주목

49~56   내 드라이버 서비스 생성 실패시 처리

50   이미 서비스가 생성되어 있기때문에 실패했을 수도 있기에 OpenService 함수를 호출하여

      한번 서비스 핸들만 구해봅니다.

51~55   서비스 핸들만 구하는 것도 실패시 처리

53   열린 핸들을 닫음

58~64   StartService 를 호출하여 내 서비스를 시작하며 실패시 이미 서비스가 시작되었기때문에

           실패한 것인지 확인후 처리 (GetLastError 함수는 마지막으로 발생한 에러코드를 구해옴)

61~62, 66~67   열린 핸들을 닫음

71~107   드라이버 언로딩 함수

77   OpenSCManager 함수를 호출하여 SCM 핸들을 구합니다.

83   OpenService 함수를 호출하여 내 드라이버 서비스 핸들을 구합니다.

90   ControlService 함수를 SERVICE_CONTROL_STOP 인자로 호출하여 서비스를 중지시킵니다.

97   DeleteService 함수를 호출하여 내 드라이버 서비스를 삭제합니다.

104~106   열린 핸들을 닫음

 

 

아래는 위 코드를 저의 경우 VisualStudio6.0 으로 컴파일한후 실행한 화면입니다. (최신컴파일러인 2013도 컴파일이 문제없을겁니다!)

 



 

 

[ 과제 1 ] 코딩도 직접 해보시고 MSDN 등으로 오늘 사용된 여러가지 Service 관련 함수들을 찾아보고

               각각의 인자들에 대해서 더 자세히 알아보셔영~ :)

 

- OpenSCManager

- CreateService

- OpenService

- StartService

- ControlService

- DeleteService

 

[ 과제 2 ] MY_PATH 를 위와 같이 상수로 하지 말고 현재 폴더에 있는 .sys 를 사용하게끔 변수로 바꿔서

               코드를 수정해보셔영~ :)     (힌트: GetCurrentDirectory)


반응형

댓글