[ 코드 해석 ]
줄번호를 기준으로 해석을 달아봅니다.
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)
댓글