MmIsAddressValid와 PTE

@codemaru · September 15, 2014 · 2 min read

다른 메모리에 접근할 일이 많은 보안 드라이버에서 자주 사용되는 함수 중에 하나가 MmIsAddressValid 함수다. MmIsAddressValid 함수는 접근하려는 메모리가 제대로 된 메모리인지 검사하는 코드다. 그런데 이 함수에서 말하는 valid의 의미는 생각보다 많이 좁다. 단순히 할당되서 접근할 수 있는 메모리를 의미하는 것이 아닌 실제로 물리 메모리에 존재하는 것들에 대해서만 valid 하다고 판단하기 때문이다. 즉, 페이지 아웃된 메모리는 접근할 수 있지만 MmIsAddressValid 함수는 FALSE를 리턴한다는 말이다.

그렇다면 페이지 아웃된 메모리까지 넓혀서 접근 가능한 커널 메모리를 체크하려면 어떤 방법이 있을까? 의외로 방법이 없는 것으로 추정(?!) 된다. ProbeForRead 같은 함수를 생각해 볼 수 있는데 해당 함수는 사용자 메모리에 대한 접근 여부를 체크하는 함수다. 커널 메모리를 넣으면 그냥 예외를 발생시키도록 설계돼 있다. 그.래.서. 결국 커널 영역 메모리의 할당 여부를 체크하려면 PDE, PTE를 직접 체크하는 수 밖에는 없다. 아마도…

직접 체크하는 방법을 구현하려면 PDE, PTE 따위의 구조외 윈도우에서 그것들을 어디에다 매핑시키는지 주소 공간 따위를 알아야 한다. 이게 또 처음 접해보면 다소 생소한 부분이다. 그때 참고하면 도움이 될만한 글이 있어서 소개해본다.

PTE 이해하기 1편

PTE 이해하기 2편

PTE 이해하기 3편

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중