드라이버 쪼물딱 거리기 1탄 시스템 프로그래밍

요즘 들어 바이러스나 스파이웨어같은 녀석들도 커널 드라이버를 통해서 시스템콜을 후킹하거나
커널 오브젝트를 수정하거나 하는 일들을 자주 볼 수 있습니다.
이런 기술들에 대해서 블로그를 통해서 조금씩 시간날때 마다 얘기해 보려고 합니다.

원래 사내 교육용으로 문서를 만들다가 .. 걍 블로그에도 함께 올리는 거구요 ^^
읽고 조금이나마 도움이 되었다면 트랙백이나 댓글 팍팍 달아주셈.
호응이 없으면 안 할지도 몰라요 :-)

또한 소스코드나 문서(?) 는 맘대로 사용해도 좋습니다만 주인이 바뀌지만 않았으면 합니다.
서로 얼굴 붉힐일 없으면 좋겠네요.




1탄 - 개발 환경 구축

DDK

드라이버개발을 위해서는 DDK 가 필요하다.
DDK 는 드라이버 개발을 위해 필요한 헤더파일이나 라이브러리들을 제공하는데 드라이버 개발을 위해 반드시 DDK 가 필요한 것은 아니다. 필요한 헤더나 라이브러리를 직접 만들 수도 있다. 그러나 결코 영장류의 사고능력을 가진 사람이라면 선택하지 않을 방법일 것이다. (예로 holy_father 라는 유명한 해커는 DDK 를 pascal 로 포팅해서 Delphi 로 드라이버를 만들기도 한다.)

이 문서에서는 최신 DDK 버전인 windows 2003 sp1 (3790) 을 사용한다.

최근에는 MS 에서 다시 DDK 를 공짜로 다운로드 받을 수 있도록 한다고 하니 알아서 다운받아서 설치하기 바란다.


개발 환경 구축
Driver 는 기본적으로 command line utility 인 build 명령을 통해 Makefile, sources 파일을 참조해서 빌드를 한다.
이는 통합 개발 환경(IDE)하에서 개발을 하던 일반 개발자들(특히 윈도우 계열에서)에게 매우 불편한 환경이 아닐 수 없다.

Visual studio 를 통해서 DDK 의 빌드 환경을 만드는 방법에는 여러 가지가 있는데
- driver studio 를 이용하는 방법
- 월터 오니 아저씨의 WDM wizard
- Vs 의 옵션을 수동으로 바꿔서 만드는 방법
- Ddkbuild
등이 있다.

개인적으로 DDKBuild 가 가장 훌륭하다. 이 문서에서는 DDKBuild 를 이용한 개발환경을 사용할 것이다.

http://www.hollistech.com/Resources/ddkbuild/ddkbuild.htm
DDKBUILD 는 위의 링크에서 받을 수 있으며 단순히 배치 파일이다.
이 글을 쓰고 있는 현재 최신 버전은 3.13 이다.

다운로드 한 DDKBUILD 를 압축을 풀고 vs .net 이 참조 가능한 패스에 복사한다.
(e.g. C:Program FilesMicrosoft Visual Studio .NET 2003Vc7in)

DDKBUILD 에게 사용할 DDK version 을 알려주기 위해 약간의 편집을 해야 한다.



이것은 DDKBUILD 에게 Windows 2003 Server 또는 W2K3SP1 DDK 환경을 사용하겠다고 알려주는 것이며 경로는 알아서 설치경로를 적어주면 된다.
자세한 내용은 홈페이지에서 확인하기 바란다.



그림 처럼 메이크 파일을 생성하고, 명령줄을 입력하면 된다.

참고로 드라이버는 일반 어플리케이션과는 달리 debug build/release build 라고 하지 않는다.
Debug build ----- checked build
Release build ----- free build

ddkbuild 스크립트의 명령줄 파라미터는 아래와 같다. 
ddkbuild.bat    target    build_type    root_path 

예를 들어 드라이버를 release 로 빌드하고, SOURCES 파일에 나열된 파일들의 root 경로가 현재 디렉토리라면(.\) 아래와 같이 명령줄을 작성하면 된다. 

ddkbuild –WNET free . 




핑백

  • » compile ddk 2008-04-03 18:49:52 #

    ... http://somma.egloos.com/2710282</a> http://blog.naver.com/pfool/100035568659     http://www.microsoft.com/whdc/devtools/ddk/default.mspx 중간쯤보면 그림에서 보는것 같이 Download the Windows Server 2003 SP1 DDK [236 MB ISO file] 를 클릭하면 ISO 파일을 받을수 있다. 위 버전을 설치하면 Window ... more

덧글

  • Mins 2006/09/21 17:58 # 삭제 답글

    우헤헤.. 제가 젤 빨리 찾아왔음.....
    맨날 귀찮다고 하시면서.. 이런걸 다 준비하시다니.. ㅋㅋㅋ 역시 소마형은 절라 멋져요.. - _-)=b
  • somma 2006/09/21 18:50 # 답글

    오.. 민쓰가 일등이네.. 돈있으면 맛있는거 사먹지 말구.. 나 술사줘 -_-;;
  • seyool 2006/09/26 14:58 # 삭제 답글

    소망형님 고맙습니다 ㅋㅋ

    set WNETBASE=C:/Progra~1/WINDDK/3790.1830

    저는 이렇게 하니까되네요.. 뛰어쓰기에 민감하네요
    / 을 역슬레쉬로 바꿔서 하면 되요.. +_+
  • 홍가이버 2006/12/22 10:24 # 삭제 답글

    헉...죄송...트랙백이 두번이나..^^
    좋은글 잘보고 갑니다...
  • somma 2006/12/22 11:25 # 답글

    홍가이버 / 트랙백 하나는 지웠습니다. ^___^
  • rainrunabl 2007/03/21 23:30 # 삭제 답글

    제가 somma님 글을 Visual Studio 2005와 연동하는것으로 아주 약간 변경해 보았습니다. ^^

    http://blog.naver.com/pfool/100035568659
  • somma 2007/03/22 11:36 # 삭제 답글

    rainrunable / 제가 설명한것 보다 훨씬 좋은데요? ^^
  • wany 2007/10/09 10:15 # 삭제 답글

    안녕하세요..

    DDK를 이용해서 빌드를 하고 있는데요..
    참 좋은 글 같습니다.
    그런데.. DDK로 폴더 a, b, c를 따로따로 빌드를 하고 있는데요..
    각 폴더 a, b, c는 각가의 sources 파일이 있고 각각 dll로 만들어집니다.

    이것을 vs2005에서 DDKbuild를 이용하여
    하나의 project내에서 각각 빌드를 하려면 어떻게 해야 하나요?

    제가 vs2005 사용하는데는 초보자라서...
    아시면 부탁드려요..
  • somma 2007/10/09 17:27 # 삭제 답글

    > 그런데.. DDK로 폴더 a, b, c를 따로따로 빌드를 하고 있는데요..
    > 각 폴더 a, b, c는 각가의 sources 파일이 있고 각각 dll로 만들어집니다.

    dll 이 아니라 sys 겠죠?
    각각의 sources 파일을 가지고 있다면 각 폴더는 VS2005 에서 서로 다른 프로젝트로 만들어져 있지 않나요?
    그렇다면 프로젝트들을 관리하고 있는 솔루션을 빌드해 버리면 모든 프로젝트들이 모두 빌드 될텐데요 ^^
    잘 안되는 경우라면 배치파일을 하나 만들어서 빌드 명령줄에 생성하신 배치파일을 호출하게 하는것이 편할듯 하네요.
  • wany 2007/10/09 18:10 # 삭제 답글

    답변 감사합니다.

    한가지 더 문의드려요..
    빌드를 하고서, 생성된 파일 위치를 알고 있어서 이파일을 원하는 곳으로 복사하고 싶은데요..

    vs2005의 메뉴를 찾아봐도 어떻게 해야 할지.. ^^;

    빌드 후에 별도의 bat 파일을 실행시키면 좋겠는데.. 어떻게 할 수 있는지 아시나요?


  • somma 2007/10/09 23:04 # 삭제 답글

    프로젝트 속성 ->구성 속성 -> 빌드 이벤트 -> 빌드 후 이벤트
    명령줄에 배치 파일이나 명령어를 입력하시면 됩니다.

    copy /Y "$(InputDir)some_header.h" "..Releasesome_header.h"

    이런 식으로요~~ ^^
  • 미친감자 2008/04/03 22:15 # 답글

    허거덕--;;;
    삽질했습니다.
    "G:MyDocVisual Studio 2008ProjectsFileMon" 에서 빌드할때는 안되던것을
    "I:FileMon" 으로 하니까. 되네요--;;;
    경로에 공백이 있으면 안되나봐요.........
  • includex 2011/01/15 14:06 # 삭제 답글

    유용한 정보 정말 감사합니다.^^ 하나 수정해 주셨으면 하는 부분이 있는데요.
    '주의할 것은 free 또는 checked 뒤에 . (콤마) 를 반드시 찍어줘야 한다. '
    콤마가 아니라 닷, dot, 점이라고 괄호 부분을 수정해주셨으면 해요. 저기 경로가 들어가는 부분 맞죠?
    에러가 나서 왜 안되하고 하고 봤더니 dir이 들어가는 부분에 ,를 넣는건 왠지 이상하다 싶어 고쳤더니
    되더라고요.
  • somma 2011/01/17 07:15 #

    고쳤어요. ㅎㅎ
댓글 입력 영역