2014. 12. 26. 12:11ㆍSecurity ★ Development/Windows Driver
윈도우 커널 드라이버(NDIS) 개발을 하기위한 디버깅 환경 구축 과정을 정리하려합니다.
찾아보면 옛날 ddk와 순수 windbg를 이용한 디버깅 환경이 많이 나옵니다. 저는 최신 비주얼 스튜디오인 2013과 윈7, 그리고 vmware를 이용한 디버깅 환경을 설명하겠습니다. 이렇게 구축을 해놔도 어떤 윈도우 프로그래밍 혹은 웹 프로그래밍보다도 개발 속도가 느립니다. 안드로이드보다도 느리다고 자부할 수 있습니다.
드라이버 개발에 특별한 디버깅 환경이 필요한 이유는 커널에 수정, 작업을 반영하기 때문에 운영체제가 불안정해질 수 있습니다. 본래의 노트북이나 데스크탑에 설치된 운영체제에 그대로 디버깅을 수행하면 개발한 드라이버에 문제가 있을 시 컴파일 에러, 런타임 에러만 내놓고 끝나는게 아니라 해당 운영체제를 쓸 수 없게 됩니다. 실제로 개발중 Target pc에 블루스크린이 떠서 윈7 이미지를 백업해 두는 것이 좋습니다. 또한 브레이크 포인터를 사용하면 커널 작업 수행 중 모든 기능이 정지되므로 별도의 디버깅 os를 두고 본래의 os는 해당 os에 개발한 드라이버를 설치하여 모니터링 하는 환경을 만들도록 합니다.
여기서는 Visual Studio 2013 professional, Vmware player 7.0, 윈7 64비트를 이용한 환경을 사용합니다.
1. 우선 비쥬얼 스튜디오 2013을 설치합니다. 제한이 좀 있는 익스프레스를 제외한 커뮤니티 이상의 버전을 설치합니다. 저는 프로페셔널 사용중입니다.
2. vmware player가 무료이므로 설치합니다. 현재 저는 7.0 버전을 사용중입니다.
3. vmware에 윈7 64비트를 설치합니다. 32비트는 확인 안 해봤습니다. 설치하는 방법은 굳이 설명하지 않겠습니다.
4. http://msdn.microsoft.com/en-us/windows/hardware/gg454513.aspx 여기서 wdk 8.1을 다운받아 Host pc에 설치합니다. 이제부터 본 pc(비쥬얼 스튜디오를 띄우고 프로그래밍을 할 원래의 pc)를 Host pc라고 부르고 vmware에 설치된 윈7을 Target pc라고 부르겠습니다.
5. wdk를 설치한 폴더(C:\Program Files (x86)\Windows Kits\8.1\Remote\x64)에서 WDK Test Target Setup x64-x64_en-us.msi를 Target pc에 설치합니다.
6. vmware의 윈7을 끄고 vmware 해당 os 이미지의 환경설정에 갑니다.
위와 같은 창에 Add를 누릅니다. Serial Port를 선택하고 Next, Output to named pipe 선택 Next, Named pipe에는 \\.\pipe\ndis로 지정해줍니다. 그 아래 콤보박스는 This end is ther server, The other end is an application을 선택 Finish. 다른걸 건드리지 않았다면 위 이미지처럼 Serial Port 2에 pipe가 설정되어 있을 겁니다. 한번 클릭해주고 우측 설정창에서 Yield CPU on poll을 체크해줍니다.
7. Target pc의 os를 켜고 제어판 - 보기 기준 = 큰 아이콘 - 관리 도구 - 로컬 보안 정책 - 로컬 정책 - 사용자 권한 할당을 들어갑니다.
위 이미지처럼 설정해주는데 네트워크에서 이 컴퓨터 액세스는 보통 저렇게 되어 있고 네트워크에서 이 컴퓨터 액세스 거부에 Guest가 있을 겁니다. 이걸 더블클릭해서 설정창을 띄우고 제거해줍니다.
8. Target pc의 cmd창을 관리자 권한으로 실행하고 다음 명령을 쳐줍니다.
bcdedit /debug on (디버그 모드)
bcdedit /dbgsettings serial debugport:2 baudrate:115200 (디버그 포트 설정)
bcdedit /dbgsettings (셋팅 확인)
shutdown -r -t 0 (재부팅)
그리고 계정에 비밀번호를 설정합니다.
vmware는 Nat모드나 bridged모드 중 네트워크 환경에 맞는 모드를 선택합니다. 설명은 생략하겠습니다.
9. Host pc의 비주얼 스튜디오를 실행합니다.
드라이버 프로젝트를 로드하고 wdk를 설치했다면 DRIVER라는 탭이 생겼을 겁니다. DRIVER - Test - Configure computers...를 클릭합니다.
Add New Computer - 다음 클릭, Computer name에는 Target pc의 이름을 적어줍니다. 장치관리자에서 확인할 수 있습니다., Provision computer and choose debugger settings 선택 - 다음 클릭
이후 위와 같은 창에선 똑같이 설정해줍니다. User Mode는 놔둡니다. 다음 클릭
그러면 Target pc의 계정을 입력하라고 나옵니다.
제대로 입력해주면 설정을 합니다. 조금 시간이 걸립니다.
모든 로그가 successfully, succeeded, complete가 뜨면 성공한 겁니다. 하나라도 failed가 뜨면 안됩니다.
10. 디버그 - 프로젝트 속성에 들어갑니다. 구성 속성 - 디버깅에서 Remote Computer Name에 방금 설정한 Target pc를 지정해줍니다. 그리고 Drvier Install - Deployment에서 Enable deployment 체크, Remove previous driver versions before deployment 체크, Target Computer Name은 방금 설정한걸로 지정, Driver Installation Options은 Do Not Install을 체크합니다.
11. f5를 누르면 Target pc에 또다시 드라이버 설정 과정이 진행됩니다. 이 과정을 매번 소스를 수정할 때마다 거쳐야 합니다.
어느정도 진행되면
이런 메시지가 Debugger Immediate Window에 뜰겁니다. 하나라도 pass가 아니면 다시 한번 해주고 계속 pass가 안뜨면 설정을 잘 못 해준겁니다.
12. 그리고 비주얼 스튜디오의 디버깅 상태를 화살표, 일시정지, 네모 버튼 3개로 볼 수 있는데 진행중으로 만들어야 합니다. 11번 상태에서 더 이상 진행되지 않으면(보통 이럴겁니다.) 일시정지를 한번 누르고 다시한번 녹색 화살표를 눌러줍니다. 그럼 다음 메시지가 뜹니다. (일시정지를 하게 되면 Target pc는 조작할 수 없습니다.)
여기서 일시정지를 한번 누르고 계속이 활성화되면 계속을 한번 누릅니다.
그럼 메시지가 이렇게 뜹니다. g는 브레이크가 걸린 상태를 진행시키는 명령어로 브레이크가 걸려있을 때 위 창에서 Debuggee is running... 이 부분에 명령어를 입력할 수 있습니다.
(계속 버튼이 g와 같은 명령입니다.)
13. 아직 드라이버가 Target Pc에 설치되지 않았습니다. Target pc의 c - DriverTest - Drivers 경로에 드라이버 파일들이 생성되어있는지 확인합니다. 생성되어 있다면 드라이버를 설치할 네트워크 어댑터 속성으로 들어갑니다.
설치 - 서비스 - 디스크 있음에서 위 폴더 경로로 갑니다. 거기 보이는 하나의 파일을 선택해주면 네트워크 서비스 선택 창에 위처럼 제조업체와 네트워크 서비스가 뜰겁니다. 서명이 있다는 것을 확인하고 확인을 눌러주면 설치가 됩니다.
로컬 영역 연결 속성 창에 해당 드라이버가 설치되었는지 확인 할 수 있습니다.
14. 이 후 디버그 메시지를 설정했다면 Debugger Immediate Window 창에 메시지들이 출력됩니다.
개발 환경 구축은 끝났고 이제 종료를 살펴보겠습니다. 그냥 디버깅 중지하면 Target pc가 멈춥니다. 그럼 vmware를 강제종료해야하는데 안전하게 종료하는 방법을 알아보겠습니다.
1. Host pc의 비주얼 스튜디오는 놔두고 Target pc의 13번 화면으로 가서 해당 드라이버를 제거해줍니다.
2. Host pc의 비주얼 스튜디오에 Driver Unload 메시지가 나오면 중지를 눌러줍니다. Unload메시지를 설정하지 않았다면 드라이버 제거시
라는 메시지가 뜰 때 중지해주면 됩니다.
이걸로 개발 환경 구축이 완전히 끝났습니다. 설정이 완료된 vmware 윈7 가상이미지는 꼭 하나 복사본을 준비해두고 블루스크린에서 복구할 수 없을 때마다 복사해서 가져다 사용합니다. 그리고 다음부터는 Target pc를 켜고 Host pc의 비주얼 스튜디오에서 f5, Target PC에서 드라이버 설치, 드라이버 제거, Host pc의 비주얼 스튜디오 중지 순으로 개발을 진행하면됩니다.
소스 하나 수정할 때마다 이 과정을 반복해야 하고 혹시라도 메모리 접근을 잘못하거나 기타 에러사항을 만나면 vmware의 os를 재부팅해야합니다. 재부팅이 안되면(복구가 안되면) 약 30기가가 되는 가상 이미지 파일을 다시 복사해야합니다. 혹은 vmware workstation의 스냅샷 기능을 이용하면 좀 더 나은 환경에서 작업할 수 있습니다.
'Security ★ Development > Windows Driver' 카테고리의 다른 글
드라이버 개발 시작 (0) | 2015.11.01 |
---|---|
WFP Driver programming (0) | 2015.03.19 |
NDIS 6.0 Filter Driver programming (0) | 2015.03.13 |