전 항상 드라이버를 동적로딩만 해왔는데 이번에 키로거를 만들면서 정적로딩으로 구현을 해보았습니다.
근데 2가지 문제가 있었죠.
kbdclass Driver 가 생성한 Device가 올려져 있는 Device Stack 에 필터를 하기위해 먼저 kbdclass Drvier의 Driver Object를 구하는 코드를 넣었습니다. 그리고 정적로딩을 위해 CreateService함수 6번째 인자 값으로 SERVICE_BOOT_START값을 넣어주고 해당 Driver를 실행시켰습니다. 그 당시에는 잘 작동할지 몰라도 컴퓨터를 껐다 켰을 때 문제가 발생하는 것입니다.
이 화면에서 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services 하위 키로 있는 서비스들이 실행이 됩니다.
하지만 제 Driver가 kbdclass Driver보다 먼저 실행이 되게 되면 제 Driver에서는 kbdclass Driver의 Driver Object 구하는 것을 실패하게 되면서 BSOD가 발생하게 됩니다.
이 때 OS는 등록된 서비스들 중에 BSOD를 일으킨 놈의 레지스터 값을 제거시켜버립니다.
만약 제거시키지 않을 경우 OS는 영원히 부팅을 못할 것이니까요.
그래서 전 이 방법을 해결해 보려고 제 DriverEntry 내부에 KeDelayExecutionThread함수를 사용해 30초 정도 시간을 늦춰봤습니다. 하지만! 이 방법 또한 실패를 했습니다. 왜냐하면 위 부팅과정 중에서 서비스로 등록된 모든 서비스들이 정상 실행이 되야 부팅 성공을 하게 됩니다. 그리고 하나의 서비스가 정상 실행이 되기 전까진 그 이후 서비스들도 실행을 못하고 있죠.
( DriverEntry가 정상적으로 리턴해야 실행이 된 것 )
그렇기 때문에 KeDelayExecutionThread를 사용해 30초를 늦춘건 그냥 부팅 시간만 30초 늘렸을 뿐 똑같이 BSOD가 발생하게 됩니다. 그래서 해결한 방법이 System Thread를 사용해 해결을 했습니다...
주의할 점은 DriverEntry는 최대한 빨리 끝내도록 하고 특정 Driver Object를 얻어올 땐 SystemThread를 사용해 딜레이를 두고 얻어오는 방법을 사용하면 될 것 같습니다.
'My Study > Programming&Theory' 카테고리의 다른 글
병렬 프로그래밍 (1) | 2011.02.10 |
---|---|
내부적으로 ZwCreateFile 구현해서 사용하기 (0) | 2011.02.05 |
Filter Driver를 이용한 키로거 제작 (4) | 2011.01.14 |
전역적 필터 드라이버 (0) | 2011.01.12 |
Inline Hooking (2) | 2011.01.10 |