다른 메모리에 접근할 일이 많은 보안 드라이버에서 자주 사용되는 함수 중에 하나가 MmIsAddressValid 함수다. MmIsAddressValid 함수는 접근하려는 메모리가 제대로 된 메모리인지 검사하는 코드다. 그런데 이 함수에서 말하는 valid의 의미는 생각보다 많이 좁다. 단순히 할당되서 접근할 수 있는 메모리를 의미하는 것이 아닌 실제로 물리 메모리에 존재하는 것들에 대해서만 valid 하다고 판단하기 때문이다. 즉, 페이지 아웃된 메모리는 접근할 수 있지만 MmIsAddressValid 함수는 FALSE를 리턴한다는 말이다.
그렇다면 페이지 아웃된 메모리까지 넓혀서 접근 가능한 커널 메모리를 체크하려면 어떤 방법이 있을까? 의외로 방법이 없는 것으로 추정(?!) 된다. ProbeForRead 같은 함수를 생각해 볼 수 있는데 해당 함수는 사용자 메모리에 대한 접근 여부를 체크하는 함수다. 커널 메모리를 넣으면 그냥 예외를 발생시키도록 설계돼 있다. 그.래.서. 결국 커널 영역 메모리의 할당 여부를 체크하려면 PDE, PTE를 직접 체크하는 수 밖에는 없다. 아마도…
직접 체크하는 방법을 구현하려면 PDE, PTE 따위의 구조외 윈도우에서 그것들을 어디에다 매핑시키는지 주소 공간 따위를 알아야 한다. 이게 또 처음 접해보면 다소 생소한 부분이다. 그때 참고하면 도움이 될만한 글이 있어서 소개해본다.