먼저 내 드라이버에서는 nt!ZwCreateFile 주소를 가져와 무언가 작업을 하는 부분이 있다. 이 작업이 실패를 하게되면 드라이버는 원하는 기능을 수행하지 못하게 된다.


내가 만들어놓은 드라이버가 동작 중 pool 헤더가 깨져 BSOD가 발생하는 현상이 간혹 발생하길래 verifier로 확인을 하기 위해 해당 기능을 켜고 pool 부분을 모니터링 하려했다. 하지만 드라이버가 기능 동작을 못하고 있는 것을 발견하고 확인을 해보니 위에서 nt!ZwCreateFile 주소를 가져오는 부분에서 잘못된 주소를 가져오고 있는 것을 확인했다.


mov     edx,dword ptr [My!_imp__ZwCreateFile (863ee110)] 863ee110={nt!VfZwCreateFile (83394ddb)}


모듈이 로드될 때 내 모듈의 import 테이블에 셋팅되는 주소 값이 nt!ZwCreateFile의 주소가 아닌 nt!VfZwCreateFile 주소가 셋팅되어 있음을 알 수 있다. 또한 내 모듈 내 import table을 확인해본 결과 ZwCreateFile 뿐만 아니라 



위 그림처럼 몇몇 함수들에는 앞에 Vf가 붙거나 Verifier라는 prefix가 붙어있는 것을 확인할 수 있었다.


그러면 저 함수는 어떠한 함수인지 VfZwCreateFile 내부를 살펴보았다.


내부적으로 원본 함수인 ZwCreateFile을 호출하지만 그 전에 함수이름만 보더라도 알 수 있듯이 각 인자들이 유효한지 검사하는 부분이 있다는 것을 알 수 있다.


결론은 verifier 기능을 켜면 커널에 로드되는 모든 모듈의 import 테이블에 있는 함수를 verifier 관련 함수로 Iat Hooking을 해버린다. PC Hunter로 확인해보면 다음과 같다.


일부만 스샷을 찍었는데 올라오는 모든 모듈들에 대해 verifier가 모니터링해야하는 함수들은 전부 Iat Hooking이 되어 있는 것을 확인할 수 있다.


음.. 딜레마에 빠졌다.

pool로 인한 BSOD 원인을 찾기위해 verifier를 사용했는데 verifier를 사용하면 모듈이 정상적으로 동작을 안하니.. ㅠㅠ

Posted by Ezbeat