카테고리 없음

1. Windows Driver Dev sys File Test Sign

MasterJ 2011. 6. 7. 09:43

Windows 64비트로 드라이버 포팅

Windows 64비트로 드라이버 포팅 할 일이 생겼다.
아래의 문서와 링크를 참고한다.

윈도우 커널모드 드라이버 64비트 포팅.ppt

http://support.microsoft.com/kb/888728/ko

————–

64bit 플랫폼은 x64와 IA64가 있다.
IA64는 진정한 Real 64bit 운영체제를 위한 CPU로써 인텔 HP Microsoft의 공동 작품.
그리고 x64는 AMD에서 인텔의 64비트 프로세서에 대응하기 위해 Memory Addressing 영역을 2의 64승까지 늘린 프로세서.
IA64는 비싼가격이기에 보통 일반 유저는 사용하지 않는다.

————–

빌드시 error C2220: warning treated as error – no ‘object’ file generated 에러가 난다면 아래를 Sources 파일에 추가한다.

1.!if $(FREEBUILD)
2.MSC_WARNING_LEVEL=/W1
3.!else
4.MSC_WARNING_LEVEL=/W3
5.!endif

그래도 안되면.. /W1 부분을 /W0 으로 변경한다.

————–
64비트 드라이버는 반드시 인증을 거쳐야한다.
인증을 받지 않은 드라이버는 로딩조차 되지 않는다.

설치시 아래와 같은 화면이 뜬다.
ivory2

아래와 같이 사용할 수 없다.
ivory

개발시에는 테스트 모드로 부팅해서 개발이 가능하다.
하지만 어차피 인증은 받아야 하는데, 대략 1년에 40만원 정도라한다.
인증 방법은 여기, 여기 를 본다.

인증 업체는 아래와 같다.

Baltimore CyberTrust
Equifax Secure
GTE CyberTrust
GlobalSign
GeoTrust
VeriSign

——————
윈도우즈 7 테스트 모드로 변경 및 드라이버 파일(.sys) 에 테스트 사인 삽입 프로그램
(개발자들이 필요한 프로그램)

dseo13b.7z

sc

——————

아래는 64비트에 와서 갑자기 인증 방법이 왜 생겼는지에 대한 마소의 답변이다.

결론: 보안을 위해서 인증을 사용한다.

출처: http://www.driveronline.org/bbs/view.asp?tb=systembbs&no=12

대충의 내용을 살펴보면 아래와 같습니다.

Q. kernel-mode code signing을 하는 이유는 무엇이냐
커널 모드 code를 사용하는 악성코드가 많이 늘어났기 때문에

Q. 32Bit는 안하고 64Bit 에서만 하는 이유는?
32Bit를 할경우 이미 많은 드라이버가 설치 되어 있어서 문제가 많이 발생한다.
아주 적은 Driver 만이 64Bit에서 동작하고 있기 때문에 64Bit에서만 한다.

Q. 32Bit version을 가지고 있는데 signed 받아야 하나?
64Bit 모듈과 32Bit 모듈 둘다 제공 한다면 MS에서는 인증 받으라고 권하고 있다.

Q. 왜 그룹 Policy 적책으로 신뢰하게 하지 않는가
악성코드들이 이용할 수 있기 때문에 MS 에서는 허용하지 않는다.

Q. 왜 VeriSign 으로 부터 $499 짜리 인증서가 필요한가?
믿을만한 인증기관에서 인증을 받아야 한다고 한다. 전세계에 판매하는 Software에서 $499는 작은 돈이라고 한다.

Q. 왜 VeriSign만 되는가 다른 CA가 안되는 이유?
현재 MS가 OCA, WER 에서 VeriSign의 인증을 사용하고 있기 때문이고 다른 CA하고도 진행중이다.

Q. $500은 나에게 비싸다 다른 방법이 없겠나?
^^; 인증을 받는것이 더 좋다는 이야기 뿐이네요

Q. 이것은 DRM 적책의 시작인가?
아니다 보안과 품질을 향상 시키고자 하는 것이다.

Q. 왜 Windows Logo, DRS대신 signing 이 필요한 것인가?
Logo, DRS는 보안영역에 대한 보증을 하지 못한다 signing을 사용해야 한다.

————–
출처: http://www.driveronline.org/bbs/view.asp?tb=drivetc&no=948

H/W 를 사용하는 DeviceDriver 라면 WHQL 인증을 받으셔야 합니다.
(WHQL 인증방법: http://www.sinwoong.co.kr/144)
이것은 지금 DTM 으로 변경되었지요
결국 Microsoft 가 원하는 방식으로 Code 가 작성되고 동작하는지 검증을 받은 후 Microsoft 에서 해당 드라이버가 안전하다는 인증을 해주는 것 입니다.
그러나 파일 필터와 같이 장치를 사용하지 않는 드라이버에 대해서는 DTM 을 통하지 않고 SelfSing 을 진행 합니다.
필터 드라이버와 같이 자주 Update 하는 드라이버를 DTM 인증을 통하면 너무 많은 시간이 걸리기 때문에 다른 길을 열어 준 것 입니다.
방법은 Test sing 한 것과 비슷 합니다.
먼저 Microsoft 의 whdc 사이트에서 cross sign 을 지원하는 cross certification 을 지원하는 회사에서 인증서를 하나 구입하신 후 아래 site 에서 cross sing 인증서를 다운 받으신 후 구입하신 인증서와 cross 인증서를 사용하여 인증하시면 됩니다.
이 게시판에 인증에 대한 이야기가 있으므로 검색해보세요
그리고 보다 자세한 내용은 아래 사이트를 참고하세요

————–

바이너리 호환(.sys)은, 64bit 시스템에서 사용하는 드라이버는 64bit 컴파일러로 만든 바이너리 파일 이여야 한다.
32bit 컴파일러에서 만든 바이너리 파일은 응용프로그램에서는 wow64를 통해서 허용 되지만, 드라이버 파일에서는 허용되지 않는다.
반드시 64bit 컴파일러로 컴파일해서 사용한다.

 

상위 커널 버전의로의 포팅

상위 커널 버전의 포팅시에 참고할 만한 내용을 적어본다.

1. 리눅스 커널 2.6.19 이후 버전부터는 include/linux/config.h를 더 이상 지원하지 않는다. 따라서, linux/config.h: No such file or directory 라는 오류 메시지가 나올 경우 리눅스 커널 디렉터리에서 다음과 같은 명령으로 config.h의 dummy 파일을 생성해준다.

1.% touch include/linux/config.h

2. chgrp: invalid group: ‘wheel’ 에러 발생시 아래와 같이 아래의 파일에 다음을 추가한다.

1.% vi /etc/group
2.wheel:x:10:root --> 10은 겹치는 않는 번호로 할것

추후 계속 업데이트.


1. Driver Signing

서명되지 않은 드라이버는 Windows에서 경고 메시지를 발생시키거나 Windows Vista 64Bit환경에서는 특정 옵션 설정 없이는 설치가 되지 않는다.

Microsoft에서는 WHQL인증을 통과했을 때, 서명이 된 파일(.CAT) 발급하는데 이 파일을 이용하여 설치하면,

Windows VISTA 64에서 어떠한 메시지없이 드라이버 로드가 가능하다.

일반 사용자가 장치 드라이버를 Windows Vista 64Bit에서 로드하기 위해서는 사실상 WHQL이 통과한 드라이버를 사용하도록 되어있다고 볼 수 있다.

장치 드라이버를 개발하여 설치하기 위해서는, 경고메시지나 로드조차 되지 않는 64비트 환경에서는 필수적으로 TEST Sign이 필요하다.\

테스트 용도로써 .CAT FILE을 만들 수 있는데, 이를 TEST SIGN이라고 한다.

WDK를 설치하게 되면, %WINDDK%\BIN\SelfSign 위치에 TEST SIGN이 가능한 유틸리티가 생성 된다.

TEST SIGN 없이도 설치가 원할 한 것이 있는데, 이는 Boot Start Driver이다.

Boot Start Driver인 경우, 예외적으로 서명이 된 .CAT FILE 없이도, 드라이버 파일(.sys)에 자신의 인증서를 서명하면 어떠한 장애 없이 설치 및 사용이 가능하다.

***의 드라이버는 Virtual NIC Driver, NDIS Filter Driver는 모두 Boot Start Driver가 아닌 장치 드라이버이며, 이는 WHQL 인증을 요구하며,

설치시 Windows 64Bit에서는 특정 설정없이는 로드가 되지 않는다.

2. Embedded Self-Sign 하기
Boot Start Driver인 경우, Embedded Self-Sign하여 드라이버를 로드 한다.

( 고객의 요청으로 인하여 Boot Start Driver를 WHQL인증을 받는다면, .INF 파일을 만들고( WHQL 필수 ), Embedded Self-Sign을 한 드라이버를 WHQL 인증을 받는다.

하지만 WHQL인증은 단지 사인된 인증서에 불과하며, WHQL 인증을 받건 사용하는데에 아무런 상관이 없다. )

1. Verisign Class 3인증서를 발급받으면, .spc와 .pvk를 발급 받게 된다.

2. pvk2pfx.exe 유틸리티를 사용하여 pfx 파일을 생성한다.
예) pvk2pfx -pvk pvk파일.pvk -pi pvk파일패스워드 -spc spc파일.spc -pfx 생성될pfx파일.pfx -po pfx용패스워드 -f

3. Certmgr 를 실행(System32 폴더 및 혹은 DDK 를 깔았다면 컴파일 모드에서 호출하면 매니져가 실행된다.) Certmgr에서 '가져오기'에서 .pfx 파일을 가져와서 '개인' 혹은 'Personal' store에 저장. (암호를 물어보니 pfx용패스워드 입력)

4. 그후 Certmgr /v /s my 로 확인 하면 보인다.

5. Cross Sign에 필요한 인증서를 마이크로 소프트

Verisign 인증를 사용하여 Cross Sign를 하면 된다.

인증서의 종류는 (http://www.microsoft.com/whdc/winlogo/drvsign/crosscert.mspx)에 나온 인증서로 가능한데, 일반적으로 Verisign인증서를 사용한다.

6. SelfSign 하기

signtool.exe sign /v /ac MSCV-VSClass3.cer /s my /n "등록명" /t http://timestamp.verisign.com/scripts/timestamp.dll 드라이버.sys

드라이버.sys 파일 내의 리소스 영역에 "등록명"으로 된 인증서로 사인하여 추가 되게 된다.

TEST Sign 하여 .cat file 만들기.
1. Makecert 유틸리티를 사용하여 TEST 인증서를 생성한다. (만약 Verisign과 같은 인증서를 갖고 있을 경우, 그 인증서에서 .cer 파일을 만들어 사용해도 상관 없다)

C:\WinDDK\7600.16385.0\bin\selfsign>makecert.exe -$ individual -r -pe -ss "Archi Certificate Store" -n CN="Archi Certificate" "Archi Certificate.cer"

인증서 저장소에 보관.
C:\WinDDK\7600.16385.0\bin\selfsign>certmgr.exe /add "Archi Certificate.cer" /s /r localMachine root

2. Makecat이나 Signability 유틸리티를 사용하여 .cat file을 만든다.

C:\WinDDK\6000\bin\SelfSign>signtool.exe sign /v /s "Archi Certificate Store" /n
"Archi Certificate" ***vnic.sys
3. 만들어진 .cat file에 TEST 인증서로 embedded sign을 한다.

TEST PC에 TEST Sign 한 드라이버 설치하기
1. TEST Sign에서 생성한 TEST .cer file을 Trusted Root Certification Authrorities Store에 저장한다.
Certmgr.exe /add 인증서.cer /s /r localMachine trustedpublisher

두번째로 CA로 부터 발급된 인증서를 Trusted root certification authorities certificate store에 넣는다.
certmgr /add /c /s /r localMachine CA /n "Root Agency" /s /r localMachine root

2. Boot 환경을 TEST 인증을 활성화 한다.
bcdedit.exe /set TESTSIGNING ON
reboot한다.

제약 조건중 inf file에 version selection에 DriverVer 날짜를 최근 날짜로 한다.
(Vista용으로 CAT을 생성 시도했을 때, 2002년으로 세팅되어있을 때는 생성되지 않았다. Win7은 2009년 이후로 해야한다.)

CatelogFile 은 값을 가지고 있어야한다.

inf file의 version section의 예
version
Signature = "$Windows NT$"
Class = NetService
ClassGUID =

Unknown macro: {4D36E974-E325-11CE-BFC1-08002BE10318}


Provider = %****%
DriverVer = 08/26/2008,4.4.1.0
CatalogFile = ***vpn.cat